ORA-30926: impossibile ottenere un insieme stabile di righe nelle tabelle di origine

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

  •  22-09-2019
  •  | 
  •  

Domanda

Io sono sempre

  

ORA-30926: incapace di ottenere un insieme stabile di righe nelle tabelle di origine

nella query seguente:

  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';

Ho ho fatto funzionare table_1 ha dati e anche io ho fatto funzionare la domanda interna (src) che ha anche i dati.

Perché questo errore venire e come può essere risolto?

È stato utile?

Soluzione

Questo è di solito causata da duplicati nella query specificata in Uso clausola. Questo probabilmente significa che TABLE_A è una tabella padre e la stessa ROWID viene restituito più volte.

Si potrebbe risolvere rapidamente il problema utilizzando un DISTINCT nella query (infatti, se 'Y' è un valore costante che non hanno nemmeno bisogno di mettere nella query).

Supponendo la query è corretta (non so le tabelle) si potrebbe fare qualcosa di simile:

  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';

Altri suggerimenti

Probabilmente stai cercando di aggiornare la stessa riga della tabella di destinazione più volte. Ho appena incontrato lo stesso problema in un comunicato merge ho sviluppato. Assicurati che il tuo aggiornamento non tocchi lo stesso record più di una volta in esecuzione della fusione.

  

Come risolvere ORA-30926 errori? (Doc ID 471.956,1)

1) Identificare la dichiarazione fallimento

  

alterare ‘30926 traccia livello nome errorstack 3’ per la sessione del eventi;

o

  

alter sistema di set eventi ‘Nome 30926 traccia errorstack off’;

e guardare per i file .TRC in udump quando si verifica.

2) Dopo aver trovato l'istruzione SQL, controllare se è corretto (magari utilizzando spiegare piano o TKPROF per controllare il piano di esecuzione di query) e analizzare o calcolare le statistiche sui tavoli in questione se questo non è stato recentemente fatto. La ricostruzione (o far cadere / Ricreare) indici possono aiutare anche.

3.1) è l'istruzione SQL un'unione? valutare i dati restituiti dalla clausola USING per garantire che non vi siano valori duplicati nel join. Modificare l'istruzione merge per includere una clausola in cui deterministica

3.2) Si tratta di un'istruzione UPDATE tramite una vista? In caso affermativo, provare popolare il risultato visualizzazione in una tabella e provare ad aggiornare direttamente alla tabella.

3.3) C'è un trigger sul tavolo? Provare a disabilitarlo per vedere se il problema persiste.

3.4) Se la dichiarazione contiene una visione non unificabili in un 'IN-sottoquery'? Ciò può portare a righe duplicate di essere restituito se la query ha una clausola "FOR UPDATE". Vedere Bug 2681037

3.5) Se la tabella ha le colonne inutilizzate? Una caduta può evitare l'errore.

4) Se la modifica del SQL non cura l'errore, il problema potrebbe essere con la tavola, soprattutto se ci sono le righe concatenate. 4.1) Eseguire il ‘ANALYZE TABLE CONVALIDA struttura a cascata’ dichiarazione su tutte le tabelle utilizzate in SQL per vedere se ci sono eventuali corruzioni nella tabella o gli indici. 4.2) Controllare, ed eliminare, le righe incatenato o migrate sul tavolo. Ci sono modi per ridurre al minimo questo, come ad esempio l'impostazione corretta di PCTFREE. Utilizzare Nota 122.020,1 - Row Chaining e migrazione 4.3) Se la tabella è inoltre indice organizzata, vedi: Nota 102.932,1 - Monitoraggio Righe concatenate su IOT

ha avuto l'errore di oggi su un 12c e nessuna delle risposte esistenti in forma (non duplicati, né espressioni non deterministici nella clausola WHERE). Il mio caso è stata legata a quella altra possibile causa di errore, secondo il testo del messaggio di Oracle (enfasi sottostante):

  

