2012-03-06 4 views
0

Utilisation de SQL Server 2008 R2colonne de données XML dans SQL Server

Je voudrais créer une table avec les colonnes suivantes

[id] INT IDENTITY(1,1) NOT NULL, 
[user_id] INT NOT NULL, 
[date] DATE NOT NULL, 
[timestamp] DATETIME NOT NULL, 
[xml_data] XML NOT NULL 

avec la clé primaire sur la colonne d'identité et un non groupés index sur user_id et la date qui couvre xml_data et timestamp.

Cependant, je remarque que je ne peux pas ajouter xml_data à l'instruction INCLUDE dans l'index. Visage triste, car cela va entraîner une recherche RID lorsqu'un utilisateur recherche sur user_id et la date.

Quelle est la meilleure façon de stocker les données XML qui seront interrogées?

Je figure mes choix sont

  1. bâton avec xml et ont des données bien formatées mais prendre la requête en demandant
  2. Utilisez un VARCHAR (MAX) avec avantages/inconvénients inconnus
  3. Utilisez un VARBINARY (MAX) avec avantages/inconvénients inconnus

note: Je doute que je serai en mesure de limiter la longueur de la chaîne à même quelque chose comme 8000.

Répondre

3

Si vous avez XML - le stocker sous forme XML, pour deux raisons principales:

  • il est optimisé pour le stockage XML - il est pas stocké sous forme de texte tout simplement, il est en fait tokenizés et stockées plus efficacement que simple texte

  • vous pouvez réellement requête XML quand il est stocké en tant que type XML

Mais: vous ne pouvez pas simplement indexer une colonne XML comme ça. Tout index dans SQL Server peut être un maximum de 900 octets de long - une colonne XML peut avoir une taille maximale de 2 Go.

Si vous souhaitez indexer votre colonne XML, jetez un oeil à XML Indexes in SQL Server 2005 - c'est un type d'index distinct conçu pour gérer les requêtes en XML très efficacement. Une autre façon d'accélérer vos requêtes XML pourrait être de "faire surface" certaines parties de votre XML que vous interrogez souvent sur la table parent, au moyen d'une fonction stockée qui extrait cette information du XML, et stocke en tant que colonne persistante calculée sur la table parent. Une fois qu'il est stocké là, vous pouvez l'interroger comme n'importe quelle autre colonne, et vous pouvez l'indexer, aussi! Il ne fonctionne que pour seul éléments d'information, cependant (par exemple le OrderNumber de votre commande - vous en avez seulement un) - il ne peut pas être appliqué à des collections de données.

+0

Réponse très détaillée, merci beaucoup. Donc, fondamentalement, je vais devoir manger le coup de performance sur le SELECT? –

+0

@Norla: ne "SELECT" pas la colonne XML si vous n'en avez pas besoin. En outre: comme il est stocké de manière optimisée - il sera en fait ** plus rapide ** que de stocker en tant que 'VARCHAR (MAX)' –

0

Vous pouvez utiliser XQuery pour interroger des champs XML. Voir here.

Questions connexes