AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 280114
Accepted
Sebastiaan van den Broek
Sebastiaan van den Broek
Asked: 2020-11-23 01:26:00 +0800 CST2020-11-23 01:26:00 +0800 CST 2020-11-23 01:26:00 +0800 CST

数据库是否优化同一列上重复的相似查询参数?

  • 772

我有以下查询:

SELECT * FROM table t
WHERE t.id IN :ids
AND t.id IN :allowedIds

(查询参数稍后被替换)

这些查询参数是否由数据库本身优化?我想避免在代码中将两组 id 合并在一起,因为这会导致可读性差。第一个:ids约束是用户自己作为过滤器传递的内容,第二个:allowedIds约束是用户可以访问的内容。所以我希望大多数数据库,尤其是 Postgres,会优化这类事情。

postgresql query-performance
  • 1 1 个回答
  • 40 Views

1 个回答

  • Voted
  1. Best Answer
    Laurenz Albe
    2020-11-23T23:02:24+08:002020-11-23T23:02:24+08:00

    我将忽略这个问题中的“大多数数据库”,否则我将不得不投票关闭,因为缺乏焦点。相反,我将回答有关 PostgreSQL 的问题。

    要“合并”问题中的列表,您必须构建交集:

    WHERE id IN (1, 2, 3, 4) AND id IN (3, 4, 5, 6)
    

    是相同的

    WHERE id IN (3, 4)
    

    PostgreSQL 不会自动执行此操作。PostgreSQL 可以选择扫描现有索引中的一个或两个条件,或者它可以进行顺序扫描,但这两个条件不会合并。

    更重要的是,PostgreSQL 会将这两个条件视为统计上独立的,只是将它们的选择性相乘,这可能会导致错误的估计。

    对于具有单个IN列表的查询,您很可能会做得更好,该列表是原始列表的交集。

    你问为什么 PostgreSQL 团队没有在 PostgreSQL 的代码中添加这种优化,所以我对此有一些评论。这是一个相当不寻常的要求(一开始我误解了这个问题),并且在为此类要求添加优化器代码时总是需要权衡:虽然您的查询会受益,但许多查询将不得不以如下形式付出代价用于测试优化是否适用的额外 CPU 周期。现在查询计划时间是一个相当敏感的区域(它必须很快发生),所以我们通常不愿意为极端情况添加特殊处理,特别是如果它们可以通过重写查询轻松避免的话。

    另请注意:如果您能够将列表作为数组传递并安装允许您计算两个(整数!)数组之间的交集的intarray 扩展,则可以在 SQL 级别进行交集。例如where id = any(:ids & :allowedIds)

    • 3

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve