sql >> Databáze >  >> RDS >> Sqlserver

Proč zvolit klauzuli Top by mohlo vést k dlouhodobým nákladům

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é?



  1. Funkce COUNT() v MariaDB

  2. Uvolněte místo na disku po stažení databáze v mysql

  3. LINQ to SQL Take bez přeskakování způsobuje více příkazů SQL

  4. Oracle:záleží na pořadí sloupců v indexu?