Postgresql join_collapse_limit 和查询规划的时间

2023-11-21

我刚刚发现join_collapse_limit一直在阻止 PostgreSQL 规划器找到更好的连接顺序。就我而言,将限制增加到 10(默认为 8)允许规划器将搜索时间从约 30 秒缩短到约 1 毫秒,这是更容易接受的。

该文档表明,设置此值“太高”可能会导致规划时间过长,但甚至没有提供关于各种值的规划步骤可能需要多长时间的“经验法则”。我知道一般问题的时间是指数级的,但我无法找到一种方法来确定实际的计划时间,除非它只是运行所需的时间ANALYZE SELECT ...。如果是这样的话,我相信对于现代计算机来说,默认值 8 相当低,因为我无法检测到 8 和 10 之间的规划速度没有差异。

问题:

1)如何衡量计划时间?

2)大约可以多高join_collapse_limit是否并且仍然期望计划花费的时间少于几百毫秒?


1)如何衡量计划时间?

新的 PostgreSQL 9.4 版本(在撰写本文时尚未发布)将把规划时间添加到EXPLAIN and EXPLAIN ANALYZE,这样您就可以使用它们了。

对于旧版本,您的假设是正确的,确定计划时间的更好方法是执行一个简单的EXPLAIN (no ANALYZE)并检查所花费的时间,在psql你可以通过启用来做到这一点\timing(我通常在~/.psqlrc).

2) join_collapse_limit 大约可以达到多高并且仍然期望 计划花费少于几百毫秒的时间?

PostgreSQL 黑客团队已经讨论过将其提高到更大的值。但看起来他们不能保证这对所有情况都有好处。

问题在于,计划找到最佳的连接顺序N表需要一个O(N!)(阶乘)方法。因此,加注的数字非常高,您可以通过以下查询简单地看到:

$ SELECT i, (i)! AS num_comparisons FROM generate_series(8, 20) i;
 i  |   num_comparisons   
----+---------------------
  8 |               40320
  9 |              362880
 10 |             3628800
 11 |            39916800
 12 |           479001600
 13 |          6227020800
 14 |         87178291200
 15 |       1307674368000
 16 |      20922789888000
 17 |     355687428096000
 18 |    6402373705728000
 19 |  121645100408832000
 20 | 2432902008176640000
(13 rows)

正如您所看到的,在默认值 8 下,我们最多进行大约 40K 的比较,您建议的 10 使其达到 3M,这对于现代计算机来说仍然不是很多,但下一个值开始变得太大,它只会增加太快了,20 太疯狂了(21!甚至不适合 64 位整数)。

当然,有时你可以将其设置为更大的值,例如 16,这(理论上)可以进行大约 20 万亿次比较,并且仍然有很好的规划时间,这是因为 PostgreSQL 在规划时切断了一些路径,并且不需要到always检查所有订单,但假设情况总是如此,并将如此高的值设置为默认值,对我来说似乎不是一个好方法。将来可能会出现一些意外的查询,导致它需要检查所有订单,然后您只有一个查询导致服务器停机。

