我正在寻找最佳方式来搜索包含以保存为以指定字符串键结尾的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