【问题标题】:will PostgreSQL optimize LIKE '%'?PostgreSQL 会优化 LIKE '%' 吗?
【发布时间】:2012-11-12 20:44:03
【问题描述】:

我想知道如果名称不为空,SELECT * FROM foo 是否会比SELECT * FROM foo WHERE name LIKE '%' 执行得更快?

对文档的任何引用?

【问题讨论】:

  • 您为什么不尝试执行这两个查询并自己检查结果?
  • b/c 它如何在某人的机器上执行并不能回答这个问题,重要的是它在理论上应该如何工作 - 他们是否实施了这种优化

标签: sql postgresql sql-execution-plan


【解决方案1】:

您的两个查询都将扫描整个表。 name 是否为 NOT NULL 仅在极少数情况下很重要,即存在 (1) name 上的索引和 (2) 它 非常非常 稀疏。只有这样 PostgreSQL 才会考虑从名称索引中查找记录。

在所有其他情况下,这个SQLFiddle 表明LIKE 版本添加了一个过滤器,必须检查该过滤器。 PostgreSQL 没有针对非空 varchar 列删除 LIKE '%' 的优化,尽管它看起来很合理。

表 SELECT * 所有行

QUERY PLAN
Seq Scan on foo (cost=0.00..15.00 rows=1000 width=62)

表 SELECT * 所有带有 `LIKE '%'`的行

QUERY PLAN
Seq Scan on foo (cost=0.00..17.50 rows=1000 width=62)
Filter: ((name)::text ~~ '%'::text)

【讨论】:

    【解决方案2】:

    是的。使用 LIKE 除了简单地返回行之外,还需要数据库进行全表扫描。

    【讨论】:

    • 即使是 LIKE '%'?这个条件不能被忽略吗?
    • AFAIK,如果模式在开头锚定(例如c like 'pancakes%'),某些 LIKE 实现可以使用索引,因此“LIKE 需要表扫描”过于宽泛。
    猜你喜欢
    • 2018-02-02
    • 2010-12-06
    • 2021-09-05
    • 2014-06-13
    • 2022-01-12
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多