【问题标题】:Do regex search on int column efficiently?正则表达式是否有效地搜索 int 列?
【发布时间】:2012-04-27 01:18:43
【问题描述】:

假设整数列id上有一个索引,

我如何有效地找到那些id 匹配%789% 的记录?

id LIKE '%789%' 将无法使用索引并且会出现性能问题。

有什么诀窍可以有效地完成这项工作吗?

【问题讨论】:

  • 我怀疑你问错了问题。我希望有一种更简洁、更有效的方式来实现你想要做的事情。在一个完全基本的级别上,您可以拥有一个只有一列的表,其中包含所有整数而不是符合您的规范。只需在连接中使用此表即可删除您不想要的行,效率更高。

标签: sql sql-like sql-optimization


【解决方案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 会阻止使用该索引。
    猜你喜欢
    • 2016-11-17
    • 2016-06-06
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2011-04-08
    • 2013-11-02
    相关资源
    最近更新 更多