2013-03-25 43 views
1

我正在尋找最佳方式來搜索包含以保存爲以指定字符串鍵結尾的varchar列的序列號的數百萬條記錄。找到以鍵結尾的記錄的最快方法

我在使用EndsWith,但是如果發送幾個查詢,性能相當差。

有沒有更好的方法來做到這一點?

編輯:

由於檢索關鍵字的長度是可變的,我不能創建包含序列號的截止值列。不過,我已經使用Substring和Equals vs EndsWith做了一些測試,我已經將執行速度降低到了EndsWith之一的40%。

我仍然在尋找更好的解決方案雖然:)

+1

什麼是您的底層數據庫? – dasblinkenlight 2013-03-25 09:51:45

+0

可能是SQL服務器......但是什麼版本(2008,2008r2,2012)和版本(express,standard,enterprise ...)? – tschmit007 2013-03-25 10:01:02

+0

SQL Server 2008 R2 Express是我正在使用的數據庫,並且正在使用Entity Framework 5.0。 – 2013-03-25 11:52:22

回答

4

不幸的是,搜索與特定的形式結尾的字符串很難在大多數數據庫+,因爲搜索字符串後綴不能使用索引。這會導致全表掃描,對於有數百萬行的表格可能會很慢。

如果您的數據庫支持反向索引,請爲您的字符串鍵列添加一個;否則,您可以通過模擬反向指標提高性能:

  • 添加一列用於存儲反向
  • 您的字符串鍵如果您的RDBMS支持computed columns,加一對反鍵
  • 否則,定義一個觸發器填充關鍵列中的反向列
  • 在反向列上創建索引
  • 通過傳入您正在查找的反向後綴來爲搜索使用反轉列。

舉例來說,如果你有數據這樣

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')。由於字符串索引通過前綴加速查找,因此「開始於」查找會更快。


+一個值得注意的例外是Oracle,其專門針對這樣的情況下提供 reverse key indexes

+0

我會嘗試你的解決方案,並看到實際的性能改進,只要我反向生成反向鍵。我喜歡這個想法:) – 2013-03-25 11:53:42

+0

不幸的是,這沒有取得任何性能優化。速度與EndsWith完全一致。太糟糕了,聽起來像是智能解決方案:( – 2013-03-25 12:48:53

+0

@BarisaPuter這很奇怪,你可以嘗試使用像'zyx-3%'這樣的'rev_key'而不是以? – dasblinkenlight 2013-03-25 12:54:05