ORA-30926: incapace di ottenere un insieme stabile di righe nelle tabelle di origine
  Causa:. Un insieme stabile di righe non poteva essere ottenuto a causa della grande attività DML o un non-deterministico clausola WHERE

La fusione era parte di un lotto più grande, ed è stato eseguito su un database dal vivo con molti utenti simultanei. Non c'era alcun bisogno di modificare l'istruzione. Ho appena commesso l'operazione prima della fusione, poi corse l'unione separatamente e commesso di nuovo. Quindi la soluzione è stata trovata in azione suggerita del messaggio:

  

Azione:. Rimuovere eventuali non deterministico in cui le clausole e riemettere il DML

{Avvertenza}: Non toccare la struttura del database di SharePoint, invaliderà la garanzia.

Questa è una variabile di progettazione di archiviazione BLOB. Lo vedrete aumenterà mentre aumentano i requisiti di archiviazione.

Un database può contenere solo tanti dati in modo da compensare è partizionato. Questo valore rappresenta la partizione in uso. Questo è andato oltre a stoccaggio tagliuzzato che ora rappresenta un singolo file ma in blocchi di deltas.

Come la memoria tagliuzzata funziona davvero in SP2013

Così come alcuni di voi sanno, sono su ciascuno dei libri MSpress IT Pro che verranno rilasciati su SharePoint 2013. In uno dei libri, sto parlando dell'architettura e del modo in cui i database dei contenuti sono cambiati. Uno di questi cambiamenti è stoccaggio tagliuzzato. Sì, ho letto il post di Bill Baer qui e lui ha un secondo qui, e sono d'accordo con tutto ciò che dice (anche se non usa davvero la terminologia dell'architettura interna in diversi casi), ad eccezione di un punto che porto alla fine. Ho anche letto il blog di Dan Holme qui. Si avvicina molto alle stesse conclusioni che faccio. Si è persino inchiodato con la dimensione del mandrino max 64k come predefinita (ma i file non sono max al limite 64K, finiscono da qualche parte sotto di esso).

Così, anche dopo aver letto tutto questo TechNet e SPC12 Mumbo Jumbo. Volevo davvero vedere questa roba che lavora per me stesso e che ha richiesto di scavare in profondità per imparare come funziona davvero dati tutti i blog che non sono corretti. In tali esplorazione delle assemblee, delle classi, dei tavoli e delle procedure immagazzinate che ho avuto alcuni momenti ah ah. Alcuni fatti:

Lo stoccaggio triturato è focalizzato dal documento e da un punto di vista dello stoccaggio, prezioso solo con il versioning attivato. Non è il database dei contenuti o la fattoria focalizzata. Che cosa significa? Significa che quando un documento è "triturato" (sphostblob), i brandelli sono specifici per il documento e non ci sono ampi hash del database che è fatto del brandello. Cosa significa questo? Significa che se carichi lo stesso file in due luoghi diversi, verranno creati gli stessi brandelli e nessuna ottimizzazione avviene.

Ciò significa che SharePoint fa uno sforzo "migliore" di gestire Blobs. Non è quello che chiamerei "grande" o "stellare" come la soluzione che ha costruito Storsimple. Hai ancora bisogno di una soluzione RBS che aggrega il nuovo "piccolo blob tagliuzzato" in una moda de-duplerante. Ma stai molto attento con questo, mentre Jeremy sottolinea qui, il successo della performance della RBS per piccoli brandelli non ne vale la pena! A questo punto, direi che usare lo stoccaggio tagliuzzato è più di un successo di un successo di quanto valga la pena perché ora hai una tabella che avrà ovunque da 10-4500 brandelli per ogni file. Moltiplicare che momenti comunque molti file hai ... e questo è un numero molto elevato di righe in un singolo tavolo. È inoltre necessario tenere conto del ciclo della CPU, si prende in considerazione i brandelli insieme per essere inviati al client (questo non viene eseguito da Coalese sul server SQL). Tutto per il gusto di riduzione del tuo spazio di archiviazione da una quantità marginale?

I lavori di stoccaggio tagliuzzati creando ciò che sto chiamando una "mappa del flusso". Questa mappa è memorizzata nella tabella "Docsostreams". La prima volta che carichi un file è triturato nelle parti più piccole (tranne che c'erano alcuni casi in cui non toglie il documento e inserisci un solo blob). Quando carichi un secondo file aggiornato, il WFE si interroga per due brandelli basati su file (che aggiungono circa 10K o più a ciascun file). Questi brandelli di configurazione hanno scagliato informazioni che il WFE utilizzerà per determinare quali brandelli devono essere salvati nel database. Come parte di ciò, è stata costruita una nuova mappa in streaming che utilizzava qualsiasi vecchio brandello che non è cambiato e i nuovi brandelli. Tutti i brandelli sono in un ordine specifico chiamato BSN. A partire dal BSN più basso al BSN più alto per una "mappa del flusso". Questi brandelli vengono quindi rimessi insieme (meno le brandelli della configurazione) per ricreare il file e quindi ritornando al client di chiamata Alcune classi importanti da notare nel modello oggetto:

SpFileStreamManager - Responsabile per il calcolo dei flussi (ComputeStreamstowrite)

SpFileStreamstore - Salva il backflobs Torna al database (Putblobs) e ottiene BLOB dal database (GetBlobs *)

Quando si utilizzano i client di Office completi, i file completi vengono inviati a SharePoint (solo se la prima chiamata a cellstorage.svc non riesce ... continua a leggere sotto). Questo è fatto facendo un http messo all'URL del documento. SharePoint tramite le sue classi di cobalto (CobaltStream che deriva dalle classi Core Cobalt) è responsabile di fare il triturazione e i confronti effettivi. Non ho visto l'Office Client (2010 o 2013), effettuare qualsiasi tipo di risparmio intelligente di documenti in base ai pacchettiParti nei file di Office (di nuovo questo funziona se la prima chiamata ha successo). Ho confermato che i brandelli vengono generati, non importa quale sia il tipo di file. Questo mi fa pensare che la triturazione sia un po 'casuale (fino al limite default 64k per un brandello) e non cattura tutto perfettamente (io

e metà del cambiamento in un brandello e metà del cambiamento in un altro brandello anziché un componente tagliuzzato). Ho provato a vedere se potessi capire come funzionava il triturazione, ma le cose diventano davvero pazze quando entri nelle lezioni di cobalto perché le loro sono troppe classi astratte che si trovano in giro.

Aggiornamento: vedere questo post sul blog per le mie esperienze più recenti con la modifica con i clienti di Office e l'aggiornamento intelligente (funziona) ...

Torna a uno dei punti precedenti. Non sono stato in grado di ottenere i clienti dell'ufficio (2010 o 2013) per eseguire qualsiasi tipo di aggiornamento intelligente come menzionato nel post di Bill (con Word e PowerPoint con una determinata costruzione del cliente). In altri reparti, volevo solo inviare i cambiamenti che avevo fatto a SharePoint. Non avevo mai veramente testato questo prima e non vedevo l'ora di vederlo in azione, ma ahimè, non sembra farlo affatto. Immagino solo in una modalità di modifica multiutente (OWA?) Verrà visualizzato questo tipo di funzionalità utilizzata (aggiornamento: e questa ipotesi è stata corretta! Vedi sotto!). Proprio come un fyi, ecco cosa ho fatto con Office e SharePoint OM chiama:

ha usato il nostro fantastico amico Fiddler per monitorare il traffico Caricato un file PowerPoint in SharePoint Aperto il PowerPoint nel client PowerPoint Rimosso una diapositiva dal PowerPoint, salvarlo Office invia l'intero file a SharePoint (è visibile nell'intestazione della dimensione del contenuto della richiesta Put che è il caso) SharePoint fa il triturazione e crea nuovi brandelli Metti indietro la diapositiva (Ctrl-Z), salva il file, di nuovo l'intero file viene inviato Viene creata una nuova versione e un brandelli simili, ma alcuni vengono mantenuti dal primo upload \ Secondo aggiornamento

