簡體   English   中英

如何使用參數提高SQL查詢的性能?

[英]How to improve performance of SQL query with parameters?

我正在使用SQL Server 2005。

我在執行這樣的SQL語句時遇到問題

DECLARE @Param1 BIT
SET @Param1 = 1

SELECT 
    t1.Col1,
    t1.Col2
FROM
    Table1 t1
WHERE
    @Param1=0 OR
    (t1.Col2 in 
        (SELECT  t2.Col4
            FROM 
                Table2 t2
            WHERE 
                t2.Col1 = t1.Col1 AND 
                t2.Col2 = 'AAA' AND 
                t2.t3 <> 0)
    )

該查詢執行時間很長。

但是,如果我將@Param1替換為1 ,則查詢執行時間約為2秒。

任何有關如何解決問題的信息將不勝感激。

好了,解釋似乎很簡單。 對於當前條件,由於@Param1=0為false(您之前將參數設置為1),因此它需要評估第二個條件,因為它有一個子查詢,可能會花費很長時間。 如果將第一個過濾器更改為@Param1=1 ,則表示它是正確的,並且無需評估第二個過濾器,從而使查詢更快。

您似乎將優化器與OR語句混淆了。 如果刪除它,您會發現它為SELECT語句生成了兩個不同的執行計划-一個帶有過濾器,另一個沒有:

DECLARE @Param1 BIT
SET @Param1 = 1

if @Param1=0
begin
    SELECT 
        t1.Col1,
        t1.Col2
    FROM
        Table1 t1
end
else
begin
    SELECT 
        t1.Col1,
        t1.Col2
    FROM
        Table1 t1
    WHERE
        (t1.Col2 in 
            (SELECT  t2.Col4
                FROM 
                    Table2 t2
                WHERE 
                    t2.Col1 = t1.Col1 AND 
                    t2.Col2 = 'AAA' AND 
                    t2.t3 <> 0)
        )
end

這通常稱為N + 1問題。
您在表1中進行選擇,對於找到的每個記錄,您將在表2中查找內容。
通過將@ Param1設置為在選擇中將永遠找不到的值,SQL引擎將跳過子查詢。
為了避免這種行為,您可以使用JOIN語句將兩個表連接在一起,然后使用where語句過濾結果。 join語句將比單個子查詢慢一些,因為您要相互匹配2個表,但是由於只需要執行一次聯接(相對於N次),您將獲得嚴重的性能提升。
示例代碼:

DECLARE @Param1 BIT
SET @Param1 = 1

SELECT t1.Col1,t1.Col2
FROM Table1 t1
INNER JOIN Table2 t2 on t1.Col1 = t2.Col1
WHERE @Param1=0 
OR t2.Col2 = 'AAA' 
AND t2.t3 <> 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM