2017-08-03 1 views
0

Nous avons un petit problème avec l'une de nos requêtes, qui est exécutée dans une application .Net (4.5) via System.Data.SqlClient.SqlCommand.SQL Server ignorant l'index et effectue une analyse de table

Le problème est que la requête va effectuer une analyse de table qui est très lente. Ainsi, le plan d'exécution montre le balayage de table ici

Screenshot: enter image description here

Les détails: enter image description here

Ainsi, les spectacles de texte, que le filtre à Termine.Datum et Termine.EndDatum provoquant le balayage de table. Mais pourquoi le serveur SQL ignore-t-il les index? Il existe deux index sur Termine.Datum et Termine.EndDatum. Nous avons également essayé d'ajouter un troisième avec Datum et EndDatum combinés. Les index sont tous les index non groupés et les deux champs sont DateTime.

+4

De toute évidence, 'statistics 'est obsolète !! .. Les statistiques de mise à jour tentent à nouveau d'exécuter la requête –

+0

Affichez également les détails de la requête et de l'index pour obtenir une réponse plus précise. Partagez le plan d'exécution ici https://www.brentozar.com/pastetheplan/ –

+0

Deux index séparés n'aideront certainement pas puisque vous essayez deux requêtes de plage. L'indice combiné unique * pourrait être utile mais non garanti. –

Répondre

0

Il décide dans le tableau d'analyse en fonction du nombre de lignes estimé 124844 où que vos lignes réelles ne sont que 831.

Optimizer pense que pour traverser 124844 il vaut mieux le faire analyser dans le tableau au lieu de recherche d'index.

Vous devez également vérifier les autres colonnes sélectionnées en dehors de l'index. Si vous avez sélectionné d'autres colonnes en dehors de l'index, il doit effectuer la recherche RID après avoir recherché l'index, l'optimiseur peut penser que plutôt que la recherche RID, il préférait effectuer une analyse de table.

Première difficulté: mettre à jour les statistiques et fournir suffisamment d'informations à l'optimiseur pour choisir un meilleur plan.

0

Pouvez-vous fournir la requête complète? Je vois que vous tirez une gamme de données qui s'étendent sur une plage de 3 mois. Si cette plage représente un pourcentage élevé de l'ensemble de données, il se peut que ce soit en raison de votre tentative de renvoi d'un pourcentage aussi important de données. Si l'index n'est pas assez sélectif, il ne sera pas récupéré.

également ...

Vous avez une clause OR dans le filtre. En regardant le prédicat dans la capture d'écran que vous avez fourni il semble que vous pourriez manquer () autour des deux filtres différents. Cela pourrait également conduire à l'analyse.

une chose ... OR clauses peuvent parfois conduire à de mauvaises plans - une alternative est de diviser la requête en deux requêtes UNIONED chacun avec les différents OR en elle. Si vous fournissez la requête, je devrais être en mesure de vous donner une version réécrite pour le montrer.

+0

Nécessaire plus de temps pour l'obtenir mais: http://pastebin.com/BPpAzVrJ – slxSlashi