2011-01-25 21 views
0

我發出以下SQL:如何提高這種情況下的SQL性能?

Select * from myTable 
where myID =123 
    and myDate >= (case when isnull(null,'')='' then myDate else null end) 

的表現非常糟糕。

如果我修改它是這樣的:

Select * from myTable 
where myID =123 
    and myDate >= myDate 

的表現要好得多。

我真正的SQL可能是這樣的:

Select * from myTable 
where myID =123 
    and myDate >= (case when isnull(@myDate,'')='' then myDate else null end) 

myDateDatetime列。

如何提高這種情況下的性能?

+1

myTable上的索引是什麼? –

+1

這是爲什麼? 'isnull(null,'')' – gbn

+0

'性能要好得多。'那是因爲你有一個dud子句'mydate> = mydate',它總是爲100% – RichardTheKiwi

回答

0

如果T-SQL,則:

DECLARE @myDate DATETIME 
SET @myDate = NULL 
IF @myDate IS NOT NULL 
BEGIN 
    SELECT * 
    FROM myTable 
    WHERE myID = 123  
    AND myDate >= @myDate 
END 
ELSE 
BEGIN 
    SELECT * 
    FROM myTable 
    WHERE myID = 123  
    AND myDate >= '' 
END 

ELSE Param'd SQL:

SELECT * 
    FROM myTable 
WHERE myID = 123  
    AND (@myDate IS NULL OR myDate >= @myDate) 

編輯:不添加到IF條件。

+0

1.在第一個查詢中,IF條件應該可能是:「如果@myDate不是NULL」。 2.爲什麼第二個查詢不能與T-SQL一起使用? –

+0

@Andriy:更正了IF條件:) Thx。關於第二個查詢,它在T-SQL中也起作用。 – Chandu

0

嘗試

Select * from myTable where myID =123 and (@myDate IS NULL OR myDate IS NULL) 

如果這還不夠好樣的,在myDate

0

第一個好消息是,你會喜歡聚結增加一個索引:

Select * from myTable 
where myID =123 
    and COALESCE(myDate,'') >= @myDate 

如果指明MyDate是一個字符,因爲它似乎是,然後擺脫這些空值,並用空字符串替換。

...我假設你有一個複合索引(身份識別碼,指明MyDate)

1

試試這個。它適用於myDate不可爲空的情況。

,要確定指明MyDate和@myDate具有相同的數據類型

Select * from myTable 
where myID =123 
    and myDate >= isnull(@myDate, myDate) 

謹防COALESCE的:它可以demonstratably慢,因爲那麼ISNULL如何處理數據類型