Ik heb een hele grote tabel (zeg 5 miljoen records) In MSSQL Server 2005
Op deze tabel zit een clusterd index op key_A (INDEX1)en een non clusterd index op key_B (INDEX2)
Indien ik een simpele query uitvoer bijv:
Dan heb ik het resultaat binnen een seconde, als ik het estimated en actual execution plan bekijk zie ik ook dat het DBMS slim gebruik gemaakt heeft van de indexen.
Echter als ik voor 1 specifieke key_B (110) dezelfde query uitvoer dan is deze dik 30 seconde bezig. Het estimated execution plan is het zelfde als bij key_B = 100 maar het actual executionplan is anders, ik zie daar een tabel scan tussen staan(lijkt me niet bepaald handig op zo'n grote tabel).
Als ik de query ietsje wijzig voor key_B = 110 en ik maak er:
Dan is de query weer razend snel klaar zoals de andere query's. De Indexen worden dagelijks gerebuild, ook net na een handmatige rebuild treedt dit effect op. Volgens books online is het gebruik van de with (index) een 'Last Resort' en lijkt mij ook niet bepaald wenselijk om dit in alle query's van de applicatie te gaan proppen.
Heeft iemand enig idee waarom het DBMS niet altijd zelf het juiste executionplan kan bepalen?
code:
1
2
3
4
5
6
7
8
| Tabel A key_A bigint (primary key) key_B int (foreign key naar een kleine tabel met ongeveer 100 records) data_1 data_2 data_3 data_4 data_5 |
Op deze tabel zit een clusterd index op key_A (INDEX1)en een non clusterd index op key_B (INDEX2)
Indien ik een simpele query uitvoer bijv:
code:
1
| select top 1000 * from A where key_B = 100 |
Dan heb ik het resultaat binnen een seconde, als ik het estimated en actual execution plan bekijk zie ik ook dat het DBMS slim gebruik gemaakt heeft van de indexen.
Echter als ik voor 1 specifieke key_B (110) dezelfde query uitvoer dan is deze dik 30 seconde bezig. Het estimated execution plan is het zelfde als bij key_B = 100 maar het actual executionplan is anders, ik zie daar een tabel scan tussen staan(lijkt me niet bepaald handig op zo'n grote tabel).
Als ik de query ietsje wijzig voor key_B = 110 en ik maak er:
code:
1
2
3
| select top 1000 * from A with (index = INDEX2) where key_B = 100 |
Dan is de query weer razend snel klaar zoals de andere query's. De Indexen worden dagelijks gerebuild, ook net na een handmatige rebuild treedt dit effect op. Volgens books online is het gebruik van de with (index) een 'Last Resort' en lijkt mij ook niet bepaald wenselijk om dit in alle query's van de applicatie te gaan proppen.
Heeft iemand enig idee waarom het DBMS niet altijd zelf het juiste executionplan kan bepalen?
Are you following me, Are you following me?