2011-05-25 153 views
1

我有一個表中的多個記錄看起來像這樣的:性能問題

 COLUMN1  | NUMBER 
-------------------------------------- 
'http://namespace1/#1'|  1 
'http://namespace1/#2'|  0 
'http://namespace1/#3'|  0 
'http://namespace1/#4'|  0 
'http://namespace2/#1'|  0 
'http://namespace2/#2'|  0 
'http://namespace2/#3'|  0 
'http://namespace2/#4'|  1 
... 

現在,我的查詢看起來是這樣的:

SELECT COLUMN1 FROM MyTable WHERE NUMBER = 1 AND COLUMN1 LIKE 'http://namespace1/%' 

問題這個查詢就是這樣,當表中有很多記錄時,它非常慢。只能返回一條記錄。

查詢有更快的選擇嗎?

+3

你有'COLUMN1'上的索引,不是嗎?另外,你的價值觀有多獨特? %數據以'http:// namespace1'開始? – GSerg 2011-05-25 15:17:33

+0

@GSerg是column1已編入索引 – 2011-05-25 15:19:29

+2

您是否檢查過查詢的查詢計劃? – 2011-05-25 15:19:50

回答

1

由於只能返回一條記錄,因此可以執行top(1)。在某些情況下,top(1)會在第一次比賽時停止條件循環(當沒有order by時)。查詢將會更快。

SELECT top(1) COLUMN1 FROM MyTable WHERE NUMBER = 1 AND COLUMN1 LIKE 'http://namespace1/%' 
+0

這是基於樣本數據的一條記錄的假設。但是,這仍然是錯誤的。 TOP在JOIN和WHERE之後應用。請參閱http://msdn.microsoft.com/en-us/library/ms189499.aspx。這意味着查詢不會停止,直到它具有與WHERE條件匹配的所有行。 – gbn 2011-05-25 19:51:07

+0

您將不得不向我解釋爲什麼沒有top(1)(query1)和查詢(query2)的查詢在性能上有如此巨大的差異。這兩個查詢返回的數據量相同,但query2速度更快(查詢1爲900毫秒,查詢2爲小於50毫秒)。 – 2011-05-25 20:06:37

+0

我沒有看到它是你的問題。可能是因爲NUMBER = 1時只有一行,因此它對齊(基於統計數據)。或者它刪除潛在的密鑰查找(由於沒有發佈查詢計劃,因此無法查看)。我*不會依賴於這個:像這樣的TOP會讓事情變得更糟。當我(和另外兩個人)提出建議時,你是否在這兩列創建了索引?如果沒有,請嘗試沒有TOP。如果你有,發生了什麼事? – gbn 2011-05-25 20:14:54

2

因爲WHERE子句有2個條件,所以您需要在NUMBER和COLUMN1列上使用索引。

當前的COLUMN1索引由於NUMBER = 1位而被忽略,或者它與鍵查找一起使用以獲得NUMBER。無論哪種方式,這解釋了OP所看到的。

編輯:

無論指數(NUMBER,COLUMN1)(COLUMN1,NUMBER)是試驗和錯誤。 我懷疑第二個如果只有2號值,但情況因人而異

+0

+1兩列索引擊敗我...... – takrl 2011-05-25 15:23:02

+0

索引如何幫助您在列上使用像運算符時的幫助? – Deepesh 2011-05-25 15:23:56

+2

@ user751975:它仍然可以在索引中進行詞幹搜索,只用尾隨通配符。當您查看「gb%」的(實際)圖書索引時,您需要先掃描g..b,然後再掃描「gb」範圍。另一種方式:'gb%'與'>'gb'相同並且<'gc'' – gbn 2011-05-25 15:28:26

0

一個covering indexCOLUMN1NUMBER,無論是聚集或非聚集,可能是最好的選擇。

1

在column1和number列上添加索引。嘗試兩種方式,column1和number/number和column1。一次嘗試一個索引。根據數據可能會有所不同。

索引有助於類似的命令,其中%不在類似值的前面。在這種情況下,它應該有很大的幫助。