<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlserver.ro/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Intrebari generale</title><link>http://sqlserver.ro/forums/16/ShowForum.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6151.aspx</link><pubDate>Wed, 12 Nov 2008 15:03:46 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6151</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6151.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6151</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;rsocol:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;De fapt, cred că problema este că obţii acea selectivitate foarte bună doar din combinaţia condiţiilor de mai sus, însă Bogdan a întrebat &lt;u&gt;&lt;b&gt;care ar fi numărul de rânduri obţinute dacă foloseşti fiecare parte a condiţiei respective&lt;/b&gt;&lt;/u&gt;, de exemplu:&lt;br&gt;1. câte rânduri obţii dacă foloseşti WHERE area_source_id IN (15, 37) ?&lt;br&gt;2. câte rânduri obţii dacă foloseşti WHERE area_sink_id IN (15, 37) ?&lt;br&gt;3. câte rânduri obţii dacă foloseşti WHERE data_status_id = 1 ?&lt;br&gt;4. câte rânduri obţii dacă foloseşti WHERE&amp;nbsp;data_type_id = 2 ?&lt;br&gt;5. câte rânduri obţii dacă foloseşti WHERE data_source_id = 3 ?&lt;br&gt;şi mai ales:&lt;br&gt;6. câte rânduri obţii dacă foloseşti WHERE effective_date &amp;lt;= '2008-09-11 10:00PM' ?&lt;br&gt;7. câte rânduri obţii dacă foloseşti WHERE&amp;nbsp;termination_date &amp;gt;= '2008-09-11 10:00PM' ?&lt;br&gt;8. câte rânduri obţii dacă foloseşti WHERE&amp;nbsp;termination_date IS NULL ?&lt;br&gt;&lt;br&gt;


