2017-03-08 4 views
1

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?

+0

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 –

+0

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

+0

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 –

Antwort

0

Die geschätzte Zeit kann irreführend sein. Nur Live-Server-Statistiken sind live und aktualisiert, so dass der lokale Server oder etwas ähnliches die tatsächliche geschätzte Zeit nicht widerspiegelt.

Anderer Punkt ist, diese zwei Abfrage ist nicht in Ordnung. Die wahre Version dieser beiden Abfrage ist

Select tblProducts.Id, Name, Description from tblProducts inner join tblProductSales on tblProducts.Id = tblProductSales.ProductId group by tblProducts.Id, Name, Description

oder so ähnlich dont care te Syntax. Bevor Sie sich die Statistik ansehen, müssen Sie sich überlegen, ob dies die beste Version dieser Abfrage ist. Wenn Ihre Antwort ja ist, dann überlegen Sie sich die Statistik, dann wird Ihr statistisches Ergebnis aussagekräftiger.