Se qualcuno sa come funziona in modo affidabile con gli Office Clients e SharePoint Om, fammi sapere. Altrimenti, dovrò dire che stiamo prendendo affidamento su quest'intero "delta" modifiche dal client di Office non hanno senso e non vi è alcuna ottimizzazione della rete in corso tra client office e WFE. In questo scenario, lo stoccaggio tagliuzzato è davvero solo salvato alcuni byte qui e lì (se il versioning è acceso) che riduce il numero di scritture, ma al costo di più "read" e della CPU per ricostruire i file. .

Aggiornamento: app per Office Web e stoccaggio tagliuzzato - Qui è dove vedrai l'ottimizzazione del filo tra il cliente (OWA) e il WFE. Funziona in questo modo. Quando una richiesta di un file è realizzata da SharePoint, OWA chiederà al WFE di dargli il file. Il file sarà costruito dal WFE dai brandelli. Quando due utenti aprono il file per la modifica, viene creato un nuovo tipo di contenitore di brandello chiamato "partizione". Questa partizione contiene brandelli su cui ogni utente sta funzionando. Qui è dove i brandelli vengono suddivisi ai loro piccoli pezzi XML. Poiché ogni parte di un documento viene modificata, vengono create nuove partizioni. Quando qualcuno vuole vedere cosa ha fatto un'altra persona, richiederà questa nuova partizione e (e solo essa) verrà inviata al cliente. Anche eventuali modifiche apportate vengono inviate singolarmente e l'intero file non è.

