2010-09-16 76 views
2

就性能而言,like運算符在應用於具有多個佔位符的字符串時的行爲如何?SQL Server like statement for %%

例如:

select A from table_A where A like 'A%' 

採用相同的時間比

select A from table_A where A like 'A%%' 

選擇???

+4

爲什麼你想/需要在字符串的末尾多於一個%? – 2010-09-16 20:54:15

+0

原因是我正在處理動態連接字符串以符合最終查詢的代碼。由於這種混亂的流程,可能會出現多個'%%'事件,我擔心這可能會對應用程序的最終性能產生影響。 – Jazz 2010-10-05 21:06:39

回答

8

您的疑問:

select A from table_A where A like 'A%' 

select A from table_A where A like 'A%%' 
            ^optimizer will remove second redundant % 

是等價的,優化器將刪除第二個%在第二個查詢

就像它會刪除從1=1

select A from table_A where A like 'A%%' and 1=1 

但是,這種查詢是非常不同的:

select A from table_A where A like '%A%' 

的使用'A%'時,它會使用索引來查找一切開始與A,就像使用電話本將很快尋找的開始一個人名稱。但是,當使用'%A%'時,它將掃描整個表以查找包含A的任何內容,因此速度較慢且無索引使用。就像如果你必須在電話簿中找到包含A的所有名字,這將需要一段時間!

+0

感謝您的回答。這正是我想要了解的。如果優化器將擺脫重複的%。你可以分享任何鏈接閱讀關於優化器的更多細節嗎? – Jazz 2010-09-20 12:58:46

+0

看看這個網站:http://www.sommarskog.se/index.html。動態搜索條件文章將會詳細介紹優化器的工作原理 – 2010-09-20 13:28:33

+0

偉大的鏈接!非常感謝你! – Jazz 2010-10-05 21:04:03

1

它會對待他們一樣。如果列A上有一個索引,它將像使用單個通配符一樣使用該索引。但是,如果要添加前導通配符,則無論索引是否存在,都會強制進行表掃描。

0

大多數情況下,您使用的模式不會影響查詢的性能。性能的關鍵是適當使用索引。在您的示例中,列上的索引將運行良好,因爲它會查找以「A」開頭的值,然後匹配完整模式。周圍可能會有一些更具挑戰性的模式,但它們之間的性能差異可以忽略不計。

有一個重要的條件,通配符會損害性能。而且,這是在模式開始時。例如,'%A'不會從索引中獲益,因爲它表示您想匹配任何以任何有效字符開頭的值。必須評估所有行以符合此標準。

+0

和原因和索引掃描,而不是索引查找。 – DForck42 2010-09-17 16:06:50