Răzvan&lt;br&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;[1] Intr-adevar.&lt;br&gt;&lt;br&gt;@Mihai:&lt;br&gt;[2] O conditie de genul WHERE effective_date &amp;lt;= '2008-09-11 10:00PM' (acelasi lucru si la&amp;nbsp; '2008-09-11 10:00PM'  BETWEEN effective_date ...) nu pare a fi &lt;font color="#ff0000"&gt;foarte&lt;/font&gt; restrictivă. &lt;br&gt;&lt;br&gt;[3] Regândeşte interogarea ... sau/si explica (daca este posibil) ce doresti sa obtii prin aceasta interogare; ar fi utile ceva explicaţii referitoare la tabela sursa (repet, daca este posibil).&lt;br&gt;&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6150.aspx</link><pubDate>Wed, 12 Nov 2008 13:29:06 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6150</guid><dc:creator>rsocol</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6150.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6150</wfw:commentRss><description>Condiţia "'2008-09-11 10:00PM' BETWEEN effective_date AND termination_date" este înţeleasă de SQL Server sub forma "effective_date&amp;lt;='2008-09-11 10:00PM' AND termination_date&amp;gt;='2008-09-11 10:00PM'", deci două condiţii independente (pe coloane diferite), ambele cu inegalităţi. &lt;br&gt;&lt;br&gt;Ai spus că "Pentru un effective_date sunt cam 4000 de randuri". Înţeleg că sunt vreo 4000 de rânduri cu valori între 2008-09-11 00:00 şi 2008-09-11 23:59. Totuşi, un index seek pentru condiţia "effective_date&amp;lt;='2008-09-11 10:00PM" nu returnează câteva mii de rânduri, ci milioane, pentru că nu avem nicio valoare minimă pentru effective_date. &lt;br&gt;&lt;br&gt;Există vreo relaţie între effective_date şi termination_date, cum ar fi "termination_date este la maxim 3 zile după effective_date" ? &lt;br&gt;&lt;br&gt;Dacă da, atunci putem să ne folosim de condiţia "termination_date&amp;gt;='2008-09-11 10:00PM'" ca să adăugăm încă o condiţie de genul "effective_date&amp;gt;='2008-09-08 10:00PM'". Astfel, avem un interval delimitat la ambele capete, iar un index seek pe effective_date ar returna doar vreo 12000 rânduri, care pot fi prelucrate rapid (cu celelalte condiţii).&lt;br&gt;&lt;br&gt;Răzvan&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6149.aspx</link><pubDate>Wed, 12 Nov 2008 13:23:38 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6149</guid><dc:creator>rremus</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6149.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6149</wfw:commentRss><description>Deci criteriul principal de selectie este &lt;b&gt;&lt;font face="Courier New"&gt;effective_date &amp;lt; '2008-09-11 10:00PM'&lt;/font&gt;&lt;/b&gt;&lt;br&gt;Nu o sa mearga, asta selecteaza intreaga tabela practic si rezultatul este full scan (sau range scan de la 0 la 2008-09-11, care e probabil 99.9% din tabela). &lt;b&gt;&lt;i&gt;&lt;font color="#000000"&gt;Trebuie &lt;/font&gt;neaparat sa introduci o limita inferioara la effective_date&lt;/i&gt;&lt;/b&gt;. Ce ai facut cu replace-ul NULL-ului nu ajuta cu nimic.&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6147.aspx</link><pubDate>Wed, 12 Nov 2008 13:08:58 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6147</guid><dc:creator>MihaiBejenariu</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6147.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6147</wfw:commentRss><description>Da, am inversat un pic coloanele, e vina mea. Ca sa clarificam, queryul e acum asa:&lt;br&gt;&lt;br&gt;&lt;b&gt;DBCC DROPCLEANBUFFERS&lt;br&gt;DBCC FREEPROCCACHE &lt;br&gt;GO&lt;br&gt;&lt;br&gt;SELECT *&lt;br&gt;FROM&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_table&lt;br&gt;WHERE 1=1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND area_source_id IN (15, 37)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND area_sink_id IN (15, 35)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND data_status_id = 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND data_type_id = 2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND data_source_id = 3&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND '2008-09-11 10:00PM' BETWEEN effective_date AND termination_date&lt;br&gt;&lt;/b&gt;&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6146.aspx</link><pubDate>Wed, 12 Nov 2008 12:38:35 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6146</guid><dc:creator>rremus</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6146.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6146</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;MihaiBejenariu:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;...&lt;br&gt;&lt;b&gt;'2008-09-11 10:00PM' BETWEEN effective_date AND termination_date&lt;/b&gt;&lt;br&gt;&lt;b&gt;AND effective_date BETWEEN '2008-09-11 10:00PM' AND termination_date&lt;/b&gt;&lt;br&gt;...&lt;br&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;&lt;br&gt;?&lt;br&gt;&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6145.aspx</link><pubDate>Wed, 12 Nov 2008 12:25:01 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6145</guid><dc:creator>MihaiBejenariu</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6145.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6145</wfw:commentRss><description>In primul rand multumesc tuturor pentru raspunsuri. &lt;br&gt;&lt;br&gt;Revin cu detalii:&lt;br&gt;&lt;br&gt;&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;rremus:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;
Primul lucru de incercat: daca area_source_id, area_sink_id si
data_type_id impreuna sint destule de selective (o combinatie de valori
alege doar 5-10% din toate record-urile) si query-ul tau este tipic
pentru aplicatie atunci solutia simpla este sa schimbi indexul
clustered sa fie in ordinea data_type_id, area_source_id, area_sink_id,
efective_date&lt;br&gt;
&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;
Effective_date este cel mai selectiv. &lt;br&gt;
Pentru un effective_date sunt cam 4000 de randuri, restul campurilor
din index au 5-50 valori distincte. La o tabela de cateva milioane de
randuri, nu am avut de ales alta ordine a coloanelor din index.&lt;br&gt;
&lt;br&gt;
&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;rremus:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;
Mai sint si probleme care pot apare din auto-parametrizare daca planul
a fost generat pe alte valori ale constantelor (mai ales
effective_date)&lt;br&gt;
&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;
Inainte de script am rulat tot timpul:&lt;i&gt;&lt;b&gt;&lt;br&gt;
DBCC DROPCLEANBUFFERS&lt;br&gt;
DBCC FREEPROCCACHE &lt;br&gt;
GO&lt;/b&gt;&lt;/i&gt;&lt;br&gt;
&lt;br&gt;
&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;rremus:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;
Si nu in utimul rind incearca sa scapi de OR-ul explicit cit si de cele
implicite ( IN este de fapt un OR). OR este killer-ul sargabilitatzii.
Chiar si un UNION intre doua query-uri poate fi mai optim decit un
predicat OR.&lt;br&gt;
&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;Pai am scapat de OR. Am rulat scriptul:&lt;br&gt;&lt;i&gt;&lt;b&gt;UPDATE cor_time_Serie&lt;br&gt;SET termination_date = '2050-01-01'&lt;br&gt;WHERE termination_Date IS NULL&lt;/b&gt;&lt;/i&gt;&lt;br&gt;&lt;br&gt;si am schimbat ultima conditie pe data:&lt;br&gt;&lt;b&gt;&lt;i&gt;AND effective_date BETWEEN '2008-09-11 10:00PM' AND termination_date&lt;/i&gt;&lt;/b&gt;&lt;br&gt;Rezultatul este acelasi :(&lt;br&gt;&lt;br&gt;
&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6143.aspx</link><pubDate>Wed, 12 Nov 2008 10:36:14 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6143</guid><dc:creator>rremus</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6143.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6143</wfw:commentRss><description>Partitionarea nu ajuta daca planul cere un full scan. Trebuie neaparat sa elimini full-scan-ul. Daca effective_date este cheia de partitionare nu potzi schimba indexul clustered. Eu zic ca este musai sa adaugi la WHERE o conditie de limitare effective_date &amp;gt;= '...'&amp;nbsp; ca sa creezi un range intre doua date.&lt;br&gt;&lt;br&gt;Index2 este ales pentru ca genereaza un full-scan pe mai putzine pagini (index mai compact).&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6142.aspx</link><pubDate>Wed, 12 Nov 2008 09:30:51 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6142</guid><dc:creator>MihaiBejenariu</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6142.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6142</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;B_gd_n[ ]Sahlean:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;Dacă ediţia de SQL îţi permite, foloseşte partiţionarea tabelelor după &lt;b&gt;termination_date&lt;/b&gt; sau &lt;b&gt;effective_date&lt;/b&gt;.&lt;br&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;Tabela este deja partitionata (anual) dupa effective_date, index1 este pe partitie, index2 este stocat in PRIMARY. Faptul ca este ales index2 care este stocat in PRIMARY duce la performante si mai slabe.&lt;br&gt;&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6138.aspx</link><pubDate>Wed, 12 Nov 2008 06:24:01 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6138</guid><dc:creator>rsocol</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6138.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6138</wfw:commentRss><description>Eu aş crea un index (non-clustered) care să conţină şi coloana termination_date (în afară de effective_date), de exemplu:&lt;br&gt;&lt;br&gt;CREATE NONCLUSTERED INDEX index3 ON my_table (area_sink_id, data_status_id, data_type_id, data_source_id, effective_date, termination_date) &lt;br&gt;-- am trecut mai sus şi celelalte coloane din WHERE, chiar dacă fac parte deja din indexul clustered, în măsura în care ai condiţie cu =, nu cu IN&lt;br&gt;-- ar fi bun şi eventual un INCLUDE în care treci toate coloanele care sunt în SELECT sau în WHERE, cu excepţia celor scrise mai sus&lt;br&gt;&lt;br&gt;Ai putea să rescrii condiţia respectivă (eliminând OR-ul) astfel:&lt;br&gt;&lt;br&gt;'2008-09-11 10:00PM' BETWEEN effective_date AND ISNULL(termination_date,'99991231 23:59:59.997')&lt;br&gt;&lt;br&gt;... deşi nu cred că o să aibă un efect semnificativ.&lt;br&gt;&lt;br&gt;Oricum, în cel mai bun caz cred că o să obţii un index seek care are ca "Seek Predicates" doar un "effective_date&amp;lt;=@DataRespectiva", iar condiţia pe termination_date va fi pusă doar la "Predicate" şi asta înseamnă că acel seek ar putea citi o mare parte din paginile din indexul respectiv (dacă mai ales dacă data e mai recentă), aşa că e important ca acel index să includă toate coloanele de care ai nevoie, dar să fie cât mai mic.&lt;br&gt;&lt;br&gt;De fapt, cred că problema este că obţii acea selectivitate foarte bună doar din combinaţia condiţiilor de mai sus, însă Bogdan a întrebat care ar fi numărul de rânduri obţinute dacă foloseşti fiecare parte a condiţiei respective, de exemplu:&lt;br&gt;1. câte rânduri obţii dacă foloseşti WHERE area_source_id IN (15, 37) ?&lt;br&gt;2. câte rânduri obţii dacă foloseşti WHERE area_sink_id IN (15, 37) ?&lt;br&gt;3. câte rânduri obţii dacă foloseşti WHERE data_status_id = 1 ?&lt;br&gt;4. câte rânduri obţii dacă foloseşti WHERE&amp;nbsp;data_type_id = 2 ?&lt;br&gt;5. câte rânduri obţii dacă foloseşti WHERE data_source_id = 3 ?&lt;br&gt;şi mai ales:&lt;br&gt;6. câte rânduri obţii dacă foloseşti WHERE effective_date &amp;lt;= '2008-09-11 10:00PM' ?&lt;br&gt;7. câte rânduri obţii dacă foloseşti WHERE&amp;nbsp;termination_date &amp;gt;= '2008-09-11 10:00PM' ?&lt;br&gt;8. câte rânduri obţii dacă foloseşti WHERE&amp;nbsp;termination_date IS NULL ?&lt;br&gt;&lt;br&gt;


Răzvan&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6136.aspx</link><pubDate>Tue, 11 Nov 2008 21:52:20 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6136</guid><dc:creator>rremus</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6136.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6136</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;rremus:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;desi in cazul asta nu am nici on explicatie pentru alegerea indexului pe ID&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;Doh! Indexul ID contine implicit cimpurile din clustered deci poate satisface query-ul aproape complet (mai putin termination_date, data_status_id si data_source_id si '*' din projection list). Si intrucit e mai mic decit cel clustered, e preferat pe motiv ca un full scan pe el cere mai putzin I/O.&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6135.aspx</link><pubDate>Tue, 11 Nov 2008 21:48:12 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6135</guid><dc:creator>rremus</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6135.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6135</wfw:commentRss><description>Intr-adevar conditiile de pe effective_date nu sint SARGable. Daca SQL alege un plan pe indexul nonclustered pe ID eu cred ca mai exista niste detalii care nu le-ai specificat. Bauiala mea este ca clusterul este pe ID, nu pe effective_date. Potzi sa validezi ca indecsii sint asa cum i-ai descris tu?&lt;br&gt;&lt;br&gt;O sa consider mai departe ca indecsii sint intr-adevar cum i-ai descris si query-ul este &lt;i&gt;exact&lt;/i&gt; acesta si nu ai schimbat absolut nimic (desi in cazul asta nu am nici on explicatie pentru alegerea indexului pe ID). Deasemenea ar folosi sa ne spui si structura tabelei si marimea cimpurilor si a recordurilor (conform &lt;a href="http://msdn.microsoft.com/en-us/library/ms188917%28SQL.90%29.aspx"&gt;sys.dm_db_index_physical_stats&lt;/a&gt;)&lt;br&gt;&lt;br&gt;Primul lucru de incercat: daca area_source_id, area_sink_id si data_type_id impreuna sint destule de selective (o combinatie de valori alege doar 5-10% din toate record-urile) si query-ul tau este tipic pentru aplicatie atunci solutia simpla este sa schimbi indexul clustered sa fie in ordinea data_type_id, area_source_id, area_sink_id, efective_date. Faptul prima cheie in index 1 este effective_date si range-ul tau este totdeauna deschis relativ la effective_date face ca indexul 1 sa nu poata fi folosit (decit cel mult pentru un full scan). Rotind effective_date la coada indexului te-ar putea ajuta pentru acest query pentru ca se poate seta un range pe celelate conditii (data_type, area etc).&lt;br&gt;&lt;br&gt;Daca effectve_date trebuie sa ramina prima cheie in index atunci trebuie sa gasesti un criteriu de limitare a range-ului pe care cautzi effective_date. Conditiile tale sint practic effective_date &amp;lt; '2008-09-11 10:00PM' OR effective_date &amp;lt;= '2008-09-11 10:00PM'. Cum astfel de tabele totdeauna cresc si datele calendaristice din tabela sint mereu in trecut, conditia respectiva este effectiv echivalenta cu 'toate recordurile dinnainte de ultimul' sau ceva foarte asemanator. Oricum, ceva ce nu restrictioneaza deloc numarul de record-uri. Cauta daca potzi gasi o conditie de data minima care sa limiteze, ceva de genul 'numai din luna curenta' sau 'numai din ultimele 3 luni'. Atunci s-ar putea face un range scan si limita sever numarul de record-uri scanate.&lt;br&gt;&lt;br&gt;Mai sint si probleme care pot apare din auto-parametrizare daca planul a fost generat pe alte valori ale constantelor (mai ales effective_date), dar nu avem cum sa ne dam seama fara sa vedem effectiv planul.&lt;br&gt;&lt;br&gt;Si nu in utimul rind incearca sa scapi de OR-ul explicit cit si de cele implicite ( IN este de fapt un OR). OR este killer-ul sargabilitatzii. Chiar si un UNION intre doua query-uri poate fi mai optim decit un predicat OR.&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6134.aspx</link><pubDate>Tue, 11 Nov 2008 19:12:41 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6134</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6134.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6134</wfw:commentRss><description>Dacă ediţia de SQL îţi permite, foloseşte partiţionarea tabelelor după &lt;b&gt;termination_date&lt;/b&gt; sau &lt;b&gt;effective_date&lt;/b&gt;.&lt;b&gt;&lt;/b&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6131.aspx</link><pubDate>Tue, 11 Nov 2008 13:25:51 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6131</guid><dc:creator>MihaiBejenariu</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6131.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6131</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;B_gd_n[ ]Sahlean:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;2005 / 2008 ?&lt;/p&gt;&lt;p&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/p&gt;&lt;p&gt;2005&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;B_gd_n[ ]Sahlean:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;/p&gt;
&lt;p&gt;Primul sfat este să nu foloseşti SELECT &lt;strong&gt;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/strong&gt; FROM ...&lt;/p&gt;&lt;p&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/p&gt;&lt;p&gt;da, nu am folosit, am pus steluta pentru simplificare&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;B_gd_n[ ]Sahlean:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;/p&gt;
&lt;p&gt;Care este selectivitatea pentru fiecare&amp;nbsp;condiţie&amp;nbsp;WHERE ?&lt;/p&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;selectivitatea este intre 5 si 50 / 8 milioane&lt;br&gt;&lt;br&gt;</description></item><item><title>Re: Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6130.aspx</link><pubDate>Tue, 11 Nov 2008 13:07:33 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6130</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6130.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6130</wfw:commentRss><description>&lt;P&gt;2005 / 2008 ?&lt;/P&gt;
&lt;P&gt;Primul sfat este să nu foloseşti SELECT &lt;STRONG&gt;&lt;FONT color=#ff0000&gt;*&lt;/FONT&gt;&lt;/STRONG&gt; FROM ...&lt;/P&gt;
&lt;P&gt;Care este selectivitatea pentru fiecare&amp;nbsp;condiţie&amp;nbsp;WHERE ?&lt;/P&gt;</description></item><item><title>Cum sa fac sa pic pe index?!</title><link>http://sqlserver.ro/forums/thread/6126.aspx</link><pubDate>Tue, 11 Nov 2008 10:40:08 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:6126</guid><dc:creator>MihaiBejenariu</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/6126.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=16&amp;PostID=6126</wfw:commentRss><description>Salutare,&lt;br&gt;Am o tabela cu 2 indecsi:&lt;br&gt;index1 / clustered / pe coloanele effective_date, area_source_id, area_sink_id, data_type_id&lt;br&gt;index2 / nonclustered, unique, primary key/pe coloana&amp;nbsp; id&lt;br&gt;&lt;b&gt;&lt;br&gt;SELECT *&lt;br&gt;FROM my_table&lt;br&gt;WHERE 1=1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND area_source_id IN (15, 37)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND area_sink_id IN (15, 37)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND data_status_id = 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND data_type_id = 2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND data_source_id = 3&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ('2008-09-11 10:00PM' BETWEEN effective_date AND termination_date)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OR &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (effective_date &amp;lt;= '2008-09-11 10:00PM' AND termination_date IS NULL)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/b&gt;&lt;br&gt;&lt;br&gt;Intrebare:&lt;br&gt;Pentru SQLul de mai sus, cum sa rescriu ultima conditie din WHERE a.i. sa am &lt;b&gt;index seek pe index1&lt;/b&gt;? Acum, in planul de executie se face un &lt;b&gt;index scan pe index2&lt;/b&gt; (asta datorita
ultimei conditii pe effective_date, presupun pentru ca effective_date nu este
SARGable).&lt;br&gt;&lt;br&gt;Am folosit hint ca sa fortez folosirea lui index1, dar timpul de executie este si mai mare.&lt;br&gt;&lt;br&gt;Orice help, sugestie este binevenita.&lt;br&gt;Multumesc.&lt;br&gt;</description></item></channel></rss>