2013-05-09 17 views
2

假設我有一個已定義的視圖如下:TSQL - 查看VS存儲過程:當應用謂詞性能考慮

CREATE VIEW [dbo].[vData_Values] AS 
    SELECT ParentId, TimeStamp, Value From Table1 
    UNION ALL 
    SELECT ParentId, TimeStamp, Value FROM Table2 
    UNION ALL 
    SELECT ParentId, TimeStamp, Value FROM Table3 
    UNION ALL 
    SELECT ParentId, TimeStamp, Value FROM Table4 

假設我寫反對我的視圖的查詢,如下所示:

SELECT ParentId, TimeStamp, Value 
    FROM vData_Values 
    WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59' 

有沒有人希望查詢的視圖執行不同於存儲過程與視圖相同的內部查詢,但在每個步驟具有相同的WHERE子句。例如:

CREATE PROCEDURE [dbo].[GetValues] 
(
... 
) 
AS 
BEGIN 

    SELECT ParentId, TimeStamp, Value From Table1 
    WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59' 
    UNION ALL 
    SELECT ParentId, TimeStamp, Value FROM Table2 
    WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59' 
    UNION ALL 
    SELECT ParentId, TimeStamp, Value FROM Table3 
    WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59' 
    UNION ALL 
    SELECT ParentId, TimeStamp, Value FROM Table4 
    WHERE ParentId IN (...) and TimeStamp BETWEEN '1/1/2013' AND '3/31/2013 23:59' 

END 

我想概念化如果/如何/如何這兩個將被處理/優化不同。通過「分塊」處理各個查詢並將謂詞分別應用於每個查詢,是否有任何性能提升?

謝謝。

+3

檢查執行計劃。我希望SQL Server在這種情況下推送謂詞沒有困難。你也應該使用明確的dateformat作爲'datetime'字面值,並且可能不使用'BETWEEEN',除非時間絕對不是以秒存儲的。 – 2013-05-09 13:16:40

回答

0

比較執行計劃

下面執行計劃相同

CREATE VIEW [dbo].[docSVsysInt] AS 
    select sID 
    from docSVsys 
    union 
    select sID 
    from docSVint 

    select sID 
    from [docSVsysInt] 
    where sID > 100000 and sID < 100010 

    select sID 
    from docSVsys 
    where sID > 100000 and sID < 100010 
    union 
    select sID 
    from docSVint 
    where sID > 100000 and sID < 100010 

    select sID 
    from 
    (
    select sID 
    from docSVsys 
    union 
    select sID 
    from docSVint 
) comb 
    where sID > 100000 and sID < 100010 
0

我自己有這個問題,發現存儲proc版本更快。我相信(並且我沒有做太多的調查),但我相信它會首先完成所有記錄的結合,然後過濾。存儲的proc過濾每個片段,然後將它們聯合起來,所以假設會有更少的記錄。

現在的東西我沒有嘗試是一個UNION ALL它包括重複的(可能不檢查值)。

所以,不幸的是,如果你要處理很多很多的記錄,之間你展示的兩個樣本 - 存儲過程將會更快。 (我說,不幸的是,因爲你必須預先建立的where子句。)

嘗試看執行計劃,看看它說(我很好奇也。)