【问题标题】:Do I have to use "FETCH FIRST n ROWS ONLY" or "LIMIT" when selecting an unique id in where clause在 where 子句中选择唯一 ID 时是否必须使用“FETCH FIRST n ROWS ONLY”或“LIMIT”
【发布时间】:2019-03-22 08:13:15
【问题描述】:

我想知道如果我使用表中的索引查询唯一 id 以提高性能,是否必须在 DB2 中使用 FETCH FIRST n ROWS ONLY 语句或在 MySQL 中使用 LIMIT 语句。或者sql提供者是否已经注意到,最多只有一个结果并在找到该行时停止查询?

查询示例:
DB2:SELECT * FROM myTable WHERE id = 1 FETCH FIRST 1 ROWS ONLY
MySQL:SELECT * FROM myTable WHERE id = 1 LIMIT 1

有人想过这个吗?

【问题讨论】:

  • 在 mylsq 中,对 select 的结果应用了限制.. 所以你没有性能提升
  • 那么FETCH FIRST 1 ROWS ONLY呢?
  • 我不在 db2 但.. 我认为是一样的.. 这种限制/过滤器只能应用于结果集.. 性能基于结果集检索跨度>
  • 如果您已经在id 上有一个唯一索引,那么通常优化器必须知道这样的查询不能返回多于一行。如果您在id 上没有这样的唯一索引,那么帮助优化器构建更好的访问计划可能是值得的。

标签: mysql sql postgresql db2


【解决方案1】:

您可以在 Db2 中同时使用 FETCH FIRST 1 ROWS ONLYLIMIT,请查看 DB2 compatibility settings

如果只返回一行,则是否指定该语法无关紧要。但是,如果您或系统不确定,那么这是一个额外的保障。根据优化器设置(或情绪或统计信息或元数据),附加语法可能有助于提高性能。原因是数据库系统知道应该只返回 1 行,它可以针对这种情况进行优化。

如果id上有唯一索引,那应该很明显,但是有索引吗……?

【讨论】:

  • 是的,那一行有一个索引。我编辑了这个问题。那么,是否需要指定 LIMIT 语句?
  • 我的回答已经包含了它。没必要,但出于习惯,我还是会这样做。
  • 当您在 Db2 中启用对 LIMIT 的支持时,您可以使用更短的语法
【解决方案2】:

如果属性被声明为唯一,我强烈建议不要这样做,原因有两个:

  1. 它不会以任何方式提高现代优化器的性能,而只会增加有另一个子句要处理的 SQL 优化器的工作,

  2. (最重要的是)它降低了代码维护者对语句的可读性,因为它可能给人的印象是属性不是唯一的,从而导致对查询和基础表的混淆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多