根据我的经验,我假设 10 作为良好服务器中任何安装的默认值,其中一些我什至使用 12。如果您愿意,我建议您将其设置为 10,并且有时尝试将其设置得更高(我不会超出 12) 并继续(密切)监视它的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Postgresql join_collapse_limit 和查询规划的时间 的相关文章

  • Postgres < 9.0 的 DO 块相当于什么

    Postgres 8 4 8 相当于什么 DO BEGIN IF NOT EXISTS THEN EXECUTE END IF END create function f returns void as BEGIN IF NOT EXIST
  • 如何在连接到 Heroku PostgreSQL 的 Flask 应用程序上处理更多并发用户?

    Heroku 上的 Flask API 有许多端点 它们在将 json 化结果返回给客户端之前在我的 Heroku PostgreSQL 数据库上运行查询 我当前的计划是 Hobby Basic 层 因此数据库最多只能处理 20 个连接 如
  • pg_dump 没有对象注释?

    有没有办法执行 pg dump 并排除表 视图和列的 COMMENT ON 我广泛使用 COMMENT ON 命令来描述所有对象 并且经常在其中包含换行符以获得更清晰的描述 例如 COMMENT ON TABLE mytable1 IS M
  • 如何引用下一行的数据?

    我正在 PostgreSQL 9 2 中编写一个函数 对于股票价格和日期的表 我想计算每个条目较前一天的百分比变化 对于最早一天的数据 不会有前一天 因此该条目可以简单地为 Nil 我知道WITH声明可能不应该高于IF陈述 到目前为止 这就
  • 什么是大O表示法?你用它吗? [复制]

    这个问题在这里已经有答案了 什么是大O表示法 你用它吗 我想我错过了这门大学课程 D 有人使用过它并给出一些现实生活中使用它的例子吗 也可以看看 八岁孩子的大O https stackoverflow com questions 10716
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • Rust 编程竞赛中最快的惯用 I/O 例程?

    我的问题已部分得到解答 因此我根据从评论和其他实验中学到的知识对其进行了修改 总之 我想要一个用于编程竞赛的快速 I O 例程 其中使用单个文件解决问题 无需外部包 它应该从一个以空格分隔的标记序列中读取BufRead 标准输入或文件 标记
  • 使用 PostGIS 拥有通用 GEOGRAPHY 列

    在 PostgreSQL 9 PostGIS 1 5 中 有没有办法创建 通用 GEOGRAPHY 列 我指的是接受 POINT 以及 POLYGON LINESTRING 等的列 到目前为止 我只在 Internet 上看到过像 GEOG
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • 带有用户信息的 Django Logger

    我只是好奇 是否可以放User内的信息formatters信息输入LOGGING配置在setting py 现在我只是将该信息放入要记录的消息中 但也许有一种方法可以将其设置为formatters争论 这是我的LOGGING现在的配置 LO
  • TimescaleDB 查询选择列值较上一行发生更改的行

    最近刚刚开始使用 TimescaleDB 和 Postgres 来处理大多数数据请求 然而 我遇到了一个问题 即我对时间序列数据的请求效率极低 它是一个可以是任意时间长度 具有特定整数值的数据系列 大多数时候 除非出现异常 否则该值将是相同
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • PostgreSQL 错误 42501:架构权限被拒绝

    我正在 ASP NET 中构建一个用户注册系统 使用 PostgreSQL 数据库来维护用户信息 作为注册过程的一部分 用户会收到一条确认消息 他们必须单击其中的链接来验证其电子邮件地址 然后 他们将进入一个可以创建密码的页面 一旦用户提供
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • SELECT 在 PL/pgSQL 函数中引发异常

    我想在函数内实现循环 但收到此错误 ERROR 查询没有结果数据的目标 代码 CREATE OR REPLACE FUNCTION my function ill int ndx bigint RETURNS int AS DECLARE
  • Postgres - 即使我的角色/用户已被授予“读取”权限,也无法从表中“选择”

    我在 postgres 上有一个管理员角色 用户和一个开发人员角色 开发人员角色继承了我为将来方便而创建的 readaccess 角色的属性 如果我运行 du 我得到 Role name Attributes Member of devel
  • dplyr:连接中的 NSE (by)

    我很难弄清楚如何使用 dplyr left join 和 NSE 连接两个表 问题是我无法为 by 提供正确的值 我想我现在已经找到了解决方案 但感觉我正在以一种额外复杂的方式来做 因此 如果您知道更简单 更优雅的解决方案 请告诉我 这就是
  • Django 独特的不工作

    我在从查询中过滤掉重复项时遇到问题 我正在使用 Django 1 4 和 Postgres 8 4 13 我在我的模型对象上使用这个查询 它是一个 jquery 自动完成 term request GET get term field re

