2009-09-15 7 views
0

J'ai une application qui s'exécute parfois lentement et je pense qu'elle est liée aux curseurs de base de données.Index SQL Server pour les curseurs

N'ayant aucun accès à la source de l'application, je ne peux pas contrôler les appels de la base de données, mais la base de données est ouverte afin que je puisse ajouter l'index si nécessaire.

Le problème est que je ne sais pas vraiment comment accélérer les curseurs avec index.

Les requêtes de curseur sont simples et ressemblent à

SELECT * FROM table WHERE field1=1 AND field2=2 ORDER BY field3, field4 

(tableau contient environ une lignes 1M. Parfois, il y a une seule jointure gauche aussi)

Si je lance la requête directement dans SSMS il prend moins d'une seconde, mais quand il est exécuté à partir de l'application dans un curseur, il peut prendre 30 secondes pour récupérer la première ligne (vérifiée avec sql-trace).

Les champs des clauses WHERE et ORDER BY sont tous indexés séparément.

Je suppose qu'un index combiné sur field1, field2, field3, field4 le rendrait plus rapide. Y at-il un moyen de l'accélérer sans créer un index pour chaque combinaison et ordre des champs?

(Il suffit de répéter. Je n'ai aucune influence sur la façon dont l'application accède à la base de données de performance ne peut être réglé via l'index)

+0

Avez-vous regardé les plans d'exécution de la requête? – Kane

+0

Êtes-vous en train de déclarer votre curseur avec des options? c'est-à-dire, faites-vous simplement DECLARE bob CURSOR FOR SELECT ... ou donnez-vous explicitement des options - par exemple, vous avez DECLARE bob CURSOR STATIC, READ_ONLY POUR SELECT ... (ou toute autre combinaison d'options - DYNAMIC, FAST_FORWARD, KEYSET, etc ...) –

+0

N'a pas vérifié les options du curseur puisque je ne peux pas les changer quand même. Est-ce que les options du curseur ont vraiment de l'importance pour le réglage de l'index? J'ai regardé le plan d'exécution de la requête mais cela ne dit pas grand-chose puisque la requête elle-même s'exécute rapidement. Comment puis-je voir le plan d'exécution d'un curseur? – adrianm

Répondre

1

Une chose que je fais toujours (si possible) je lance le DB Tuning Advisor. Ne vous méprenez pas - je ne suis pas toutes ses règles et suggestions, mais c'est un moyen facile de voir ce qui se passe, à quelle fréquence ce qui se passe et ainsi de suite. Quelques heures de travail (typique !!!) sont bonnes pour avoir une idée générale de ce qui se passe.

Et après cela, vous pouvez décider de mettre en œuvre certaines des suggestions ou non. Et même si vous avez fait de votre mieux en design - une telle vérification regarde ce qui se passe vraiment (pas toujours prévisible) et peut-être vous oubliez des statistiques ou un index différent pourrait aider ...

+0

J'ai installé Tuning Advisor mais je ne l'ai pas encore utilisé. Je suppose que la procédure consiste à faire une sauvegarde et démarrer un sqltrace en même temps. – adrianm

0

Je changerais la requête pour utiliser noms de colonnes réels et non SELECT *, puis créez un index de couverture sur field1 = 1 et field2 = 2. Si possible, je mettrais un index clusterisé sur field3 et field4.

Si vous êtes sur SQL 2005+, essayez de regarder CTE au lieu du curseur, ou reformulez votre requête pour utiliser les tables temporaires.

Questions connexes