2016-05-14 52 views
1

表結構:TSQL加入,查詢處理順序和存儲

CREATE TABLE dbo.Transactions 
(
    actid INT NOT NULL, --Account ID 
    tranid INT NOT NULL, -- Transaction ID 
    val MONEY NOT NULL, --- Transaction value 

    CONSTRAINT PK_Transactions PRIMARY KEY(actid, tranid) 
); 

以下低效的查詢試圖確定每次交易後運行平衡

SELECT 
    T1.actid, T1.tranid, T1.val, 
    SUM(T2.val) AS balance 
FROM 
    dbo.Transactions AS T1 
JOIN 
    dbo.Transactions AS T2 ON T2.actid = T1.actid 
          AND T2.tranid <= T1.tranid 
GROUP BY 
    T1.actid, T1.tranid, T1.val; 

我不知道如何加入被處理在查詢中。是否將聯接視爲子查詢,其中每個組(T1.actid, T1.tranid, T1.val)都會執行聯接語句?這是否意味着如果有10K Transactions,10K加入的數據集是由這個查詢創建的?

回答

0

在SSMS中執行您的查詢。然後突出顯示它並按Ctrl + L查看執行計劃。這將顯示你的SQL Server計劃如何執行查詢,有時建議索引等

0

這意味着你將會有確切的行數的加入滿足

在T1中的每一行進行處理,並從行帶來T2滿足連接條件。

該連接可以作爲循環,散列或合併處理。通常情況下,優化器使用散列。

最好的想法就是運行它。輸出應該講述一個故事。

0

要知道的唯一方法是通過'學習'查詢計劃。

FYI:在我看來,你的查詢等效於

SELECT 
    T1.actid, T1.tranid, T1.val, 
    balance = (SELECT SUM(T2.val) 
       FROM dbo.Transactions 
       WHERE T2.actid = T1.actid 
        AND T2.tranid <= T1.tranid) 
FROM 
    dbo.Transactions AS T1 

說實話,我更喜歡「這個」版本,因爲它看起來更具有可讀性給我;我也希望這個版本稍微「精簡」一點,因爲排序需求較少,但只有實際測試才能說明問題。看到優化器在幕後做什麼有時令人驚訝!再次,查詢計劃將顯示。

因此,運行這兩個查詢並比較生成的查詢計劃,那些應該給你一個關於它們的相對成本的想法。現在,請記住,「成本」並不總是與「時間」直接相關;所以你可能想檢查一下你的硬件和'典型負載'下運行的速度。還要記住例如緩存可能在這裏有效果!