2011-02-01 2 views
0

Il ya quelques jours, j'ai écrit une requête et elle s'exécute rapidement, mais maintenant il faut 1 heure. Cette requête est exécutée sur mon serveur SQL7 et dure environ 10 secondes. Cette requête existe sur un autre serveur SQL7 et jusqu'à la semaine dernière il a fallu environ 10 secondes. La configuration des deux serveurs est la même. Seul le matériel est différent.La requête Sql devient trop lente

Maintenant, sur le deuxième serveur, cette requête prend environ 30 minutes pour extraire les détails sme , mais n'importe qui a changé les détails.

Si j'exécute cette requête sans Où, il me montrera les détails dans 7 secondes. Cette requête prend toujours le même temps si Où est le problème

+3

Afficher la requête que vous exécutez s'il vous plaît. –

+0

la requête est trop longue pour que je ne puisse pas l'afficher. mais cela utilise les jointures internes gauche jointure externe et la fonction définie par l'utilisateur et joindre sur une autre base de données également – sanjiv

+0

avez-vous mis à jour les statistiques sur toutes les tables et index? – Karl

Répondre

0

Sans voir la requête et probablement les données, je ne peux pas faire beaucoup d'autres que des conseils d'offre.

  1. Pouvez-vous mettre plus de contraintes sur la requête. Si vous pouvez réduire la quantité de données impliquées, cela accélérera la requête.
  2. Regardez les colonnes utilisées dans vos jointures, où et ayant des clauses et ordre par. Vérifiez que les tables auxquelles appartiennent les colonnes contiennent des index pour ces colonnes.
  3. Avez-vous besoin d'utiliser la fonction définie par l'utilisateur ou peut-il être fait d'une autre manière?
  4. Utilisez-vous des sous-requêtes? Si oui, peuvent-ils être retirés dans des vues séparées?

Espérons que cela aide.

0

Sans savoir comment beaucoup de données va dans vos tables, et ne sachant pas votre schéma, il est difficile de donner une réponse définitive, mais les choses à regarder:

  1. Essayez d'exécuter UPDATE STATS ou DBCC REINDEX.
  2. Avez-vous des index sur les tables? Sinon, essayez d'ajouter des index aux colonnes utilisées dans les clauses WHERE et JOIN.
  3. Évitez les tables croisées OR (c'est-à-dire WHERE table1.col1 = @somevalue OR table2.col2 = @someothervalue). SQL ne peut pas utiliser efficacement les index avec cette construction et vous pouvez obtenir de meilleures performances en divisant la requête en deux et en UNION les résultats.
  4. Que font vos fonctions (UDF) et comment les utilisez-vous? Il vaut la peine de noter que les supprimer dans la partie colonnes d'une requête devient cher lorsque la fonction est exécutée par ligne retournée: ainsi, si une fonction effectue une sélection sur la base de données, vous exécutez n + 1 requêtes sur la base de données. = nombre de lignes renvoyées dans la sélection principale). Essayez et gérez la fonction si possible.
  5. Assurez-vous que vos JOINs sont corrects - où vous utilisez un LEFT JOIN, réexaminez la logique et voyez si elle doit être à gauche ou si elle peut être transformée en INNER JOIN. Parfois, les gens utilisent LEFT JOINs, mais lorsque vous examinez la logique dans le reste de la requête, il peut parfois être évident que LEFT JOIN ne vous donne rien (parce que, par exemple, quelqu'un aurait ajouté un prédicat WHERE col IS NOT NULL à la table jointe). INNER JOINs peut être plus rapide, il vaut donc la peine de passer en revue tous ces éléments.

Il serait beaucoup plus facile de suggérer des choses si nous pouvions voir la requête.

Questions connexes