Demandez à SQL Server d'utiliser Index Seek + Lookup Key au lieu d'une analyse d'index en cluster, sans (Forceseek)

StackOverflow https://stackoverflow.com/questions/5945916

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top