我正在尋找最佳方式來搜索包含以保存爲以指定字符串鍵結尾的varchar列的序列號的數百萬條記錄。找到以鍵結尾的記錄的最快方法
我在使用EndsWith,但是如果發送幾個查詢,性能相當差。
有沒有更好的方法來做到這一點?
編輯:
由於檢索關鍵字的長度是可變的,我不能創建包含序列號的截止值列。不過,我已經使用Substring和Equals vs EndsWith做了一些測試,我已經將執行速度降低到了EndsWith之一的40%。
我仍然在尋找更好的解決方案雖然:)
我正在尋找最佳方式來搜索包含以保存爲以指定字符串鍵結尾的varchar列的序列號的數百萬條記錄。找到以鍵結尾的記錄的最快方法
我在使用EndsWith,但是如果發送幾個查詢,性能相當差。
有沒有更好的方法來做到這一點?
編輯:
由於檢索關鍵字的長度是可變的,我不能創建包含序列號的截止值列。不過,我已經使用Substring和Equals vs EndsWith做了一些測試,我已經將執行速度降低到了EndsWith之一的40%。
我仍然在尋找更好的解決方案雖然:)
不幸的是,搜索與特定的形式結尾的字符串很難在大多數數據庫+,因爲搜索字符串後綴不能使用索引。這會導致全表掃描,對於有數百萬行的表格可能會很慢。
如果您的數據庫支持反向索引,請爲您的字符串鍵列添加一個;否則,您可以通過模擬反向指標提高性能:
舉例來說,如果你有數據這樣
key
-----------
01-02-3-xyz
07-12-8-abc
則增加表將具有
key rev_key
----------- -----------
01-02-3-xyz zyx-3-20-10
07-12-8-abc cba-8-21-70
和你的ENDS_WITH(key, '3-xyz')
搜索會要求STARTS_WITH(rev_key, 'zyx-3')
。由於字符串索引通過前綴加速查找,因此「開始於」查找會更快。
我會嘗試你的解決方案,並看到實際的性能改進,只要我反向生成反向鍵。我喜歡這個想法:) – 2013-03-25 11:53:42
不幸的是,這沒有取得任何性能優化。速度與EndsWith完全一致。太糟糕了,聽起來像是智能解決方案:( – 2013-03-25 12:48:53
@BarisaPuter這很奇怪,你可以嘗試使用像'zyx-3%'這樣的'rev_key'而不是以? – dasblinkenlight 2013-03-25 12:54:05
什麼是您的底層數據庫? – dasblinkenlight 2013-03-25 09:51:45
可能是SQL服務器......但是什麼版本(2008,2008r2,2012)和版本(express,standard,enterprise ...)? – tschmit007 2013-03-25 10:01:02
SQL Server 2008 R2 Express是我正在使用的數據庫,並且正在使用Entity Framework 5.0。 – 2013-03-25 11:52:22