Alex,
Il peut y avoir un certain nombre de raisons pour la grande quantité de lectures, et je crois que @ la réponse de Jonathan vous aidera ou masquer le problème pour l'instant . La raison pour obtenir beaucoup de lectures sera parce qu'il vous manque certains index critiques, et/ou que les statistiques de votre table ne sont pas à jour, ou qu'elles sont désactivées.
Il peut être compliqué d'effectuer un réglage de précision sur une grande table, si elle est utilisée par de nombreuses autres procédures, vues et requêtes. Parce que la modification d'un index peut avoir un impact considérable sur d'autres requêtes qui fonctionnent bien maintenant, mais si votre table ne dispose d'aucun index, toute modification pourrait vous aider. Les choses à considérer lorsque vous essayez d'optimiser quelque chose comme ceci est:
- Comment souvent cette requête a couru
- Quand il fonctionne de t-elle un impact sur d'autres processus sur le système
- Quelle est l'opération la plus fréquente sur cette table, inserts ou mises à jour?
Si cette requête est exécutée une fois par jour, ou très rarement, et qu'elle n'a pas d'impact sur d'autres processus, je pourrais être enclin à la quitter. Mais si c'est un processus qui fonctionne très fréquemment et/ou qui a un impact sur d'autres processus, alors vous devez le réparer. Maintenant, en le corrigeant, il peut être aussi simple que d'ajouter un indice de table WITH(NOLOCK)
si vous trouvez qu'il bloque, mais s'il est exécuté très fréquemment, regardez les index et les statistiques.
Si vous avez beaucoup d'insertions sur cette table, alors tout index supplémentaire aura un impact sur les performances d'insertion, mais cela accélérera les mises à jour. Puis vient le facteur de remplissage de l'index, etc. Mon point est que le réglage de perf sur une boîte Sql est très compliqué, et nécessite la totalité de l'image la plupart du temps. Donc, ce que je suggérerais, c'est que vous preniez quelques indices ici et, parce que personne ne connaît votre système aussi bien que vous, vous pouvez prendre des décisions, expérimenter et en tirer des leçons! Activez votre plan d'exécution de requête et regardez-le, voyez si vous voyez des scans de table, ils sont mauvais, et indiquent un manque d'index appropriés, tout comme les recherches de clés.
Mais en regardant votre requête que vous avez donnée ici et en ignorant tous les autres facteurs, voici ce que je suggérerais.
Assurez-vous d'avoir un index NON CLUSTERED ayant employee_number
et course_code
dans l'index. Si c'est Sql 2008, vous pouvez également ajouter des colonnes incluses si vous avez d'autres requêtes filtrant sur ces deux colonnes, mais en produisant d'autres colonnes. Aussi loin qu'ils devraient être ascendants ou descendants dans l'index est à vous, mais laissez-les tous les deux comme ascendants.
Ensuite, pour la requête, utilisez ce que @Jonathan (+1 pour vous!) A proposé, avec un changement mineur, ajoutez un indice WITH (NOLOCK) sur la table. Cela indiquera à l'optimiseur Sql de ne pas verrouiller la table quand il la lit, mais vous pourrez lire les données corrompues. Normalement, ce n'est pas un problème, à moins qu'il s'agisse d'une table très transactionnelle, de nombreuses mises à jour et insertions en cours.
IF EXISTS(SELECT 1 FROM course_tracking WITH(NOLOCK)
WHERE employee_number = @employee_number
AND course_code = @course_code)
BEGIN
UPDATE COURSE TRACKING
END
ELSE
BEGIN
INSERT INTO COURSE TRACKING
END
également, vérifiez si vos statistiques sont automatiquement mises à jour sur la base de données, sinon, créez un travail de maintenance qui mettra à jour une fois par jour, lorsque le serveur est moins actif. Créer un emploi Agent SQL avec ce que la requête EXEC sp_MSForEachTable 'UPDATE STATISTICS ? WITH FULLSCAN'
Assurez-vous que '' course_code' et employee_number' sont tous deux indexés . Un indice de couverture devrait fonctionner correctement. – JNK
Quelle version de SQL Server? Parce que SQLServer 2008 vous donne la capacité 'MERGE' qui est idéale pour les upserts comme celui-ci. – Matthew
@JNK, n'aura-t-il pas à inclure la colonne id pour le compte? – DForck42