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)
Avez-vous regardé les plans d'exécution de la requête? – Kane
Ê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 ...) –
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