L'applicazione creata e mantenuta dal mio gruppo di lavoro fa un uso molto pesante di dati XML salvati sul database, fino ad ora abbiamo sempre usato SQL2000 ma dalla prossima release manterremo solo la compatibilità con SQL 2005 e quindi finalmente diventa possibile usare qualcuna delle sue nuove feature.
Ho quindi scritto un piccolo client di test per testare il salvataggio e la lettura di 10000 record XML (con lunghezza variabile da 52 a 136588 byte ed una media di 3373) sui diversi tipi di campi che si possono usare su SQL 2005. Questi i risultati:
Campo di tipo NText: scrittura in 4.9 secondi, lettura 2.0
Campo di tipo NVarChar(MAX): scrittura in 3.6 secondi, lettura 2.1
Campo di tipo Xml: scrittura in 14.1 secondi, lettura 2.3
A questo punto ho provato a settare l'opzione "text in row" per la mia tabella in cui ci sono gli NText, rendendola quindi equivalente ad un NVarChar(MAX) come utilizzo fisico del disco
Campo di tipo NText con text in row abilitato: scrittura in 3.6 secondi, lettura 2.0
Quindi il carico necessario, lato SQL Server, per fare il parse di un XML sembra essere molto elevato e la gestione "fisica" dei dati su SQL server sembra impattare parecchio. Ho provato anche a fare un'ulteriore test in cui, invece di memorizzare XML memorizzavo uno stream compresso mediante la libreria di compressione, per cercare di minimizzare lo spazio ed il costo di scrittura (includendo anche i tempi di compressione/decompressione per avere dati comparabili):
Campo di tipo Image in cui scrivo XML compresso con GZip: scrittura 5.2 secondi, lettura 1.9
Campo di tipo Image in cui scrivo XML compresso con Deflate: scrittura 4.9 secondi, lettura 1.4
E' da notare che il campo XML non aveva schema associati dato che gli XML di partenza erano molto vari.