[英]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.