2016-07-07 75 views
1

因此,我對SQL相當陌生,並且在我目前的實習中負責修改/記錄程序。將SELECT DISTINCT運行到SELECT的優點

要切入,我運行上的表以下查詢:

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

其產生NumofAccounts = 18

然而原始查詢是的結果:

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

這兩個查詢都會產生NumofAccounts = 18,但是,如果分隔查詢的這一部分:

SELECT Account_ID FROM Tasks WHERE Deleted = 0; 

有736行結果,其中很多都是重複的Account_IDs。

但如果加上DISTINCT:

SELECT DISTINCT Account_ID FROM Tasks WHERE Deleted = 0; 

只有18行的結果,這與NumofAccounts嘲弄。

有什麼辦法可以分析這兩個查詢之間的運行時間或效率差異嗎?

對不起,冗長的帖子!

+0

由於'Account_ID'中的內存索引自動創建,'DISTINCT'會執行得更慢。不需要將'DISTINCT'與'IN'語句結合使用。 –

+1

僅供參考,請參閱查詢的估計和實際執行計劃:[(MSDN:execution plans)](https://msdn.microsoft.com/en-us/library/ms189562(v = sql.105) .aspx)這將允許你執行你需要的分析。 –

+0

@ChrisPickford它們在邏輯上是相同的查詢,查詢引擎可能可以解決這個問題併爲它們生成相同的計劃。 – Caleth

回答

3

您可以打開查詢執行計劃,看看如何在您的查詢執行: Query execution plan

而且,你可以打開客戶端的統計數據,並獲得總執行時間:

Statistics

因此,使用這些工具,你可以COMPA重新選擇不同的查詢,並選擇更好的一個

+0

太棒了!謝謝! – WakaChewbacca

+1

@WakaChewbacca樂於提供幫助,不要因爲閱讀關於查詢執行計劃的更多信息而煩惱 - 這真的是非常重要的信息 – Backs

0

可以使用存在哪些可以做一個更好的工作..需要

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) ; 

當你說效率,需要縮小到幾個領域,如

1.Execution時間有待提高
2.query消耗更多的CPU
3.使用更多的內存

如果你的效率與執行時間,上面的查詢可以工作更好..

你兩個查詢可能工作方式不同基於對這些表提供了一些因素,如索引,執行計劃choosen

+1

不是,應該生成相同的執行計劃。 – Magnus