Na stejné téma existují další diskuze o stackoverflow (odkazy dole). Jak je uvedeno v komentářích výše, může to mít něco společného s indexy a optimalizátorem, který je zmatený a používá nesprávný.
Moje první myšlenka je, že děláte select top serviceid from (select *....) a optimalizátor může mít potíže s posunutím dotazu dolů do vnitřních dotazů a využitím indexu.
Zvažte jeho přepsání jako
select top 10 ServiceRequestID
from big_table_1
inner join big_table_2 cap2
on cap1.servicerequestid = cap2.customerreferencenumber
and big_table_1.statusid = 2
Ve vašem dotazu se databáze pravděpodobně pokouší sloučit výsledky a vrátit je a POTOM ji omezit na prvních 10 ve vnějším dotazu. Ve výše uvedeném dotazu bude databáze muset shromáždit pouze prvních 10 výsledků, protože se výsledky slučují, což ušetří spoustu času. A pokud je servicerequestID indexováno, určitě jej použije. Ve vašem příkladu dotaz hledá sloupec servicerequestid v sadě výsledků, která již byla vrácena ve virtuálním, neindexovaném formátu.
Doufám, že to dává smysl. I když se hypoteticky předpokládá, že optimalizátor vezme jakýkoli formát, do kterého vložíme SQL, a přijde na nejlepší způsob, jak pokaždé vrátit hodnoty, pravdou je, že způsob, jakým skládáme naše SQL dohromady, může skutečně ovlivnit pořadí, ve kterém jsou určité kroky prováděny na DB.
SELECT TOP je pomalý, bez ohledu na ORDER BY
Proč je provádění top(1) v indexovaném sloupci na serveru SQL Server pomalé?