正则表达式是不是有效地搜索 int 列?
Posted
技术标签:
【中文标题】正则表达式是不是有效地搜索 int 列?【英文标题】:Do regex search on int column efficiently?正则表达式是否有效地搜索 int 列? 【发布时间】:2012-04-27 01:18:43 【问题描述】:假设整数列id
上有一个索引,
我如何有效地找到那些id
匹配%789%
的记录?
id LIKE '%789%'
将无法使用索引并且会出现性能问题。
有什么诀窍可以有效地完成这项工作吗?
【问题讨论】:
我怀疑你问错了问题。我希望有一种更简洁、更有效的方式来实现你想要做的事情。在一个完全基本的级别上,您可以拥有一个只有一列的表,其中包含所有整数而不是符合您的规范。只需在连接中使用此表即可删除您不想要的行,效率更高。 【参考方案1】:您可以创建一个计算列,如 convert(varchar(20), int_column) 并在其上放置一个索引。每当您想对 int_column 使用 LIKE 运算符时,您可以改为对计算列执行此操作。
【讨论】:
【参考方案2】:如果您的模式真的被打包在一起(而不是像 %4%5%6% 之类的东西),您可能会考虑将模式扩展为相应的整数比较。它确实会爆炸您的代码,但应该会大大加快实际搜索速度。
试试:
mod( id, 1000 ) = 789 or
(7890 <= mod( id, 10000 ) and mod( id, 10000 ) < 7900) or
(78900 <= mod( id, 100000 ) and mod( id, 100000 ) < 79000) or
(789000 <= mod( id, 1000000 ) and mod( id, 1000000 ) < 790000) or
...
(789000000 <= mod( id, 1000000000 ) and mod( id, 1000000000 ) < 790000000
显然,如果您知道键的范围是有界的,则可以减少比较次数。
【讨论】:
这真的优化了吗?我认为 sql server 仍然需要遍历 all 记录来进行所有的比较。 OP 说他在整数列上有一个索引。对整数索引进行一堆整数比较应该很快。 有没有办法进一步限制扫描的行数?正如explain
所示,这种sql 仍然会扫描所有行。
您对列中的整数值还有其他了解吗?它在一定范围内,还是总是一个奇数或任何东西?
虽然此列已编入索引,但我怀疑在比较中使用它之前修改 id 会阻止使用该索引。以上是关于正则表达式是不是有效地搜索 int 列?的主要内容,如果未能解决你的问题,请参考以下文章