2017-02-28 38 views
-4

我正在嘗試調試執行速度很慢的查詢。它有幾個with表達式,它們是left joined。當我刪除連接時,它會顯着加速。SQL Server是否執行CTE表達式(如果未使用)?

原始查詢:

;with CTE as 
(
    Select * 
    from table1 
) 
SELECT * 
FROM table2 
LEFT JOIN CTE ON table2.CTEID 

性能更好的查詢:

;with CTE as 
(
    Select * 
    from table1 
) 
SELECT * 
FROM table2 

在上文中,它不執行CTE,因爲它沒有加入,或者不管它執行什麼?

+0

實際查詢如何?除了一句話之外,我們無法提供很多幫助。 「with」是您如何定義公用表格表達式。這不是一個變量。 –

+0

我想這就是我困惑的地方。當你使用它時,它實際上在表達式內部執行查詢,還是在調用它時執行查詢? –

+0

這是一個內聯視圖,它不被調用。它是查詢的一部分。 –

回答

3

我的猜測可能不是 - 查詢優化器是非常聰明的關於不執行不必要的東西。每個查詢都是不同的,查詢優化器使用有關您實際數據的統計信息來決定如何評估它,因此唯一可以確定的方法是讓SQL Server告訴您它如何評估您的查詢。

要做到這一點,請在SQL Server Management Studio中使用「包括實際執行計劃」執行查詢,並且您將清楚地看到它如何評估查詢。

+0

謝謝,我沒有想到執行計劃。你是對的。 Contra Sean評論說它沒有執行CTE。 –

+1

嗯,我想定義一個cte而不使用它將是完全荒謬的,但它會有道理,它不會選擇數據,因爲它從來沒有被選中。 –

+0

很好,我想了解它是CTE還是導致瓶頸的加入。雖然我現在知道這是我個人案例的加入(運行CTE的內容表現良好),但我想更好地理解發生了什麼。 –