腾讯云TDSQL PostgreSQL版 -最佳实践 |优化 SQL 语句

腾讯云TDSQL PostgreSQL版 -最佳实践 |优化 SQL 语句查看是否为分布键查询 postgres=# explain select * from tbase_1 where f1=1; QUERY PLAN Remote Fast Query Executi

腾讯云TDSQL PostgreSQL版 -最佳实践 |优化 SQL 语句

查看是否为分布键查询
postgres=# explain select * from tbase_1 where f1=1;
QUERY PLAN
——————————————————————————–
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn001, dn002
-> Gather (cost=1000.00..7827.20 rows=1 width=14)
Workers Planned: 2
-> Parallel Seq Scan on tbase_1 (cost=0.00..6827.10 rows=1 width=14)
Filter: (f1 = 1)
(6 rows)
postgres=# explain select * from tbase_1 where f2=1;
QUERY PLAN
——————————————————————————–
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn001
-> Gather (cost=1000.00..7827.20 rows=1 width=14)
Workers Planned: 2
-> Parallel Seq Scan on tbase_1 (cost=0.00..6827.10 rows=1 width=14)
Filter: (f2 = 1)
(6 rows)
如上,第一个查询为非分布键查询,需要发往所有节点,这样最慢的节点决定了整个业务的速度,需要保持所有节点的响应性能一致,如第二个查询所示,业务设计查询时尽可能带上分布键。

查看是否使用索引
postgres=# create index tbase_2_f2_idx on tbase_2(f2);
CREATE INDEX
postgres=# explain select * from tbase_2 where f2=1;
QUERY PLAN
————————————————————————————-
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn001, dn002
-> Index Scan using tbase_2_f2_idx on tbase_2 (cost=0.42..4.44 rows=1 width=14)
Index Cond: (f2 = 1)
(4 rows)
postgres=# explain select * from tbase_2 where f3=”1″;
QUERY PLAN
——————————————————————————–
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn001, dn002
-> Gather (cost=1000.00..7827.20 rows=1 width=14)
Workers Planned: 2
-> Parallel Seq Scan on tbase_2 (cost=0.00..6827.10 rows=1 width=14)
Filter: (f3 = “1”::text)
(6 rows)
postgres=#
第一个查询使用了索引,第二个没有使用索引,通常情况下,使用索引可以加速查询速度,但索引也会增加更新的开销。

查看是否为分布 key join
postgres=# explain select tbase_1.* from tbase_1,tbase_2 where tbase_1.f1=tbase_2.f1 ;
QUERY PLAN
————————————————————————————————
Remote Subquery Scan on all (dn001,dn002) (cost=29.80..186.32 rows=3872 width=40)
-> Hash Join (cost=29.80..186.32 rows=3872 width=40)
Hash Cond: (tbase_1.f1 = tbase_2.f1)
-> Remote Subquery Scan on all (dn001,dn002) (cost=100.00..158.40 rows=880 width=40)
Distribute results by S: f1
-> Seq Scan on tbase_1 (cost=0.00..18.80 rows=880 width=40)
-> Hash (cost=18.80..18.80 rows=880 width=4)
-> Seq Scan on tbase_2 (cost=0.00..18.80 rows=880 width=4)
(8 rows)
postgres=# explain select tbase_1.* from tbase_1,tbase_2 where tbase_1.f2=tbase_2.f1 ;
QUERY PLAN
———————————————————————————
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn001, dn002
-> Hash Join (cost=18904.69..46257.08 rows=500564 width=14)
Hash Cond: (tbase_1.f2 = tbase_2.f1)
-> Seq Scan on tbase_1 (cost=0.00..9225.64 rows=500564 width=14)
-> Hash (cost=9225.64..9225.64 rows=500564 width=4)
-> Seq Scan on tbase_2 (cost=0.00..9225.64 rows=500564 width=4)
(7 rows)
第一个查询需要数据重分布,而第二个不需要,分布键 join 查询性能会更高。

查看 join 发生的节点
postgres=# explain select tbase_1.* from tbase_1,tbase_2 where tbase_1.f1=tbase_2.f1 ;
QUERY PLAN
———————————————————————————————–
Hash Join (cost=29.80..186.32 rows=3872 width=40)
Hash Cond: (tbase_1.f1 = tbase_2.f1)
-> Remote Subquery Scan on all (dn001,dn002) (cost=100.00..158.40 rows=880 width=40)
-> Seq Scan on tbase_1 (cost=0.00..18.80 rows=880 width=40)
-> Hash (cost=126.72..126.72 rows=880 width=4)
-> Remote Subquery Scan on all (dn001,dn002) (cost=100.00..126.72 rows=880 width=4)
-> Seq Scan on tbase_2 (cost=0.00..18.80 rows=880 width=4)
(7 rows)
postgres=# set prefer_olap to on;
SET
postgres=# explain select tbase_1.* from tbase_1,tbase_2 where tbase_1.f1=tbase_2.f1 ;
QUERY PLAN
————————————————————————————————
Remote Subquery Scan on all (dn001,dn002) (cost=29.80..186.32 rows=3872 width=40)
-> Hash Join (cost=29.80..186.32 rows=3872 width=40)
Hash Cond: (tbase_1.f1 = tbase_2.f1)
-> Remote Subquery Scan on all (dn001,dn002) (cost=100.00..158.40 rows=880 width=40)
Distribute results by S: f1
-> Seq Scan on tbase_1 (cost=0.00..18.80 rows=880 width=40)
-> Hash (cost=18.80..18.80 rows=880 width=4)
-> Seq Scan on tbase_2 (cost=0.00..18.80 rows=880 width=4)
(8 rows)
第一个 join 在 cn 节点执行,第二个在 dn 上重分布后再 join,业务设计上,一般 OLTP 类业务在 cn 上进行少数据量 join ,性能会更好。

