2010-06-21 162 views
0

我注意到,在大型表上使用LIKE的第一個sql語句運行非常緩慢(大約20分鐘),但每個後續的一個非常非常快(幾秒鐘),即使是 如果字符串搜索完全不同於最初的 (第一個字符串'能力%',第二個'su_mit%')sql server 2008 LIKE性能

sql服務器是否將「like語句」的表掃描結果存儲在緩存中? 所有客戶端都可以訪問可能的緩存嗎?
「緩存」是否過期?
如果全文索引可用於應用和填充LIKE的同一列,「緩存」是否會影響全文速度?
有沒有人知道解釋問題的文檔?
乾杯
格雷格

回答

1

什麼您遇到最有可能的表在buffer cache(高速緩存內存中的數據頁)第一次掃描後,爲部分(或全部)的結果。根據您使用掃描,可用內存和其他正在緩存的表訪問同一個表的頻率,SQL Server可能會將您的表的頁保留在緩衝區緩存中,或者可能會因其他人的利益而將其撞上。

對於沒有領先的通配符查詢(如上面你的例子),如果要查詢的列都與一個普通索引收錄,你可以將其降低到索引掃描...

全文索引LIKE操作符沒有使用,如果列上有全文索引,那麼從LIKE查詢更改爲全文查詢可能是一個好主意...請參閱http://msdn.microsoft.com/en-us/library/ms142559.aspx

+0

索引是不幸的不是一個選項 - 字符串可以在任何地方的字段和大小太大,無法索引.. 如果它是在內存中的頁面,所以我想它是不可靠的性能 - 他們可能會出去內存在任何時候... – Greg 2010-06-21 11:16:46

+0

好吧,聽起來像全文索引將是你最好的選擇... ...是的,緩衝區緩存中的頁面可以在任何時候被其他查詢碰到(除非你有足夠的空間RAM以適應內存中的整個數據庫:))。 – KristoferA 2010-06-21 12:12:29

0

SQL Server基本上像虛擬內存系統,所以當你進行第二次表掃描時,你看到的性能提升只是更多的頁面在內存中。

我不是SQL服務器專家,所以也許別人可以爲此添加更多細節,但是當您使用LIKE時,基本上是刪除數據庫使用任何索引的能力。如果要使用全文索引,則需要使用特定的全文索引查詢命令FREETEXT,FREETEXTTABLE,CONTAINS和CONTAINSTABLE之一。