2013-03-25 46 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