查看并行的 worker 数
postgres=# explain select count(1) from tbase_1;
QUERY PLAN
—————————————————————————————
Finalize Aggregate (cost=118.81..118.83 rows=1 width=8)
-> Remote Subquery Scan on all (dn001,dn002) (cost=118.80..118.81 rows=1 width=0)
-> Partial Aggregate (cost=18.80..18.81 rows=1 width=8)
-> Seq Scan on tbase_1 (cost=0.00..18.80 rows=880 width=0)
(4 rows)
postgres=# analyze tbase_1;
ANALYZE
postgres=# explain select count(1) from tbase_1;
QUERY PLAN
—————————————————————————————————-
Parallel Finalize Aggregate (cost=14728.45..14728.46 rows=1 width=8)
-> Parallel Remote Subquery Scan on all (dn001,dn002) (cost=14728.33..14728.45 rows=1 width=0)
-> Gather (cost=14628.33..14628.44 rows=1 width=8)
Workers Planned: 2
-> Partial Aggregate (cost=13628.33..13628.34 rows=1 width=8)
-> Parallel Seq Scan on tbase_1 (cost=0.00..12586.67 rows=416667 width=0)
(6 rows)
上面第一个查询没走并行,第二个查询 analyze 后走并行才是正确的,建议大数据量更新再执行 analyze。

查看各节点的执行计划是否一致
./tbase_run_sql_dn_master.sh “explain select * from tbase_2 where f2=1”
dn006 — psql -h 172.16.0.13 -p 11227 -d postgres -U tbase -c “explain select * from tbase_2 where f2=1”
QUERY PLAN
—————————————————————————–
Bitmap Heap Scan on tbase_2 (cost=2.18..7.70 rows=4 width=40)
Recheck Cond: (f2 = 1)
-> Bitmap Index Scan on tbase_2_f2_idx (cost=0.00..2.18 rows=4 width=0)
Index Cond: (f2 = 1)
(4 rows)
dn002 — psql -h 172.16.0.42 -p 11012 -d postgres -U tbase -c “explain select * from tbase_2 where f2=1”
QUERY PLAN
——————————————————————————-
Index Scan using tbase_2_f2_idx on tbase_2 (cost=0.42..4.44 rows=1 width=14)
Index Cond: (f2 = 1)
(2 rows)
两个 dn 的执行计划不一致,最大可能是数据倾斜或者是执行计划被禁用。
如有可能,DBA 可以配置在系统空闲时执行全库 analyze 和 vacuum。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5958.html

(0)
上一篇 2023-04-20
下一篇 2023-04-20

相关推荐

  • mongodb运算符_mongodb authentication failed

    mongodb运算符_mongodb authentication failed问题 如果MongoDB 数据库集合中仅存在一条记录 我们执行查询 此时会得到结果吗? 最开始我想当然的以为是不会出现结果的,但结果往往与期望背道而驰。 什么,一瞬间我陷入了迷茫,Mongo的查询结果

    2023-02-11
    151
  • 用Python实现可变空白的美观排版

    用Python实现可变空白的美观排版排版作为出版的一个重点环节,对于一本书籍或者一份报纸杂志,其排版质量直接影响着读者的阅读体验。在排版过程中,空白的使用非常重要。空白可以分隔不同的内容,同时可以让阅读更为舒适和美观。

    2024-03-15
    96
  • Python阶乘实现

    Python阶乘实现Python是一种高层次的动态编程语言,被广泛应用于Web开发、数据科学、人工智能等领域。Python的一个关键特性是它强大且易于使用的标准库,其中包括了多种数据类型和数据结构,可以轻松实现大量常用算法。本文将介绍如何使用Python实现阶乘,作为入门算法的示范,希望能够吸引读者的兴趣和启发读者对Python编程的兴趣。

    2024-05-24
    74
  • SQL SERVER 下,批量在不同的数据库中执行相同的脚本「建议收藏」

    SQL SERVER 下,批量在不同的数据库中执行相同的脚本「建议收藏」
    转自:https://blog.51cto.com/liuxinya/354983 作为DBA我们经常需要对不同的数据库执行相同的查询,如果你的服务器上只有…

    2023-04-05
    149
  • redis怎么存session「建议收藏」

    redis怎么存session「建议收藏」redis使用hash数据类型存储session,因为考虑到session中数据类似map的结构,采用redis中hash存储session数据比较合适,如果使用单个value存储session数据…

    2022-12-20
    146
  • mysql登录错误:’Access denied for user ‘root’@’localhost’

    mysql登录错误:’Access denied for user ‘root’@’localhost’首先是不知道怎么忽然mysql用命令行,workbench都登录不了,都提示’Access denied for user ‘root’@’localhost’。 数据库卸载重装了几次都不行。好像感觉

    2022-12-21
    172
  • 数据库学习

    数据库学习
    1. 基本的经典查询 #基本的查询语句 SELECT * FROM data.`dataanalyst` WHERE city =’上海’ AND (edu…

    2023-04-09
    445
  • 一个韭菜用python采集(Python采集)

    一个韭菜用python采集(Python采集)数据采集(DAQ),又称数据获取,是指从传感器和其它待测设备等模拟和数字被测单元中自动采集非电量或者电量信号,送到上位机中进行分析,处理。数据采集系统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现灵活的、用户自定义的测量系统。采集一般是采样方式,即隔一定时间(称采样周期)对同一点数据重复采集。采集的数据大多是瞬时值,也可是某段时间内的一个特征值。

    2024-06-16
    52

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注