I Ausführung bin nach zwei Abfragen und Erfassen geschätzten Unterstruktur Kosten sowie Statistik ZeitLeistung von Sub-Abfrage vs beitreten
SET STATISTICS TIME ON
DROPCLEANBUFFERS;
DBCC FREEPROCCACHE
Select Id, Name, Description
from tblProducts
where ID IN
(
Select ProductId from tblProductSales
)
DBCC DROPCLEANBUFFERS;
DBCC FREEPROCCACHE
Select distinct tblProducts.Id, Name, Description
from tblProducts
inner join tblProductSales
on tblProducts.Id = tblProductSales.ProductId
Also, Ergebnis, das ich bekommen habe ist
Geschätzte subtree Kosten (subquery) - 0.458276 Geschätzte Kosten subtree (Join) - 0,458982
Statistik Time (subquery):
SQL Server analysieren und kompilieren Zeit: CPU-Zeit = 16 ms, verstrichene Zeit = 163 ms.
(7063 Zeile (n) betroffen)
SQL Server Ausführungszeiten:
CPU Zeit = 109 ms, die verstrichene Zeit = 726 ms.
Statistik Time (Join):
SQL Server Parse und kompilieren Zeit: CPU-Zeit = 16 ms, verstrichene Zeit = 654 ms.
(7063 Zeile (n) betroffen)
(1 Zeile (n) betroffen)
SQL Server Ausführungszeiten: CPU-Zeit = 62 ms, die verstrichene Zeit = 624 ms.
So können wir join
CPU-Zeit (62 ms) weniger als subquery
CPU-Zeit (109 ms) sehen, aber geschätzten Unterbaum Kosten in join
als subquery
höher ist.
Also, was ist die Schlussfolgerung wer ist besser?
Sie vergleichen Schätzungen und Istwerte. Schätzungen sind eine Schätzung des Aufwands, der zur Bewertung des besten Plans auf der Grundlage von Statistiken verwendet wird, während die CPU-Zeit _actually_ ist, was passiert ist. Wenn Sie an der besten Abfrage interessiert sind, sollten Sie auch 'WHERE EXISTS' verwenden. Heutzutage gibt es keinen allzu großen Unterschied zwischen den drei –
Die Ausführungszeiten sind nicht wirklich hilfreich, da sie von vielen Faktoren beeinflusst werden können.Verwenden Sie SET STATISTICS IO ON, um zu sehen, welche Lesevorgänge durchgeführt wurden. Die Zeiten sind nicht wirklich hilfreich. Gibt es auch Indizes für die Tabellen? Sind 'tblProducts.Id' und' tblProductSales.ProductId' indiziert? –
Eine performantere Abfrage könnte lauten: Wählen Sie eine eindeutige ID, einen Namen, eine Beschreibung von tblProducts wo vorhanden (wählen Sie * aus tblProductSales aus, wobei tblProducts.Id = tblProductSales.ProductId) '. Dies verwendet 'exists'. In einigen Fällen könnte dies schneller sein –