在 PostgreSQL 中强制执行连接顺序#postgresql认证

让我们首先创建一些表:

PgSQL
plan=# SELECT   'CREATE TABLE x' || id || ' (id int)' 
 FROM 	   generate_series(1, 5) AS id;
         ?column?         
--------------------------
 CREATE TABLE x1 (id int)
 CREATE TABLE x2 (id int)
 CREATE TABLE x3 (id int)
 CREATE TABLE x4 (id int)
 CREATE TABLE x5 (id int)
(5 rows)

在 PostgreSQL 中,我们可以轻松地使用 SQL 创建 SQL。psql 的优点在于,只需运行 gexec 即可将先前的输出用作新输入:

plan=# gexec
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE

瞧,我们有 5 个表可以作为示例数据结构。

在 POSTGRESQL 中连接表

#PG培训#PG考试#postgresql培训#postgresql考试
以下查询显示了使用我们刚刚创建的表的简单连接:

PgSQL
plan=# explain (timing, analyze)  SELECT *
           FROM    x1 JOIN x2 ON  (x1.id = x2.id)
                      JOIN x3 ON  (x2.id = x3.id)
                      JOIN x4 ON  (x3.id = x4.id)
                      JOIN x5 ON  (x4.id = x5.id);
…
Planning Time: 0.069 ms
Execution Time: 0.046 ms

这里的重要观察是什么?让我们来看看规划时间。PostgreSQL 需要 0.297 毫秒来找到运行查询的最佳执行计划(= 执行策略)。出现的问题是:规划器在哪里需要时间来规划查询?问题是:即使使用如上所示的显式连接,PostgreSQL 也会隐式连接这些表并决定最佳连接顺序。这在现实生活中意味着什么?让我们考虑一个连接“a join b join c”:即使我们编写一个 SQL 说连接“a to b”,优化器仍可能决定投票支持“c join a join b”,以防它保证相同的结果。为什么这如此重要?因为它提供了很大的效率。让优化器决定最佳连接顺序是一项重要的内部优化。

然而,我们必须牢记规划时间——尤其是如果涉及很多桌子(10 张以上?)。

控制 SQL 中的连接行为

如果规划时间是一个问题,我们可以强制 PostgreSQL 使用我们希望它使用的连接顺序。控制此行为的变量是 join_collapse_limit。这是什么意思?基本上它控制隐式规划的显式连接的数量。换句话说:PostgreSQL 可以优化多少个显式连接。

如果我们将这个变量设置为 1,则意味着我们强制 PostgreSQL 使用我们选择的连接顺序:


plan=# SET join_collapse_limit TO 1;
SET
plan=# explain (timing, analyze)  SELECT *
           FROM    x1 JOIN x2 ON  (x1.id = x2.id)
                      JOIN x3 ON  (x2.id = x3.id)
                      JOIN x4 ON  (x3.id = x4.id)
                      JOIN x5 ON  (x4.id = x5.id);
…
Planning Time: 0.069 ms
Execution Time: 0.046 ms

真正值得注意的是规划速度的显著提升。我们可以看到惊人的 4 倍加速。

但是,我还要提醒大家:优化器首先尝试重新构建连接是有原因的。如果查询比我们在此示例中看到的更昂贵,那么投入更多时间创建计划就很有意义了。换句话说:除非最终用户完全了解正在发生的事情,否则更改此变量可能会适得其反。因此,我们建议在更改此设置之前使用真实数据和真实工作负载测试您的查询和整个设置。通常,只更改单个查询的变量并保留 postgresql.conf 中的默认值(与所有其他操作一样)也是有益的。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/763610.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos7网络配置(设置固定ip)

文章目录 1进入虚拟机设置选中【网络适配器】选择【NAT模式】2 进入windows【控制面板\网络和 Internet\网络和共享中心\更改适配器设置】设置网络状态。3 设置VM的【虚拟网络编辑器】4 设置系统网卡5 设置虚拟机固定IP 刚安装完系统,有的人尤其没有勾选自动网络配置…

解锁机器学习算法面试挑战课程

在这个课程中,我们将从基础知识出发,系统学习机器学习与算法的核心概念和实践技巧。通过大量案例分析和LeetCode算法题解,帮助您深入理解各种面试问题,并掌握解题技巧和面试技巧。无论是百面挑战还是LeetCode算法题,都…

VUE3解决跨域问题

本文基于vue3 vite element-plus pnpm 报错:**** has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 原因:前端不能直接访问其他IP,需要用vite.config.ts &#xff0…

仿美团饿了么程序,外卖人9.0商业版外卖订餐源码(PC+微信)

仿美团饿了么程序,外卖人9.0外卖订餐源码,PC微信WAP短信宝,多城市多色版 非常不错的独立版外卖跑腿网站源码,喜欢的可以下载调试看看吧!! 仿美团饿了么程序,外卖人9.0外卖订餐源码

鸿蒙开发Ability Kit(程序访问控制):【向用户申请单次授权】

申请使用受限权限 受限开放的权限通常是不允许三方应用申请的。当应用在申请权限来访问必要的资源时,发现部分权限的等级比应用APL等级高,开发者可以选择通过ACL方式来解决等级不匹配的问题,从而使用受限权限。 举例说明,如果应…

