2010-10-14 37 views
6

有些文章我與COALESCE互聯網相比ISNULL發現空的性能,所以我覺得我的問題是有點不同。COALESCE VS IS NOT上檢查空字符串

我不知道這是在性能方面更好

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> ''; 

或者

SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> ''; 

除了性能,有沒有決定什麼時候我應該考慮任何其他問題?

編輯:

我正在使用Teradata。

回答

7

這個版本是稍微更優化搜索,允許索引是(可能)使用

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> ''; 

可爲什麼我說「稍微」和「可能被簡化爲

SELECT * FROM mytable WHERE mycolumn <> ''; 

原因「是不平等謂詞可能意味着你最終會進行完整的掃描。

+0

作爲後續行動的問題,如果我們知道一個索引將被使用,我們也許能夠自動優化SQL(幕後)和翻譯COALESCE(mycolumn,「」)<>「」到mycolumn IS NOT NULL和mycolumn <>''。我有道理嗎? – Russell 2010-10-14 16:41:41

+0

我相信你可能會發現NUSI可能不會被用來滿足不平等比較。值得看看EXPLAIN來確認優化器是否使用NUSI。 – 2010-10-15 14:15:24

1

您也可以考慮使用ANSI_NULL ON setting。這將隱式地過濾出您發佈搜索參數的列上的空值。這樣做會簡化您的查詢,我不確定它是否更快。理論上它應該是這樣,因爲需要評估更少的過濾器參數,並且在where子句中沒有使用函數來實現完整的索引選擇性。作爲一個例子,你可以重新考慮這樣的問題:

SET ANSI_NULLS ON; 
SELECT * FROM mytable WHERE NOT mycolumn = ''; 

我希望這會有所幫助。