ORA-30926: incapable d'obtenir un ensemble stable de lignes dans les tables source

StackOverflow https://stackoverflow.com/questions/2337271

  •  22-09-2019
  •  | 
  •  

Question

Je reçois

  

ORA-30926: incapable d'obtenir un ensemble stable de lignes dans les tables source

dans la requête suivante:

  MERGE INTO table_1 a
      USING 
      (SELECT a.ROWID row_id, 'Y'
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

Je l'ai couru table_1 il a des données et aussi j'ai couru la requête interne (src) qui a également des données.

Pourquoi cette erreur et comment se peut-il être résolu?

Était-ce utile?

La solution

Ceci est habituellement causé par des doublons dans la requête spécifiée à la clause UTILISATION. Cela signifie probablement que TABLE_A est une table parent et même ROWID est retourné plusieurs fois.

Vous pouvez résoudre rapidement le problème en utilisant un DISTINCT dans votre requête (en fait, si « Y » est une valeur constante que vous ne même pas besoin de le mettre dans la requête).

Si l'on suppose votre requête est correcte (ne sais pas vos tables), vous pouvez faire quelque chose comme ceci:

  MERGE INTO table_1 a
      USING 
      (SELECT distinct ta.ROWID row_id
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

Autres conseils

Vous êtes probablement essayer de mettre à jour la même ligne de la table cible à plusieurs reprises. Je viens rencontré le même problème dans une déclaration de fusion, j'ai développé. Assurez-vous que votre mise à jour ne touche pas le même enregistrement plus d'une fois dans l'exécution de la fusion.

  

Comment faire pour résoudre ORA-30926 erreurs? (Doc ID 471956,1)

1) Identifier la déclaration de défaut

  

modifier les événements ensemble de la session de 30926 nom trace le niveau de errorstack 3 ';

ou

  

modifier les événements ensemble du système « nom de trace 30926 errorstack off »;

et regarder des fichiers .trc dans udump quand il se produit.

2) Après avoir trouvé l'instruction SQL, vérifiez si elle est correcte (peut-être l'aide d'expliquer le plan ou tkprof pour vérifier le plan d'exécution de la requête) et analyser ou calculer les statistiques sur les tables concernées si cela n'a pas été fait récemment. La reconstruction (ou de laisser tomber / index) peuvent recréer des aider.

3.1) L'instruction SQL une fusion? évaluer les données renvoyées par la clause USING pour assurer qu'il n'y a pas de valeurs en double dans la jointure. Modifiez l'instruction de fusion pour inclure une clause déterministe où

3.2) Est-ce une instruction UPDATE via une vue? Si oui, essayez peuplant le résultat de vue sur une table et essayer de mettre à jour la table directement.

3.3) Y at-il un déclencheur sur la table? Essayez de le désactiver pour voir si elle échoue encore.

3.4) La déclaration contient une vue non-fusionnables dans un 'IN-sous-requête'? Cela peut entraîner des lignes en double d'être renvoyé si la requête a une clause « FOR UPDATE ». Voir Bug 2681037

3.5) Le tableau ont des colonnes inutilisées? Échappez peut empêcher l'erreur.

4) Si la modification du SQL ne guérit pas l'erreur, la question peut être à la table, surtout s'il y a des lignes enchaînées. 4.1) Exécutez l'instruction « ANALYSER TABLE VALIDER STRUCTURE CASCADE » sur toutes les tables utilisées dans le SQL pour voir s'il y a des corruptions dans la table ou ses index. 4.2) Vérifier et éliminer, tout RANGS ou migrés CHAINED sur la table. Il y a des façons de minimiser cela, comme le réglage correct de PCTFREE. Utilisez Remarque 122020,1 - Ligne Enchaînement et migration 4.3) Si la table est en outre Index organisé, voir: Remarque 102932,1 - Surveillance des lignes chaînées sur IOT

Had aujourd'hui erreur sur un 12c et aucune des réponses existantes ajustement (pas de doublons, aucune expression non déterministe dans la clause WHERE). Mon cas était lié à cette autre cause possible de l'erreur, selon le texte du message d'Oracle (souligné ci-dessous):

  

