查找以密钥结尾的记录的最快方法

时间:2013-03-25 09:50:26

标签: performance linq entity-framework

我正在寻找最佳方法来搜索数百万条记录,这些记录包含保存为varchar列的序列号,该列以指定的字符串键结尾。

我使用的是EndsWith,但是如果发送了多个查询,性能会相当差。

有更好的方法吗?

修改

由于搜索键长度可变,因此我无法创建包含序列号截止值的列。但是,我已经完成了一些使用Substring和Equals vs EndsWith的测试,并且我已经将执行速度降低到了EndsWith的40%。

我仍在寻找更好的解决方案:)

1 个答案:

答案 0 :(得分: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