Suite

AddIndex_Management lève le nombre maximal de curseurs ouverts dépassé


Le script suivant est exécuté pour créer des index sur toutes les classes d'entités d'un jeu de données particulier :

import arcpy import os.path def listFcsInGDB() : pour fds dans arcpy.ListDatasets("FRED.GS*", "Feature") + ["] : pour fc dans arcpy.ListFeatureClasses(",", fds): yield os .path.join(arcpy.env.workspace, fds, fc) def listIndexNamesInFeature(f): return [i.name for i in arcpy.ListIndexes(f)] def listFieldNamesInFeature(f): return [i.name for i in arcpy.ListFields(f)] arcpy.env.workspace = "C:Users
morganAppDataRoamingESRIDesktop10.1ArcCatalogds08.sde" idx_stub = "IXGS_" attributs = [ "QASTATUS", " POINTUSAGE", #… plusieurs autres ici ] fc = listFcsInGDB() pour f dans fc : indexes = listIndexNamesInFeature(f) fieldList = listFieldNamesInFeature(f) pour a in attributs : si a not in fieldList : print a + " n'est pas dans " + f continue si aucun(a[:4] dans s pour s dans les index) : print a + " a déjà un index dans " + f continue arcpy.AddIndex_management(f, a, idx_stub + a) print a + " is now indexé en " + f

Après un certain temps de création réussie d'une centaine d'index, l'erreur suivante est renvoyée :

Traceback (appel le plus récent en dernier) : Fichier "E:PyScriptsAddIndexes.py", ligne 57, dans  arcpy.AddIndex_management(f, a, idx_stub + str(counter) + a) Fichier "C:Program Files (x86)ArcGISDesktop10.1arcpyarcpymanagement.py", ligne 5271, dans AddIndex raise e ExecuteError : ERREUR 999999 : Erreur lors de l'exécution de la fonction. Erreur SGBD sous-jacente [ORA-01000 : nombre maximal de curseurs ouverts dépassé] [FRED.GS_FC1]… Erreur SGBD sous-jacente [Erreur d'exécution de la procédure stockée sde.version_util.close_state::ORA-01000 : nombre maximal de curseurs ouverts dépassé] [SDE.DEFAULT][STATE_ID = 2561192] Type de colonne incorrect [ORA-01000 : nombre maximal de curseurs ouverts dépassés] Erreur de SGBD sous-jacente [ORA-01000 : nombre maximal de curseurs ouverts dépassés] Erreur de SGBD sous-jacente Erreur de SGBD sous-jacente Erreur de SGBD sous-jacente Erreur de SGBD sous-jacente Erreur de SGBD sous-jacente Erreur de SGBD sous-jacente Échec de l'exécution (AjouterIndex).

Il s'agit d'ArcMap 10.1 exécuté sur Oracle 11g SDE.

Exécuter la commande Oracleafficher le paramètre open_curs ;donne 2000 curseurs. Certes, ce script n'a pas besoin de 2000 curseurs. Il existe environ 35 classes d'entités et 15 champs à indexer.


On ne sait pas ce qui se passe réellement dans les coulisses. Peut-être que cette chose exécute une instruction distincte pour trouver les caractéristiques de chaque colonne de chaque table et oublie de fermer les curseurs correspondants, c'est-à-dire qu'elle fuit les curseurs.

Un test simple consiste à augmenter le nombre maximum de curseurs par session. Le mieux est de demander à votre DBA de le faire, car cela nécessite des droits DBA. Si vous utilisez votre propre parc Oracle, procédez comme suit :

$ sqlplus / as sysdba ALTER SYSTEM SET open_cursors = 3000 SCOPE=BOTH;

et relancez votre test.

L'augmentation du nombre n'a aucun impact sur l'utilisation de la ressource en soi. Chaque curseur ouvert consomme cependant des ressources.

Je considère que c'est un bogue pour un processus d'avoir besoin d'autant de curseurs ouverts ; il oublie très probablement de fermer les curseurs qu'il ouvre. Cela doit être corrigé : augmenter le nombre de curseurs autorisés n'est qu'un moyen d'éviter qu'une erreur ne soit générée.


Dans ma situation, le problème était l'ordre de déploiement des modifications.

Dans une étape précédente, le jeu de données contenant ces classes d'entités a été enregistré comme versionné. Ensuite, le 'arcpy.AddIndex_management' ci-dessus a été appelé.

Si des index sont ajoutés avant que en activant le versioning, toutes les classes d'entités sont indexées sans problème. Et bien plus vite aussi.


Voir la vidéo: SQL CREATE INDEX statement tutorial with MySql (Octobre 2021).