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 ID
colonne est un index cluster et Throwtime
possède un index non cluster. Dans ce cas, nous avons remarqué que la commande par throwtime
lieu de ID
changements 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
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 pourthrowtime >= '20140320 07:00' AND throwtime < '20140324 07:00';
- s'il vous plaît voir ce billet de blog et aussi celui-ci .Réponses:
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.
la source
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.
la source