Vă rugăm să explicați serverul plan de interogare sql alege

voturi
3

În acest blog , am nevoie de clarificări de ce serverul SQL ar alege un anumit tip de scanare:

Să presupunem, de dragul simplicities că col1 este unic și este în creștere în valoare, col2 are 1000 de valori distincte și există 10,000,000 rânduri în tabel, și că indicele de cluster este format din col1, și un indice de nonclustered există pe col2.

Imaginați-vă planul de execuție interogare creat pentru următorii parametri au trecut inițial: @ P1 = 1 @ P2 = 99

Aceste valori ar duce la o queryplan optimă pentru următoarea declarație folosind parametrii substituiți:

Selectați * de la t în cazul în care col1> 1 sau col2

99 ordine de col1;

Acum, imaginați-vă planul de execuție interogare în cazul în care valorile inițiale ale parametrilor au fost: @ P1 = 6.000.000 și @ P2 = 550.

Ca și mai înainte, un queryplan optim ar fi creat după înlocuirea parametrilor transmiși:

Selectați * de la t în cazul în care col1> 6000000 sau col2> 550 comanda col1;

Aceste două instrucțiuni SQL parametrizate identice ar crea potențial și memoria cache foarte diferite planuri de execuție, datorită diferenței dintre valorile parametrilor trecut inițial. Cu toate acestea, deoarece SQL Server cache numai un singur plan de execuție pentru fiecare interogare, sunt sanse foarte mari ca în primul caz, planul de execuție interogare se va utiliza o scanare indice de cluster din cauza schimbarea parametrului „col1> 1“. Întrucât, în al doilea caz ar fi creat cel mai probabil un plan de execuție interogare cu ajutorul indicelui caută.

de la: http://blogs.msdn.com/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx

De ce ar folosi prima interogare un index cluster, și un indice să caute în a doua interogare?

Întrebat 12/03/2009 la 13:41
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
1

Presupunând că coloanele conțin numere întregi numai pozitive:

SQL Server ar uita la statistici pentru masă și a vedea că, pentru prima interogare, toate rândurile din tabel îndeplinesc criteriile de col1> 1, deci alege să scaneze index grupat.

Pentru a doua interogare, o proporție relativ mică de rânduri ar îndeplini criteriile de col1> 6000000, deci folosind un index caută să îmbunătățească performanța.

Publicat 12/03/2009 la 13:44
sursa de către utilizator

voturi
1

În cazurile în care optimizatorul vede că majoritatea tabelului va fi returnat în interogare, cum ar fi prima interogare, atunci este mai eficient pentru a efectua o scanare, apoi o caută.

În cazul în care doar o mică parte din tabel vor fi returnate, cum ar fi în a doua interogare, apoi un index caută este mai eficientă.

O scanare va atinge în fiecare rând din tabel , dacă se califică sau nu. Costul este proporțional cu numărul total de rânduri în tabel. O scanare este o strategie eficientă în cazul în care masa este mică sau în cazul în care cele mai multe dintre rânduri se califică pentru predicat.

O caută va atinge rânduri care se califică și paginile care conțin aceste rânduri de calificare, costul este proporțională cu numărul de rânduri de calificare și pagini , mai degrabă decât la numărul total de rânduri în tabel.

Publicat 12/03/2009 la 13:49
sursa de către utilizator

voturi
1

Observați că, în ambele cazuri, va fi utilizat indicele grupat. În primul exemplu, este un indice de SCAN grupate în cazul în care la fel ca în al doilea exemplu, va fi un indice de cluster SEEK care, în cele mai multe cazuri, va fi cu atât mai repede ca autor al statelor blog.

SQL Server știe că indicele de cluster este în creștere. Prin urmare, se va face o scanare de index cluster în primul caz.

Publicat 12/03/2009 la 13:52
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more