随机推荐

  • C# - 无法在 WinForms 的列表框中执行键值对

    我正在使用 WinForms 中的 ListBox 编写 C 应用程序 我从 XML 文件获取数据 ID 和全名 我想在列表框中显示全名 当我选择其中之一时 我想获取相关的 ID 我尝试使用SelectedValue财产没有运气 我也尝试过
  • MenuItemCompat.getActionView 始终返回 null

    我刚刚实施了v7 AppCompat支持库但是MenuItemCompat getActionView在我测试的每个 Android 版本中总是返回 null 4 2 2 2 3 4 The SearchView显示在操作栏中 但它不响应触
  • UDP(数据报)套接字的 FIONREAD 返回什么? [复制]

    这个问题在这里已经有答案了 哪一个做ioctl of FIONREAD返回 下一个数据包的长度 还是缓冲区中所有数据的长度 假设有一个UDP服务器接收来自客户端 1 的 2 个数据包 并在客户端 1 的数据包之后接收来自客户端 2 的另外
  • 构造函数中的异常

    在 C 中 对象的生命周期从构造函数成功完成时开始 在构造函数内部 该对象还不存在 问 从构造函数发出异常意味着什么 答 这意味着构造失败 该对象从未存在过 其生命周期从未开始 source 我的问题是 Java 也是如此吗 例如 如果我把
  • 如何从Powershell获取退出代码并返回CMD?

    我有一个 powershell 脚本 我使用 CMD 文件运行 powershell 脚本 我想从 powershell 脚本中获取退出代码并将值返回给 CMD 我试过这个 但当我执行 CMD 文件来调用 powershell 时 它不会返
  • 无法在 Visual Studio 2013 中打开 Web 项目

    昨天我安装了 Visual Studio 2013 的更新 Visual Studio 2013 Update 2 但从那时起它就无法正常工作 更新花费了相当长的时间 所以我让它运行了一夜 当我今天早上回到我的工作站时 我无法在我们的解决方
  • “Rscript”不被识别为内部或外部命令、可操作程序或批处理文件

    shell exec Rscript C R R 3 2 2 bin code R 这是对脚本的调用 调用上述脚本时 会发生错误 我试图从上述路径调用我的 R 脚本 但没有显示任何输出 在检查 PHP 的错误日志时 它说 Rscript 未
  • 为什么Matlab和Octave中inv()和pinv()的输出不相等?

    我注意到如果 A 是一个 NxN 矩阵并且它有逆矩阵 但是 inv 和 pinv 函数输出的内容是不同的 我的环境是Win7x64 SP1 Matlab R2012a Cygwin Octave 3 6 4 FreeMat 4 2 看看 O
  • 向 requestAnimationFrame 回调的函数添加额外的参数

    我希望创建一个函数 使用 requestAnimationFrame 和增量时间在 HTML5 画布上将图像元素滚动 x 像素超过 y 时间 我不知道的是 当 requestAnimationFrame allready 使用一个参数 DO
  • 上下文中的多个包:组件扫描、spring config

    如何在 spring servlet xml 文件中添加多个包context component scan元素 我努力了
  • 如何使用 TensorFlow 2.0 打乱两个 numpy 数据集?

    我想写一个函数TensorFlow 2 0比在每次训练迭代之前对数据及其目标标签进行打乱 假设我有两个 numpy 数据集 X 和 y 代表用于分类的数据和标签 我怎样才能洗牌同时 Using sklearn这很简单 from sklear
  • 扩展 Android 的语音搜索应用

    是否可以扩展语音搜索应用程序 我知道我可以在自己的应用程序中添加一个按钮来启动语音识别对话框 但我想知道是否可以扩展当您长按物理 搜索 键时自动启动的语音搜索应用程序 send text to contact message listen
  • 关于 Vue 3 + TypeScript 和 Augmenting-Types-for-Use-with-Plugins 的问题

    有谁知道如何使用 Vue3 和 TypeScript 实现类型增强的工作示例 我一直在尝试遵循 Vue2 文档 在 Vue3 中使用相同的内容 但没有成功 并且在过去 3 个小时的搜索中没有任何结果 看来Vue对象在vue class co
  • 检查矩阵行是否等于 R 中的矢量(矢量化)

    我很惊讶这个问题没有被问到 也许答案会澄清原因 我想将矩阵的行与向量进行比较 并返回该行是否 处处的向量 请参阅下面的示例 我想要一个矢量化解决方案 没有应用函数 因为矩阵太大而无法缓慢循环 假设也有很多行 所以我想避免重复向量 set s
  • 将 Microsoft SQL 复制到其他数据库

    我希望能够将整个数据库从 Microsoft SQL 复制到另一个 Web 友好的数据库 例如 CouchDB 甚至 mySQL 我需要每天进行复制 只是想知道是否可能 如果可以 我将如何用最少的编码来完成它 Thanks 这是可能的对称D
  • 在网页上查找广告

    我正在编写一个应用程序 试图确定页面上是否有广告 当前正在使用 python 通过 selenium webdriver 使用浏览器驱动 我认为 iframe 内存在大量广告 并且我制作了一个循环来查看每个框架的内部 browser web
  • AngularJS 中用于分页的限制和偏移数据结果

    AngularJS在调用支持Limit和Offset的外部数据资源时是否有Limit和Offset请求方法 我想有一个比这更优雅的解决方案 我通过路线参数传递限制和偏移量 function ListCtrl scope http route
  • ExecCommand 函数的定义是否为粗体?

    ExecCommand 提供了一种在 iFrame 中将文本加粗 斜体 下划线等的方法 但它缺少创建选项
  • Flask WTF“StringField”对象没有属性“translate”

    我对 Python 比较陌生 并且一直在关注Miguel Grinberg Flask 超级教程 我有一个非常简单的表单 当我尝试提交时 我收到以下错误 AttributeError StringField 对象没有属性 translate
  • Postgresql join_collapse_limit 和查询规划的时间

    我刚刚发现join collapse limit一直在阻止 PostgreSQL 规划器找到更好的连接顺序 就我而言 将限制增加到 10 默认为 8 允许规划器将搜索时间从约 30 秒缩短到约 1 毫秒 这是更容易接受的 该文档表明 设置此