0

Cette question est théorique aussi bien que pratique. Tous les résultats indiquant des ressources utiles sur l'optimisation des requêtes seront appréciés.Optimisation des requêtes pour une base de données en utilisant SQL/XML. Ressources suggérées

Il existe une base de données SQL volumineuse qui stocke une grande quantité de données stockées dans des champs SQLXML. Interroger le XML directement n'est pas assez rapide.

J'ai examiné certains articles MSDN sur l'optimisation de SQLXML (c'est-à-dire http://msdn.microsoft.com/en-us/library/aa902661(SQL.80).aspx), et je suis conscient que l'indexation des champs XML interrogeables augmentera la vitesse de recherche.

Quelqu'un peut-il recommander des ressources supplémentaires pour optimiser les bases de données, dans cet environnement ou en général, qui sont particulièrement utiles? Comme toujours, j'apprécie votre aide

+1

« Il y a une grande base de données SQL » - définir grand ... –

+0

Pour cette question, supposons que c'est la taille d'ebay ou quelque chose de comparable – smartcaveman

Répondre

0

Cela dépend de ce que vous devez faire pour votre XML. J'ai une configuration similaire où la structure de la table a été faite "générique" et tout ce qui est spécifique au produit a été caché dans un champ XML. Nous avons également remarqué à quel point l'interrogation du XML n'est pas exceptionnellement rapide ... et l'utilisation d'index XML (que SQL Server propose également) a fait passer la taille de notre base de données d'environ 1 Go à plus de 10 Go. ...

ce que nous faisons maintenant pour sélectionner des éléments du XML est la suivante:

  • créer une fonction définie par l'utilisateur qui obtient le contenu XML comme paramètre
  • extraire la valeur de cette Paramètre XML
  • en utilisant cette fonction UDF o définir une colonne persistante calculée dans la table parent

Avec ceci, nous pouvons extraire certaines valeurs de clé (par ex. "ProductID" ou "ProductName") à partir du XML, et les stocker sur la table parent en tant que colonne. Il est calculé, par ex. il est toujours à jour, et comme il est également conservé, il est stocké avec les données de la table, par ex. il n'est pas constamment re-demandé et recalculé. Et comme il persiste avec les données de la table, vous pouvez même y mettre un index.

Cela fonctionne très bien, mais cela ne fonctionne que dans les cas où vous avez des objets isolés à valeur unique que vous voulez extraire du XML. Dans ce cas, c'est une excellente solution, et cela accélère les requêtes sur ces valeurs de plusieurs ordres de grandeur.

+0

J'avais envisagé cette solution, et cela fonctionnerait pour le domaine actuel du projet. En ce qui concerne la diversification future, je voudrais la garder comme consultable, mais je pense que les fonctions de recherche courantes pourraient être traitées de cette façon tant que des recherches plus spécifiques pourraient encore être effectuées. Comment cela a-t-il fonctionné pour vous en ce qui concerne l'évolutivité? – smartcaveman

+0

@smartcaveman: les éléments qui finissent par être une INT ou une chaîne courte fonctionnent très bien - vous pouvez faire des colonnes calculées persistantes sur la table contenant le XML, et elles sont absolument comme les colonnes régulières INT ou VARCHAR. L'évolutivité n'est pas un problème du tout. –

0

Sans répondre exactement à votre question, vous pourriez envisager une stratégie de recherche différente. SQL Server/Oracle et MySQL sont tous excellents pour stocker de grandes quantités de données relationnelles, mais dans la plupart des cas, ils ne sont pas très bons quand il s'agit de rechercher du texte (évidemment cela dépend de ce que vous recherchez et de vos index).

Je suggère que vous passiez un peu de temps à regarder un moteur de recherche comme Lucene car il pourrait mieux répondre à vos besoins que SQL?

+0

donc - la stratégie d'optimisation est de ne pas utiliser la base de données actuelle? J'appelle des manigances. –

0

Afficher le plan d'exécution estimé.

aussi:

SET STATISTICS IO ON 
SET STATISTICS TIME ON