ORA-30926: incapable d'obtenir un ensemble stable de lignes dans les tables source
  Cause:. Un ensemble stable de lignes ne peut pas être obtenu en raison d'une grande activité DML ou une clause where non déterministe

La fusion faisait partie d'un lot plus important, et a été exécuté sur une base de données en temps réel avec de nombreux utilisateurs simultanés. Il n'y avait pas besoin de changer la déclaration. Je viens de commettre la transaction avant la fusion, puis couru la fusion séparément, et engage à nouveau. Donc, la solution a été trouvée dans l'action suggérée du message:

  

Action:. Retirez tout non-déterministe où les clauses et réémettre la DML

{AVERTISSEMENT}: Ne touchez pas la structure de la base de données de SharePoint, il invalidera votre garantie.

Ceci est une variable de conception de stockage BLOB. Vous le verrez augmenter lorsque les exigences de stockage augmentent.

Une base de données peut seulement contenir autant de données afin de la compenser est partitionnée. Cette valeur représente la partition utilisée. Cela est allé plus loin en stockage déchiqueté qui représente désormais un seul fichier mais en morceaux de Deltas.

Comment le stockage déchiqueté fonctionne vraiment dans SP2013

Ainsi, comme certains d'entre vous savent, je suis sur chacun des livres de mspress it Pro, qui sera publié sur SharePoint 2013. Dans l'un des livres, je parle de l'architecture et de la manière dont les bases de données de contenu ont changé. L'un de ces changements est le stockage déchiqueté. Oui, j'ai lu la publication de Bill Baer ici et il en a une seconde ici, et je suis d'accord avec tout ce qu'il dit (même s'il n'utilise pas vraiment la terminologie de l'architecture interne dans plusieurs cas), à l'exception d'un point que j'apprécie à la fin. J'ai aussi lu le blog de Dan Holme ici. Il vient à peu près aux mêmes conclusions que je fais. Il l'a même cloué avec la taille maximale de Chuck 64K comme par défaut (mais les fichiers ne sont pas max à la limite de 64k, ils se retrouvent quelque part en dessous de celui-ci).

Donc, même après avoir lu tout ce TechNet et SPC12 Mumbo Jumbo. Je voulais vraiment voir ce genre de choses à travailler pour moi-même et que cela nécessitait creuser profondément pour apprendre comment cela fonctionne vraiment compte tenu de tous les blogs incorrects. Dans cette exploration des assemblées, des classes, des tables et des procédures stockées, j'ai eu quelques moments Ah Ha. Quelques faits:

Le stockage déchiqueté est axé sur le document, et à partir d'un point de vue de stockage, il suffit de précieux avec les versions activées. Il ne s'agit pas de la base de données de contenu ou de la ferme axée. Qu'est-ce que ça veut dire? Cela signifie que lorsqu'un document est "déchiqueté" (SphostBlob), les lambeaux sont spécifiques au document et il n'y a pas de cassette de base larges qui se fait de la déchiquetée. Qu'est-ce que ça veut dire? Cela signifie que si vous téléchargez le même fichier dans deux endroits différents, les mêmes déchiquets seront créés et aucune optimisation n'a lieu.

Cela signifie que SharePoint fait un "meilleur" effort de gestion des blobs. Ce n'est pas ce que j'appellerais "super" ou "stellaire" comme la solution que Storimple construit. Vous allez toujours avoir besoin d'une solution RBS qui regroupera les nouveaux «petits blobs déchiquetés» de manière détachée. Mais soyez très prudent avec cela, alors que Jeremy souligne ici, la performance RBS a frappé pour les petits lambeaux en vaut la peine! À ce stade, je dirais que l'utilisation d'un stockage déchiqueté est plus d'une performance touchée par rapport à la valeur, car vous avez maintenant une table qui aura n'importe où de 10 à 4500 lambeaux pour chaque fichier. Multipliez ce temps, mais de nombreux fichiers que vous avez ... et c'est un très grand nombre de lignes dans une seule table. Vous devez également prendre en compte le cycle de la CPU qu'il prend en ajout les lambeaux pour être renvoyés au client (cela ne se fait pas par COALAIS sur le serveur SQL). Tous pour la réduction de votre stockage par un montant marginal?

