就性能而言,like
運算符在應用於具有多個佔位符的字符串時的行爲如何?SQL Server like statement for %%
例如:
select A from table_A where A like 'A%'
採用相同的時間比
select A from table_A where A like 'A%%'
選擇???
就性能而言,like
運算符在應用於具有多個佔位符的字符串時的行爲如何?SQL Server like statement for %%
例如:
select A from table_A where A like 'A%'
採用相同的時間比
select A from table_A where A like 'A%%'
選擇???
您的疑問:
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的所有名字,這將需要一段時間!
它會對待他們一樣。如果列A
上有一個索引,它將像使用單個通配符一樣使用該索引。但是,如果要添加前導通配符,則無論索引是否存在,都會強制進行表掃描。
大多數情況下,您使用的模式不會影響查詢的性能。性能的關鍵是適當使用索引。在您的示例中,列上的索引將運行良好,因爲它會查找以「A」開頭的值,然後匹配完整模式。周圍可能會有一些更具挑戰性的模式,但它們之間的性能差異可以忽略不計。
有一個重要的條件,通配符會損害性能。而且,這是在模式開始時。例如,'%A'不會從索引中獲益,因爲它表示您想匹配任何以任何有效字符開頭的值。必須評估所有行以符合此標準。
和原因和索引掃描,而不是索引查找。 – DForck42 2010-09-17 16:06:50
爲什麼你想/需要在字符串的末尾多於一個%? – 2010-09-16 20:54:15
原因是我正在處理動態連接字符串以符合最終查詢的代碼。由於這種混亂的流程,可能會出現多個'%%'事件,我擔心這可能會對應用程序的最終性能產生影響。 – Jazz 2010-10-05 21:06:39