Allora, dove ci ha messo? Ecco la realtà e i dettagli corretti sullo stoccaggio tagliuzzato (come ogni blog su stoccaggio tagliuzzato è sbagliato su Internet). Devi testare lo stoccaggio tagliuzzato con 3 cose in mente per vedere se ottieni veramente qualche beneficio (se si basava subito o sulla rete).

con il versioning attivato (ottieni il beneficio dello storage, senza di esso, non ottieni alcun beneficio di archiviazione) Con Office Web Apps (ottieni il client all'ottimizzazione della rete WFE e all'effetto "Partitioning" in Modifica utente Mutil-User) Quando si utilizzano i client di Office o SharePoint, indipendentemente da cosa, si ottiene un WFE all'ottimizzazione della rete di SQL Server solo quando si scrive un documento indietro (tuttavia non è presente un vantaggio tra i client di ufficio e SharePoint e il WFE quando la prima chiamata non riesce a ciarestare. SVC)

http://blogs.architectingconnectedsystems.com/blogs/cjg/archive/2012/12/21/How-Reded-Storage-Really-Works-in-SP2013.aspx

Stoccaggio tagliuzzato.

Un ulteriore chiarimento per l'utilizzo del DISTINCT per risolvere l'errore ORA-30926 nel caso generale:

È necessario assicurarsi che l'insieme di dati specificati dalla clausola UTILIZZO () non ha valori duplicati delle colonne partecipare , vale a dire i colonne della ON () clausola .

Nell'esempio di OP dove la clausola USING seleziona solo una chiave, era sufficiente aggiungere DISTINCT alla clausola USING. Tuttavia, nel caso generale la clausola USING può scegliere una combinazione di colonne chiave per abbinare su e attribuire le colonne da utilizzare nella clausola UPDATE ... SET. Pertanto nel caso generale, l'aggiunta di DISTINCT alla clausola UTILIZZO consentirà ancora diverse file di aggiornamento per gli stessi tasti, nel qual caso si continua a ottenere l'errore ORA-30926.

Questa è un'elaborazione della risposta di DCookie e punto 3.1 in risposta di Tagar, che dalla mia esperienza può non essere immediatamente evidente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top