2016-07-07 13 views
1

So bin ich ziemlich neu in SQL und wurden mit der Überarbeitung/Dokumentation von Programmen bei meinem aktuellen Praktikum beauftragt.Vorteil zu SELECT SELECT DISTINCT zu SELECT

auf die Jagd schneiden, ich auf einem Tisch die folgende Abfrage leite:

SELECT COUNT(*) as NumofAccounts 
    FROM Accounts 
     WHERE Deleted = 0 
     AND Account_ID In (SELECT DISTINCT Account_ID FROM Tasks WHERE Deleted = 0); 

, die ein Ergebnis von NumofAccounts = 18.

jedoch die ursprüngliche Abfrage war ergibt:

SELECT COUNT(*) as NumofAccounts 
     FROM Accounts 
      WHERE Deleted = 0 
      AND Account_ID In (SELECT Account_ID FROM Tasks WHERE Deleted = 0); 

Diese beiden Abfragen ergeben NumofAccounts = 18, wenn Sie jedoch diesen Teil der Abfrage isolieren:

SELECT Account_ID FROM Tasks WHERE Deleted = 0; 

Es gibt 736 Zeilen mit Ergebnissen, von denen viele doppelte Account_IDs sind.

Aber wenn man fügt DISTINCT:

SELECT DISTINCT Account_ID FROM Tasks WHERE Deleted = 0; 

Es gibt nur 18 Zeilen von Ergebnissen, die mit den NumofAccounts Halsen.

Gibt es eine Möglichkeit, die Laufzeit- oder Effizienzdiskrepanz zwischen diesen beiden Abfragen zu analysieren?

Entschuldigung für die langatmige Post!

+0

Die 'DISTINCT' wird aufgrund der automatischen Erstellung eines In-Memory-Index auf 'Account_ID' langsamer arbeiten. Es ist nicht notwendig, 'DISTINCT' in Kombination mit einer' IN'-Anweisung zu verwenden. –

+1

Als Referenz sehen Sie sich die geschätzten und tatsächlichen Ausführungspläne für Abfragen an: [(MSDN: Ausführungspläne)] (https://msdn.microsoft.com/en-us/library/ms189562 (v = sql.105) .aspx), mit dem Sie die von Ihnen benötigte Analyse durchführen können. –

+0

@ChrisPickford sie sind logisch identische Abfragen, die Abfrage-Engine kann wahrscheinlich arbeiten und identische Pläne für beide generieren. – Caleth

Antwort

3

Sie Ausführungsplan auf Abfrageausführungsplan drehen können und schauen, wie Ihre Abfrage ausgeführt wurde: Query execution plan

Auch Sie können auf Client-Statistiken drehen und Gesamtausführungszeit erhalten:

Statistics

Also, diese Instrumente verwenden Sie Compa können re verschiedene Abfragen, und wählen Sie eine bessere aus.

+0

Super! Vielen Dank! – WakaChewbacca

+1

@WakaChewbacca froh zu helfen, nicht davor zurück, mehr über Abfrage Ausführungspläne zu lesen - es ist wirklich sehr wichtige Informationen – Backs

0

Sie verwenden können gibt, die eine viel bessere Arbeit leisten können ..

SELECT COUNT(*) as NumofAccounts 
FROM Accounts a 
WHERE Deleted = 0 
AND exists (SELECT Account_ID FROM Tasks t WHERE t.Deleted = 0 and t.account_id=a.account_id) ; 

Wenn Sie Efficiency sagen, müssen Sie wie

auf wenige Bereiche verengen

1.Execution Zeit muss verbessert werden
2.query raubend mehr cpu
3.using mehr Speicher

wenn Ihre Effizienz zu Ausführungszeit verwandt ist, über Abfrage kann viel besser arbeiten ..

Ihre zwei Abfragen unterschiedlich von mehreren Faktoren ab, wie Indizes basierend arbeiten können auf diesen Tabellen zur Verfügung, gewählt

+1

Nicht wirklich, sollte den gleichen Ausführungsplan generieren. – Magnus