Ottieni SQL Server per utilizzare l'indice Seek + Key Lookup anziché la scansione indice cluster, senza con (ForceSek)

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

Domanda

Versione: SQL Server 2008 R2

Database: Adventureworks 2008r2 da http://msftdbprodsamples.codeplex.com/releases/view/55926

Domanda:

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


Senza alcun suggerimento di query, SQL Server utilizzerà la scansione indice cluster, che è intensiva:

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.


Con il WITH (FORCESEEK) Suggerimento di query, SQL Server opterà per l'indice Seek + Key Lookup, che completa più velocemente ed è 500x Kinder a 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.


La mia domanda è: c'è un modo per convincere SQL Server a utilizzare il piano migliore senza alcun suggerimento di query? Aggiungendo forse indici? O modificare i parametri di configurazione? Oppure l'ottimizzatore di query di SQL Server è all'oscuro?

Ecco una gemma di http://msdn.microsoft.com/en-us/library/bb510478.aspx:

Le regole dell'ottimizzatore delle query e la scarsa stima della cardinalità possono anche causare l'ottimizzatore a eseguire un'operazione di scansione della tabella o dell'indice piuttosto che un indice di ricerca quando una query utilizza o come i predicati di ricerca.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top