2010-11-04 6 views
10

Une certaine requête est appelée à partir d'une page ASP .NET. J'ai étudié le plan d'exécution de cette requête dans Management Studio et 87% est pour un tri. J'ai vraiment besoin du tri, sinon les données affichées n'auraient aucun sens.Puis-je demander à SQL Server de mettre en cache un ensemble de résultats donné?

Est-il possible de demander à SQL Server de mettre en cache un ensemble de résultats triés afin qu'il renvoie les données plus rapidement lors des exécutions consécutives?

Ou SQL Server est-il suffisamment intelligent pour gérer le cache et suis-je en train de faire des erreurs en essayant de le forcer à mettre en cache les résultats, si c'est possible?

Toute information pertinente sera très appréciée et merci beaucoup à l'avance :)

MISE À JOUR:
Je viens de lire dans un article que la création d'une vue avec un index cluster augmentera les performances, car l'index persister les données dans une vue sur le disque. Est-ce vrai? Comment puis-je faire cela? Des articles?

Répondre

11

En résumé, non: pas à la fin du serveur SQL; il chargera bien sûr les données dans la mémoire si possible, et mettra en cache le plan d'exécution - ainsi les appels ultérieurs peuvent être plus rapides, mais il ne peut pas mettre en cache les résultats.

Options:

  • syntoniser le plan; le tri semble agressif - pourriez-vous peut-être dénormaliser certaines données ou ajouter un index (peut-être même un index clusterisé); il peut y avoir d'autres choses que nous pouvons faire avec la requête si vous le montrer (mais l'accord sans DB travaille entièrement guestimation au mieux)
  • cache les résultats au serveur web s'il est judicieux de le faire
1

Une option utilisée parfois est de stocker les données triées dans une table secondaire. Cela pourrait, par exemple, être une table temporaire que vous créez uniquement pour la session ou une table de cache pour l'ensemble de la base de données.

11

Alors que vous pouvez créer un indexed view, comme vous faites allusion dans votre mise à jour, vous devez savoir que:

  1. Il y a beaucoup de règles que vous devez suivre, à la fois lors de la création de la vue et lors de la mise à jour des tables sur lesquelles elle repose Et,
  2. Tout simplement parce qu'il existe un index (en cluster), cela n'implique pas un ordre de tri - vous devez toujours utiliser un ORDER BY lors de l'interrogation de cette table et
  3. Sauf si vous utilisez Enterprise Edition , vous devez interroger la vue avec le WITH (NOEXPAND) query hint
  4. Vous devez spécifier l'ordre de l'index en spécifiant ASC et DESC dans l'instruction CREATE INDEX, pas dans la vue CREATE. Le "hack" pour autoriser ORDER BY dans une vue (en spécifiant top 100%) n'aurait aucun effet.
+0

Incroyable! Merci beaucoup pour l'information :) –

1

Encore une fois, le serveur SQL lui-même mettra en cache les requêtes fréquentes en mémoire. Vous pouvez tester cela en utilisant un analyseur de requêtes et en exécutant une requête complexe plusieurs fois, chaque fois que cela sera plus rapide. Compte tenu de cela, un cache permanent peut ne pas être nécessaire.

Si c'est le cas, je recommande d'utiliser une table de cache et d'exécuter votre requête et d'insérer les valeurs dans l'autre table. Vous pouvez utiliser une variable d'application ou une autre table sql pour déterminer quand actualiser à nouveau le cache.

Exemple requête pour insérer dans la table de cache:

Insérer dans le cache Sélectionnez la valeur, la valeur du tableau 1 Trier par champs

Questions connexes