2010-11-09 1 views
4

C'est fou, mais la performance de la requête est d'environ 50% pire après avoir ajouté un index XML primaire à mon champ xml.SQL Server 2008 - Pourquoi la performance est-elle FORTE avec l'index xml?

Voici ce que je fais.

  • I ont une table contenant un champ XML ActivityStepLog (contient logData, XML)

  • I générer des données d'échantillon à insérer dans ce tableau en exécutant ce qui suit

    INSERT INTO dbo.ActivityStepLog (
    LogGUID
    , LogContextID
    , LogTypeID
    , LogSourceName
    , LogContent
    , LogDate
    , CreateDate
    , CreatedBy
    )
    sélectionner
    LogGUID = newid()
    , LogContextID = newid()
    , LogTypeID = 2
    , LogSourceName = « test test test '
    , LogContent = (SELECT haut 1 * FROM ## SampleData SampleData1 où DecisionLogID = SampleData.DecisionLogID POUR XML AUTO, ELEMENTS, ROOT (' BusinessRule '))
    , LogDate = CURRENT_TIMESTAMP
    , CreateDate = current_timestamp
    , CreatedBy = 'test créer par'
    de ## SampleData SampleData

SampleData a 100.000 lignes, je l'exécuter dans une boucle 5 fois finissent donc avec 500 000 lignes

  • Le champ LogContent va finir par avoir des données telles que les suivantes:

    -2147483643 0569281A-D1A3-49E3-9E68-BCAC62E2C1C3 -2147483495 2009-05-18T11: 47: 00 aucun

(désolé, je ne sais pas si cela sera correctement formaté - c'est juste un petit ensemble d'éléments).

Et puis je viens de lancer un sql très simple -

SELECT * 
FROM ActivityStepLog 
WHERE LogContent.value('(/BusinessRuleDecisionLog/SampleData1/DecisionLogID)[1]', 'int') = -2147483535 

Avant de créer l'index XML primaire sur LogContent, il faut 8 secondes, après, il faut environ 12 secondes. J'ai nettoyé le cache, etc (DROPCLEANBUFFERS et FREEPROCCACHE), cela ne semble pas affecter les proportions mais cela affecte le temps global.

Voilà mes statistiques:

AVEC index xml table 'xml_index_nodes_325576198_256000'. Nombre d'analyses 1000000, lectures logiques 3517272, lectures physiques 0, lectures en lecture anticipée 0, lectures logiques lob 0, lectures physiques lob 0, lectures lues en lecture anticipée 0. Table 'ActivityStepLog'. Analyse nombre 1, logique lit 71694, physique lit 0, lecture anticipée lit 0, lob lectures logiques 0, lectures physiques lob 0, lob lecture anticipée lit 0.

Avec OUT index XML

(5 rangs (s) affecté (s)) Tableau 'ActivityStepLog'. Nombre de balayages 1, lectures logiques 71694, lectures physiques 0, lectures anticipées 0, lectures logiques lob 0, lectures physiques lob 0, lectures anticipées lob 0.

Ainsi, les lectures logiques sont beaucoup moins avec le xml indice. J'ai essayé d'ajouter TOUS les index secondaires disponibles, ce qui n'a pas amélioré les performances par rapport à un index xml primaire.

Je ferai d'autres recherches à ce sujet, mais j'apprécierais vraiment les pointeurs ou les commentaires.

merci, Sylvia

+1

Parce que vous avez besoin d'un index secondaire en plus le principal - pour le chemin IIRC –

+0

Merci pour le commentaire, mais comme je l'ai mentionné dans mon post, j'ai ajouté tous les index XML secondaires disponibles, mais avez ne voit aucune augmentation de performance. – Sylvia

Répondre

5

de faire plus de recherche sur ce point - il semble que pour les champs typées xml, au moins dans mon cas de test, les indices xml diminuent les performances. Cela semble être différent pour xml typé, même si je n'ai pas beaucoup étudié.

Une chose qui a grandement amélioré les performances (merci de l'idée de wBob sur le forum msdn sql xml!) Était de créer un index de texte intégral sur le champ xml. J'ai eu une performance en seconde position à ce moment-là. J'ai également inclus un filtre xml pour la précision.

SELECT * 
FROM dbo.ActivityStepLog 
WHERE 
    CONTAINS (LogContent, '-2147483535') 
    and LogContent.value('(/BusinessRuleDecisionLog/SampleData1/DecisionLogID)[1]', 'int') = -2147483535 

Il me faut vérifier si cela répond à tous mes besoins de filtration, mais jusqu'à présent, il semble bon.

Sylvia