【问题标题】:SQL performance optimization: AND vs INSQL 性能优化:AND 与 IN
【发布时间】:2018-02-18 13:46:28
【问题描述】:

鉴于此示例表

+----+------+-----+--------+
| ID | Name | Age | Exempt |
+----+------+-----+--------+
|  1 | AA   |  50 | FALSE  |
|  2 | BB   |  40 | FALSE  |
|  3 | CC   |  30 | FALSE  |
|  4 | DD   |  65 | TRUE   |
|  5 | EE   |  50 | FALSE  |
|  6 | FF   |  20 | FALSE  |
+----+------+-----+--------+

还有这个查询

SELECT * FROM USERS
WHERE AGE > 40 AND EXPEMPT = TRUE;

有人告诉我,我可以使用子查询优化这个查询,但也可以使用这样的 IN 语句

SELECT * FROM USERS
WHERE AGE > 40 AND ID IN (SELECT ID 
                          FROM USERS WHERE EXEMPT = TRUE);

这可行,但我不明白为什么第二个查询在性能上比第一个更好。

【问题讨论】:

  • 对于AND,所有行都必须评估WHERE 条件。使用子查询,首先表被EXEMPT 字段过滤,只有结果行(在这种情况下只有一行)进入“第二次运行”并且必须被AGE 列过滤...这将提高性能,如果表有更多的行,比如几十万......
  • 然而,(EXEMPT, AGE DESC) 上的索引将提供几乎一样多的性能提升...
  • 你的表有主键、索引吗?分享您的创建表语句
  • 您在说什么 DBMS?执行计划在哪里?
  • “这是基于理论课”---那么这个问题没有答案:每个 DBMS(以及特定 DBMS 的每个版本)都有不同的性能特征。

标签: sql ansi ansi-sql


【解决方案1】:

我想不出第二个查询会比第一个更好的情况。第二个需要扫描users,然后用id做额外的工作;第一个只需要扫描users。如果第二个可以利用索引或数据分区,那么第一个应该能够使用相同的索引或数据分区。

如果您想加快查询速度,那么(exempt, age) 上的索引可能会很有用。

请注意,对有 6 行的表的性能考虑通常没有意义——所有合理的查询在这么少的行上都应该很快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多