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 pour throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';
- s'il vous plaît voir ce billet de blog et aussi celui-ci .