【面试干货】Static关键字的用法详解

【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,static是一个关键字,它可…

【多模态LLM】以ViT进行视觉表征的多模态模型1(BLIP-2、InstructBLIP)

note CLIP和BLIP的区别: CLIP:通过对比学习联合训练,预测图像和文本之间的匹配关系。即使用双塔结构,分别对图像和文本编码,然后通过计算cos进行图文匹配。BLIP:包括两个单模态编码器(图像编码…

【TB作品】温湿度监控系统设计,ATMEGA16单片机,Proteus仿真

题2:温湿度监控系统设计 功能要求: 1)开机显示时间(小时、分)、时分可修改; 2)用两个滑动变阻器分别模拟温度传感器(测量范 围0-100度)与湿度传感器(0-100%),通过按键 可以在数码管切换显示当前温度值、湿度值; 3)当温度低于20度时,红灯长亮; 4)当湿度高于70%时,黄灯长亮; 5)当…

win11自动删除文件的问题,安全中心提示

win11自动删除文件的问题,解决方法: 1.点击任务栏上的开始图标,在显示的应用中,点击打开设置。 或者点击电脑右下角的开始也可以 2.点击设置。也可以按Wini打开设置窗口。 3.左侧点击隐私和安全性,右侧点击Windows安全…

如何开启Linux内核中的debug打印信息

如何开启Linux内核中的debug打印信息 Linux 内核中,日志等级定义在 include/linux/kern_levels.h 文件中。数值越小等级越高。 级别 对应内核日志级别 说明 0 KERN_EMERG 紧急消息。系统崩溃之前提示,表示系统已不可用。 1 KERN_ALERT 报告消息。表示必…

Redis 7.x 系列【13】数据类型之地理位置(Geospatial)

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 GEOADD2.2 GEODIST2.3 GEORADIUS2.4 GEOPOS2.5 GEORADIUSBYMEM…

安卓实现微信聊天气泡

一搜没一个能用的&#xff0c;我来&#xff1a; 布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…

使用Git从Github上克隆仓库,修改并提交修改

前言 本次任务主要是进行github提交修改的操作练习实践&#xff0c;本文章是对实践过程以及遇到的问题进行的一个记录。 在此之前&#xff0c;我已经简单使用过github&#xff0c;Git之前已经下好了&#xff0c;所以就省略一些步骤。 步骤记录 注册github账号&#xff0c;gi…

使用PHP解析和处理HTML/XML以创建Web爬虫的示例

使用PHP解析和处理HTML/XML以创建Web爬虫的示例 引言&#xff1a; Web爬虫是一种自动化工具&#xff0c;用于从万维网&#xff08;World Wide Web&#xff09;上抓取数据。PHP作为一种流行的服务器端脚本语言&#xff0c;具有丰富的库和功能&#xff0c;可以方便地解析和处理H…

简搭云可视化大屏设计:打造企业数据展示的新标杆

引言 在当今数字化时代&#xff0c;企业对于数据的可视化需求日益增长。如何高效、直观地展示海量数据&#xff0c;成为了企业决策者和数据分析师们关注的焦点。简搭云可视化大屏设计凭借其丰富的功能和强大的性能&#xff0c;成为了企业大屏可视化设计的首选工具。本文将为您…

Linux基础 - Ansible 服务实现自动化运维

目录 零. 简介 一. 安装 二. 模块介绍 三. 基本使用 零. 简介 Ansible 是一款极其强大且简单易用的开源 IT 自动化工具。 它的主要特点和优势包括&#xff1a; 无代理架构&#xff1a;Ansible 不需要在被管理的节点上安装代理程序&#xff0c;而是通过 SSH 协议与目标节点…

网站被浏览器提示“不安全”的解决办法

在互联网时代&#xff0c;网站的安全性直接关系到用户体验和品牌形象。当用户访问网站时&#xff0c;如果浏览器出现“您与此网站之间建立的连接不安全”的警告&#xff0c;这不仅会吓跑潜在客户&#xff0c;还可能对网站的SEO排名造成等负面影响。 浏览器发出的“不安全”警告…

第二周:计算机网络概述(下)

一、计算机网络性能指标&#xff08;速率、带宽、延迟&#xff09; 1、速率 2、带宽 3、延迟/时延 前面讲分组交换的时候介绍了&#xff0c;有一种延迟叫“传输延迟”&#xff0c;即发送一个报文&#xff0c;从第一个分组的发送&#xff0c;到最后一个分组的发送完成的这段时…

[Microsoft Office]Word设置页码从第二页开始为1

目录 第一步&#xff1a;设置页码格式 第二步&#xff1a;设置“起始页码”为0 第三步&#xff1a;双击页码&#xff0c;出现“页脚”提示 第四步&#xff1a;选中“首页不同” 第一步&#xff1a;设置页码格式 第二步&#xff1a;设置“起始页码”为0 第三步&#xff1a;双…

设备调试上位机GUI

C Fast Qt C 前端 原来真的不需要在 design 上画来画去&#xff0c;有chat-gpt 那里不知道问哪里 全是组件拼起来的,不需要画,最后发现其实也是定式模式,跟着AI 学套路