Pourquoi mon guide de plan n'est-il pas utilisé?

9

Nous avons récemment rencontré le problème du point de basculement et certaines de nos requêtes de rapport qui avaient l'habitude de terminer l'exécution en quelques secondes prennent maintenant plus de 2 minutes car l'optimiseur de requête ignore simplement l'index non cluster sur la colonne de recherche. Un exemple de requête ci-dessous:

select top 100 *
from   [dbo].[t_Call]
where  ID > 0 
  and  throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id

La IDcolonne est un index cluster et Throwtimepossède un index non cluster. Dans ce cas, nous avons remarqué que la commande par throwtimelieu de IDchangements utilise le plan de requête et l'index non cluster.Nous prévoyons également d'archiver certaines des anciennes données (il compte actuellement 20 millions de lignes !!). Mais faire ces changements dans l'application va prendre un certain temps et j'ai besoin de trouver un moyen de faire fonctionner les rapports assez rapidement, sans faire de changements au niveau de l'application (eh bien, c'est la vie!).

Entrez le guide de plan. J'ai créé le guide de plan ci-dessous avec un indice de requête d'index non cluster et pour une raison quelconque, l'index non cluster n'est toujours pas utilisé. Suis-je en train de manquer quelque chose?

EXEC sp_create_plan_guide 
@name = N'[prod2reports_callthrowtime]', 
@stmt = N'select top 100 *
          from   [dbo] . [t_Call]
          where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL', 
@module_or_batch = N'select top 100 *
                     from   [dbo] . [t_Call]
                     where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID', 
@params = N'@0 int, @1 datetime, @2 datetime', 
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
                   INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO
RK Kuppala
la source
À quoi ressemble l'index non clusterisé? La raison pour laquelle le serveur l'ignore est parce qu'il ne pense pas que cela fera du bien. Soit vous avez un plan défectueux, soit un index défectueux
Allan S. Hansen
3
En throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'passant , S'IL VOUS PLAÎT S'IL VOUS PLAÎT S'IL VOUS PLAÎT changer pour throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';- s'il vous plaît voir ce billet de blog et aussi celui-ci .
Aaron Bertrand
@AaronBertrand Merci beaucoup. Oui, j'ai également suggéré ce changement et ils le feront dans la prochaine version.
RK Kuppala

Réponses:

11

La requête doit correspondre EXACTEMENT, y compris les espaces. Je vous suggère de récupérer la requête dans le cache et de la créer à partir de cela plutôt que de la saisir autrement.

Rob Farley
la source
0

LISEZ ENCORE VOTRE ARTICLE LIÉ

La rédaction d'un guide de plan pour forcer l'utilisation de votre index n'est certainement pas ce que vous voulez, car cela forcera les recherches de signets inefficaces. Selon votre article, la solution correcte pour les performances les plus efficaces de cette requête serait de modifier votre index pour qu'il soit un index couvrant non clusterisé, en d'autres termes, soit ajouter toutes les colonnes de votre table à l'index, soit (de préférence ) ajoutez simplement les colonnes dont vous avez besoin pour cette requête, puis modifiez la sélection pour extraire ces colonnes.

Jason
la source