Les travaux de stockage déchiquetés en créant ce que j'appelle une "carte de flux". Cette carte est stockée dans la table "DocstOstreams". La première fois que vous téléchargez un fichier, il est déchiqueté dans les petites parties (sauf qu'il y avait quelques cas où il ne déchique pas le document et simplement mettre un blob unique). Lorsque vous téléchargez un deuxième fichier mis à jour, le WFE doit interroger pour deux lambeaux non basés sur des fichiers (qui ajoutent environ 10k ou plus dans chaque fichier). Ces lambeaux de configuration ont des informations sur lesquelles le WFE utilisera pour déterminer ce que les déchiquetés doivent être enregistrés dans la base de données. Dans le cadre de cela, une nouvelle carte de flux est construite qui a utilisé tous les vieux lambeaux qui n'ont pas changé et les nouveaux déchiquetés. Tous les lambeaux sont dans un ordre spécifique appelé BSN. À partir du BSN le plus bas au BSN le plus élevé pour une "carte de flux". Ces déchiquets sont ensuite remis ensemble (moins les déchiquets de configuration) pour recréer le fichier, puis transmis au client appelant. Quelques classes importantes à noter dans le modèle d'objet:

SPFILESTREMManager - responsable du calcul des flux (ComputreMstowrite)

SPFileStreamStore - enregistre les sphostBlobs à la base de données (putblobs) et obtient des blobs à partir de la base de données (getblobs *)

