2010-09-09 113 views
3

我正在使用SQL Server 2008 Enterprise。現在我有兩種模式來實現相同的功能(查看zoo1或zoo2或zoo3列是否包含一些文本,在模式1中,我合併了zoo1,zoo2和zoo3的內容以形成一個名爲zoo的新列),我認爲第一個模式總是比我的實驗更好的表現(我做了一些實驗)。但我不確定我是否正確,模式1的表現總是更好的內部原因是什麼?SQL Server like statement issue

模式1:

Select foo, goo from tablefoo where zoo like LIKE '%'[email protected]+'%' 

模式2(動物園是我合併柱zoo1,zoo2和zoo3的內容,以生成一列):

Select foo, goo from tablefoo where (zoo1 like LIKE '%'[email protected]+'%') OR (zoo2 like LIKE '%'[email protected]+'%') or (zoo3 like LIKE '%'[email protected]+'%') 

由於事先 喬治

+1

非常有趣的問題。 – 2010-09-09 07:31:14

+1

你如何構建組合列「動物園」?你是否在使用視圖,如果是,它是否被索引?您是否使用計算列,如果是,它是否持續?順便說一句,您的查詢可能容易受到SQL注入攻擊。 – 2010-09-09 07:40:32

+1

本週我已經回答了類似的問題http://stackoverflow.com/questions/3649673/what-indices-should-be-created-to-optimize-sql-query-with-multiple-or-conditions/3656415 #3656415 SQL索引幾乎落在查詢或a或b或c它更好做工會和單獨的查詢 – u07ch 2010-09-09 07:45:39

回答

3

或幾乎總是殺死性能。

在這種情況下,它是3列掃描vs 1列進行掃描。

在這兩種情況下,因爲你有一個領導%,則指數將不無論如何使用(可以掃描,因爲它涵蓋了動物園%列)

的1列是僅僅以3比不那麼糟糕列OR查詢。不「更好」。

+0

因此,結論是使用沒有OR的一點改進? – George2 2010-09-09 10:10:58

+1

@George:在這種情況下,是的。在其他情況下,它可能會更好 – gbn 2010-09-09 10:52:06

+0

使用前導%不使用索引,爲什麼? – George2 2010-09-09 13:27:41