【问题标题】:Query performance questions (WHERE field IN array)查询性能问题(WHERE 字段 IN 数组)
【发布时间】:2021-05-12 17:05:13
【问题描述】:

我正在创建一个简单的基于表单的工具来使用字符串连接公式生成重复查询,并且想知道以下低效率对查询性能的影响有多大:

A) 等于与 IN 一个 1 元素数组:

  1. WHERE FieldName = 'foo'
    • 对比
  2. WHERE FieldName IN ('foo')
    (表单字段接受 1 个或多个值;始终将其放在数组中比区分大小写更容易)

B) 数组中有冗余/重复值:

  1. WHERE FieldName IN ('lorem','ipsum','dolor','sit','amet')
    • 对比
  2. WHERE FieldName IN ('sit','ipsum','sit','dolor','ipsum','lorem','amet','ipsum','dolor','ipsum')
    (实际数组可能有 200 个唯一值中的 20 个)

在这两个示例中,生成 (1) 比生成 (2) 需要更多的前期工作。
可以添加条件来生成(2)(1);我只是想弄清楚这是否值得。

数据源有数百万条记录,而且(显然)这只是更复杂查询的一小部分。

提前致谢。

【问题讨论】:

  • 您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 我可以添加条件来生成 (2); - 你为什么想要 (2)?
  • A 1 & 2 可能相同,我也怀疑 B,唯一的区别可能是解析/编译时间可以忽略不计。您可以通过在任何 RDBMS 中运行查询并查看执行计划运算符来轻松调查哪个更好。
  • 针对 1st 2 cmets 编辑的帖子:标记的 DBMS:SQL Server 和 Redshift 中都存在表(日期范围略有不同);更正了在每种情况下生成 (1) 比生成 (2) 的工作量更大的错字。

标签: sql sql-server amazon-redshift query-optimization


【解决方案1】:

各种品牌和型号的 SQL 表服务器的最新版本中的查询计划器(有时称为查询编译器)理解 col = 'val'col IN ('val') 并对其进行相同处理,从而为两者生成相同的查询计划。查询的一种形式可能比另一种形式长几十纳秒。那没关系。完全没有。

查询规划人员还了解IN (whatever) 中给出的常量列表形式上是一个集合,并将删除重复项。对于常量,这是查询规划器工作的一部分。

如果您使用WHERE col IN (SELECT something FROM table WHERE whatever) 并且您的IN 子句中的集合变得非常大,您可能需要使用EXPLAIN 或您的表服务器支持的任何内容来分析查询的性能。您可能需要添加适当的索引。

如果您使用的是一些古老的版本,您的里程会有所不同。

因此,像往常一样,请相信您的查询规划器。编写代码,使其易于阅读、修改和推理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多