2013-08-15 18 views
6

Abbiamo raggiunto il muro in SQL Server 2008 sul numero massimo di attributi che un singolo nodo XML può avere prima che il parser XML si blocchi.Errore SQL Server 2008 - Analisi XML: l'analisi del documento richiedeva troppa memoria

L'errore che stiamo ricevendo è:

Msg 6303, Level 16, State 1, Line 1 
XML parsing: Document parsing required too much memory 

Che è un po 'fuorviante. Il problema si verifica quando si converte una stringa in un tipo di dati XML (o colonna di una tabella).

SELECT CONVERT(XML, '<DataNode><Data attr1="a" attr2="b" XXXXX /></DataNode>') 

Dove XXXXX è in realtà un altro 8191 attributi.

In totale, il nostro set di dati conteneva 10.066 attributi per iniziare. Quando riduciamo il numero di attributi a 8.192, funziona perfettamente. Tuttavia, 8.193 attributi si blocca.

Non sembra avere nulla di specifico a che fare con la dimensione dei dati (100 MB o 60 KB non importa - si ottiene lo stesso fail/successo in base al numero di attributo)

Quindi, è c'è qualcosa che può essere fatto con il server SQL per modificare questa limitazione?

La nostra applicazione C# non presenta questa limitazione, pertanto i documenti XML perfettamente validi in C# non possono essere archiviati nelle colonne di dati XML del server SQL.

Qualsiasi aiuto chiunque possa offrire sarebbe molto apprezzato. La struttura dei dati non può essere modificata a questo punto in quanto richiederebbe una riscrittura della funzionalità di elaborazione dei dati di un intero framework applicativo con centinaia di componenti.

PS: Ho già avvisato la gestione di quanto sia ridicola la situazione è quando un applicazione memorizza i dati come attributi di un singolo nodo, piuttosto che come un albero, ma questo è quello che ho da lavorare con :-(

modificare: abbiamo provato questo su SQL Server 2008 a 32 e 64 bit su un server con 2 GB di RAM e un server con 32 GB di RAM - tutte le versioni e gli ambienti hanno lo stesso problema

UPDATE:.

Ho un trie d questo in SQL Server 2012, e fallisce quando ci sono 8.193 attributi E la lunghezza della stringa è anche su una determinata dimensione (la lunghezza della stringa di test è 833K), ma funziona quando la stessa stringa di lunghezza ha solo 8.192 attributi.

Tuttavia ho una stringa molto più breve (193K) con 12.000 attributi e funziona in SQL Server 2012 e SQL Server 2008)

Così, sembra essere una combinazione del numero di attributi quando la stringa il cast è di una certa dimensione. Questo diventa più interessante!

Grazie per il feedback finora!

Aggiornamento 2:

Dopo ulteriori test con le stringhe più piccole (270K) ho ancora raggiunto il limite di attributo a 16.384 ... 16.385 attributi non riesce! Quindi, sta sicuramente accadendo in incrementi di 8K attributi, a seconda della combinazione di lunghezza della stringa !!

+1

Potrebbe tornare solo un varchar (max) per l'applicazione # C e lasciare che l'applicazione convertirlo in formato XML corretto? – Tim

+0

Sfortunatamente il problema non è con C#, stiamo cercando di inserire l'XML in una colonna XML nel server SQL e ottenere questo errore a causa del numero di attributi che sta tentando di gestire. C# non sembra avere questo limite di 8.192 attributi che l'analisi XML di SQL Server ha. – doublehelix

+0

Ah - ho frainteso. Scusa :( – Tim

risposta

2

8191 attributi suoni troppo. Se sembra che si stia tentando di memorizzare i dati effettivi negli attributi - apparentemente il parser di SQL Server ha una limitazione qui.

Si veda l'articolo qui: http://blogs.msdn.com/b/sqlprogrammability/archive/2006/05/23/605299.aspx?Redirected=true

Quando è necessario un tipo per la convalida, il validatore carichi sua definizione dai metadati e compila in un formato adatto per la convalida rapida. Per impedire a un tipo di utilizzare troppa memoria , SQL Server riduce la dimensione di un tipo compilato a un megabyte. SQL Server compila tutti i tipi ed esegue questo controllo quando lo schema viene importato per evitare l'accettazione di tipi che superano il limite.

Suggerirei di cambiare il modo di usare XML e di memorizzare le informazioni all'interno dell'elemento.

vedere http://www.ibm.com/developerworks/library/x-eleatt/index.html e http://www.w3schools.com/xml/xml_attributes.asp

+0

Hey @AlexTheDeveloper, grazie per il feedback. Abbiamo visto queste limitazioni in passato e conosciamo i limiti di profondità e non usiamo xsd in quanto abbiamo una struttura di dati dinamica per tipo di record. È sicuramente un brutto modo per archiviare i dati e, data l'opportunità che mi piacerebbe riscrivere interamente il tutto, tuttavia lo schema è qui per rimanere per ora poiché questo prodotto ha 7 anni e ha miliardi di record su dozzine di server in infrastruttura client. Sembra che stiamo abbandonando il tipo di dati XML interno e spostando invece la funzionalità XML/XPath sul livello C# ... grazie ancora! – doublehelix

Problemi correlati