2009-11-18 10 views
2

Nous avons une requête SQL comme suitL'analyse de table complète s'est produite même lorsque l'index existe?

select * from Table where date < '20091010' 

Cependant, lorsque nous regardons le plan de requête, nous voyons

Le type de requête est SELECT.

FROM TABLE 
     Worktable1. 
    Nested iteration. 
    Table Scan. 
    Forward scan. 
    Positioning at start of table. 
    Using I/O Size 32 Kbytes for data pages. 
    With MRU Buffer Replacement Strategy for data pages. 

ce qui semble indiquer qu'une analyse de table complète est effectuée. Pourquoi l'index n'est-il pas utilisé?

Répondre

3

Si la majorité de vos dates sont trouvées en appliquant < '20091010', l'index risque de passer inaperçu en faveur d'un scan de table. Quelle est votre répartition des dates dans cette table? Quelle est la cardinalité? Est-ce que l'index est utilisé si vous seulement select date plutôt que select *?

1

À moins que l'index couvre *, l'optimiseur se rend compte qu'un balayage de table est probablement plus efficace qu'une recherche d'index/balayage et recherche de signet. Quelle est la sélectivité attendue de la plage de dates? Avez-vous une clé primaire définie?