Lorsque vous utilisez des clients de bureau complets, les fichiers complets sont envoyés à SharePoint (uniquement si le premier appel à Cellstorage.svc échoue ... Continuez à lire ci-dessous). Ceci est fait en faisant un HTTP mis à l'URL du document. SharePoint via ses classes de cobalt (Cobaltstream qui provient des classes de cobalt de base) est responsable de la déchiquetage et des comparaisons. Je n'ai pas vu le client de l'Office (2010 ou 2013), faire tout type d'enregistrement intelligent des documents basé sur PackagesParts dans des fichiers Office (à nouveau fonctionnant si le premier appel réussit). J'ai confirmé que les lambeaux sont générés, peu importe le type de fichier. Cela me fait penser que la déchiquetage est un peu aléatoire (jusqu'à la limite de 64k par défaut pour un déchiquetage) et ne tout attrapera pas parfaitement (je

e moitié de la modification d'un déchiqueté et de la moitié de la modification d'un autre déchiquetage plutôt que d'un composant déchiqueté). J'ai essayé de voir si je pouvais trouver comment le déchiquetage travaillait, mais les choses deviennent vraiment folles lorsque vous entrez dans les cours de cobalt car ils sont trop nombreux classes abstraites posées.

mise à jour: voir ce blog post pour mes expériences plus récentes avec la modification avec les clients de bureau et la mise à jour intelligente (cela fonctionne) ...

retour à l'un des points ci-dessus. Je n'ai pas pu obtenir les clients de l'Office (2010 ni 2013) pour effectuer tout type de mise à jour intelligente, comme mentionné dans la poste de Bill (avec Word et PowerPoint avec une construction de client particulière). Dans d'autres quartiers, je voulais seulement envoyer les changements que j'avais apportés à SharePoint. Je n'avais jamais vraiment testé cela avant et j'ai hâte de le voir en action, mais hélas, cela ne semble pas le faire du tout. Je suppose que dans un mode d'édition multi-utilisateurs (OWA?) Voulez-vous voir ce type de fonctionnalité utilisée (mise à jour: et cette hypothèse était correcte! Voir ci-dessous!). Juste comme un fyi, voici ce que j'ai fait avec des appels Office et SharePoint OM:

Utilisé notre Fiddler ami génial pour surveiller le trafic Téléchargé un fichier PowerPoint sur SharePoint Ouvert le point PowerPoint dans le client PowerPoint Supprimé une diapositive du point PowerPoint, l'a enregistré Office envoie l'intégralité du fichier à SharePoint (il est visible dans l'en-tête de taille de contenu de la demande de vente que c'est le cas) SharePoint fait le déchiquetage et crée de nouveaux lambeaux Placez la glissière dans (Ctrl-Z), enregistrez le fichier, encore une fois l'ensemble du fichier est envoyé. Une nouvelle version et des lambeaux similaires sont créés, mais certains sont conservés à partir de la première mise à jour de téléchargement \ secondes

Si quelqu'un sait comment faire fonctionner de manière fiable avec des clients de bureau et SharePoint OM, s'il vous plaît faites le moi savoir. Sinon, je vais devoir dire que nous obtenons des changements de «delta» de cet ensemble de l'Office Client NON SENS et il n'y a pas d'optimisation du réseau entre le client de bureau et le WFE. Dans ce scénario, le stockage déchiqueté nous permet de gagner un peu quelques octets ici et là-bas (si le Versioning est allumé), ce qui réduit le nombre d'écritures, mais au coût de plus "lit" et de la CPU pour reconstruire les fichiers.

mise à jour: applications Web de bureau et stockage déchiqueté - c'est ici que vous verrez l'optimisation des câbles entre le client (OWA) et la WFE. Ça marche comme ça. Lorsqu'une demande de fichier est fabriquée à partir de SharePoint, OWA demandera à la WFE de lui donner le fichier. Le fichier sera construit par la WFE des déchiquets. Lorsque deux utilisateurs ouvrent le fichier pour l'édition, un nouveau type de conteneur de déchiquetage est créé appelé "partition". Cette partition contient des lambeaux que chaque utilisateur travaille. C'est là que les lambeaux se sont brisés sur leurs petits morceaux XML. Comme chaque partie d'un document est modifiée, de nouvelles partitions sont créées. Quand quelqu'un veut voir quelle autre personne a fait, ils demanderont cette nouvelle partition et elle (et seulement elle) sera envoyée au client. Toute modification apportée est également envoyée seule et que tout le fichier n'est pas.

Alors, d'où cela nous a mis? Voici la réalité et les détails correct sur le stockage déchiqueté (car chaque blog sur le stockage déchiqueté est faux sur Internet). Vous devez tester un stockage déchiqueté avec 3 choses à l'esprit pour voir si vous obtenez vraiment des avantages (que de stockage ou de réseau).

avec Versioning activé (vous gagnez la prestation de stockage, sans cela, vous ne bénéficiez d'aucun avantage de stockage) Avec Office Web Apps (vous gagnez le client à l'optimisation du réseau WFE et à l'effet "Partitionnement" dans la modification de l'utilisateur mutil) Lorsque vous utilisez des clients Office ou SharePoint, quelle que soit votre optimisation de réseau SQL Server uniquement lors de l'optimisation du réseau SQL Server uniquement lors de la rédaction d'un document (toutefois, il n'ya pas de prestation de câbles entre les clients Office et SharePoint et le WFE lorsque le premier appel échoue à Cellstorage. SVC)

http://blogs.archittingConnectedSystems.com/blogs/cjg/archive/2012/12/21/HOW-Rredsed-Storage-Really-Works-in-sp2013.cáaspx

Stockage déchiqueté.

Une autre clarification à l'utilisation de DISTINCT pour résoudre l'erreur ORA-30926 dans le cas général:

Vous devez vous assurer que l'ensemble des données spécifiées par la clause USING () n'a pas de valeur en double des colonnes de jointure , à savoir les colonnes dans la clause ON () .

Dans l'exemple de l'OP où la clause USING sélectionne uniquement une clé, il suffisait d'ajouter à la clause DISTINCT UTILISATION. Toutefois, dans le cas général, la clause peut choisir une UTILISATION combinaison de colonnes clés pour correspondre à et attribuer des colonnes à utiliser dans la clause UPDATE ... SET. Par conséquent, dans le cas général, l'ajout DISTINCT à la clause USING va tout de même différentes lignes de mise à jour pour les mêmes touches, dans ce cas, vous obtiendrez toujours l'erreur ORA-30926.

Ceci est une élaboration de la réponse de DCookie et le point 3.1 dans la réponse de Tagar, qui, de mon expérience peut ne pas être immédiatement évident.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top