Demandez à SQL Server d'utiliser Index Seek + Lookup Key au lieu d'une analyse d'index en cluster, sans (Forceseek)
-
31-10-2019 - |
Question
Version: SQL Server 2008 R2
Base de données: AdventureWorks 2008R2 de http://msftdbprodsamples.codeplex.com/releases/view/55926
Requête:
SELECT TOP 10
*
FROM
Person.Person --WITH (FORCESEEK)
WHERE
LastName like 'Max%'
OR EXISTS (
SELECT
1
FROM
Person.PersonPhone
WHERE
Person.PersonPhone.BusinessEntityID = Person.Person.BusinessEntityID
AND Person.PersonPhone.PhoneNumber LIKE '122%'
)
ORDER BY Person.Person.BusinessEntityID DESC
Sans un indice de requête, SQL Server utilisera une analyse d'index en cluster, qui est intensive IO:
Table 'PersonPhone'. Scan count 14170, logical reads 28446, physical reads 15, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Person'. Scan count 1, logical reads 2844, physical reads 3, read-ahead reads 3215, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Avec le WITH (FORCESEEK)
L'indice de requête, SQL Server optera pour Index Seek + Key Lookup, qui se termine plus rapidement et est plus gentil de 500x pour l'IO:
Table 'Person'. Scan count 1, logical reads 59, physical reads 22, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'PersonPhone'. Scan count 1, logical reads 2, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Ma question est: existe-t-il un moyen d'amener SQL Server à utiliser le meilleur plan sans indice de requête? Ajouter peut-être des index? Ou modifier les paramètres de configuration? Ou est-ce que SQL Server est sans aucune idée?
Voici un joyau de http://msdn.microsoft.com/en-us/library/bb510478.aspx:
Les règles d'optimiseur de requête et une mauvaise estimation de la cardinalité peuvent également amener l'optimiseur à effectuer une opération de numérisation de table ou d'index plutôt qu'une recherche d'index lorsqu'une requête utilise ou comme comme prédicats de recherche.
Pas de solution correcte