Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum die Auswahl der Top-Klausel zu langen Zeitkosten führen kann

Es gibt andere Stackoverflow-Diskussionen zu demselben Thema (Links unten). Wie in den Kommentaren oben erwähnt, könnte es etwas damit zu tun haben, dass Indizes und der Optimierer verwirrt sind und den falschen verwenden.

Mein erster Gedanke ist, dass Sie eine Top-Service-ID von (select *....) auswählen und der Optimierer möglicherweise Schwierigkeiten hat, die Abfrage in die inneren Abfragen zu verschieben und den Index zu verwenden.

Erwägen Sie, es umzuschreiben als

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

In Ihrer Abfrage versucht die Datenbank wahrscheinlich, die Ergebnisse zusammenzuführen und zurückzugeben und DANN auf die Top 10 in der äußeren Abfrage zu beschränken. Bei der obigen Abfrage muss die Datenbank nur die ersten 10 Ergebnisse sammeln, wenn die Ergebnisse zusammengeführt werden, was viel Zeit spart. Und wenn servicerequestID indiziert ist, wird es sicher verwendet. In Ihrem Beispiel sucht die Abfrage nach der Spalte servicerequestid in einer Ergebnismenge, die bereits in einem virtuellen, nicht indizierten Format zurückgegeben wurde.

Hoffe das macht Sinn. Während der Optimierer hypothetisch jedes Format nehmen soll, in das wir SQL einfügen, und jedes Mal den besten Weg finden soll, Werte zurückzugeben, ist die Wahrheit, dass die Art und Weise, wie wir unsere SQL zusammenstellen, sich wirklich auf die Reihenfolge auswirken kann, in der bestimmte Schritte auf dem ausgeführt werden DB.

SELECT TOP ist langsam, unabhängig von ORDER BY

Warum ist ein top(1) auf einer indizierten Spalte in SQL Server langsam?