首页 > 数据库 >GaussDB-SQL查询最佳实践

GaussDB-SQL查询最佳实践

时间:2025-01-16 09:30:03浏览次数:3  
标签:rows GaussDB t2 t1 cost SQL 查询 d2

GaussDB-SQL查询最佳实践

根据数据库的SQL执行机制以及大量的实践总结发现:通过一定的规则调整SQL语句,在保证结果正确的基础上,能够提高SQL执行效率。

  • 使用union all代替union。

    union在合并两个集合时会执行去重操作,而union all则直接将两个结果集合并、不执行去重。执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认两个集合不存在重叠,可用union all替代union以便提升性能。

  • join列增加非空过滤条件。

    若join列上的NULL值较多,则可以加上is not null过滤条件,以实现数据的提前过滤,提高join效率。

  • not in转not exists

    not in语句需要使用nestloop anti join来实现,而not exists则可以通过hash anti join来实现。在join列不存在null值的情况下,not exists和not in等价。因此在确保没有null值时,可以通过将not in转换为not exists,通过生成hash join来提升查询效率。

    建表语句如下:

    DROP SCHEMA IF EXISTS no_in_to_no_exists_test CASCADE;
    CREATE SCHEMA no_in_to_no_exists_test;
    SET CURRENT_SCHEMA=no_in_to_no_exists_test;
    CREATE TABLE t1(c1 int, c2 int, c3 int);
    CREATE TABLE t2(d1 int, d2 int NOT NULL, d3 int);

    使用NOT IN实现查询语句如下:

    SELECT * FROM t1 WHERE  c1 NOT IN (SELECT d2 FROM t2);

    其计划如下所示:

    gaussdb=# EXPLAIN SELECT * FROM t1 WHERE  c1 NOT IN (SELECT d2 FROM t2);
                                QUERY PLAN
    ------------------------------------------------------------------
     Nested Loop Anti Join  (cost=0.00..29749.02 rows=968 width=12)
       Join Filter: ((t1.c1 = t2.d2) OR (t1.c1 IS NULL))
       ->  Seq Scan on t1  (cost=0.00..29.45 rows=1945 width=12)
       ->  Materialize  (cost=0.00..39.17 rows=1945 width=4)
             ->  Seq Scan on t2  (cost=0.00..29.45 rows=1945 width=4)
    (5 rows)

    因为t2.d2字段中没有NULL值(t2.d2字段在表定义中为NOT NULL),所以查询可以等价修改如下:

    SELECT * FROM t1 WHERE  NOT EXISTS (SELECT * FROM t2 WHERE t1.c1=t2.d2);
    

    其生成的计划如下:

    gaussdb=# EXPLAIN SELECT * FROM t1 WHERE  NOT EXISTS (SELECT * FROM t2 WHERE t1.c1=t2.d2);
                                QUERY PLAN
    ------------------------------------------------------------------
     Hash Anti Join  (cost=53.76..99.14 rows=972 width=12)
       Hash Cond: (t1.c1 = t2.d2)
       ->  Seq Scan on t1  (cost=0.00..29.45 rows=1945 width=12)
       ->  Hash  (cost=29.45..29.45 rows=1945 width=4)
             ->  Seq Scan on t2  (cost=0.00..29.45 rows=1945 width=4)
    (5 rows)

  • 选择hashagg。

    查询语句中如果存在GROUP BY条件则生成的计划(Plan)中可能存在排序操作,即计划中包含GroupAgg+Sort算子,导致性能较差。可以通过设置GUC参数work_mem增大可用内存,生成带有HashAgg的计划(Plan)避免排序操作从而提升性能。work_mem设置请联系管理员。

  • 尝试将函数替换为case语句。

    数据库函数调用性能较低,如果出现过多的函数调用导致性能下降很多,可以根据情况把可下推函数的函数改成CASE表达式。

  • 避免对索引使用函数或表达式运算

    对索引使用函数或表达式运算会停止使用索引转而执行全表扫描。

  • 尽量避免在where子句中使用!=或<>操作符、null值判断、or连接、参数隐式转换。
  • 对复杂SQL语句进行拆分。

    对于过于复杂并且不易通过以上方法调整性能的SQL可以考虑拆分的方法,把SQL中某一部分拆分成独立的SQL并把执行结果存入临时表,拆分常见的场景包括但不限于:

    • 作业中多个SQL有同样的子查询,并且子查询数据量较大。
    • Plan cost计算不准,导致子查询hash bucket太小,比如实际数据1000万行,hash bucket只有1000。
    • 函数(如substr、to_number)导致大数据量子查询选择度计算不准。
    • 多DN环境下对大表做broadcast的子查询。

其他更多调优点,请参考典型SQL调优点

更多详情请参考GaussDB 文档中心:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html

标签:rows,GaussDB,t2,t1,cost,SQL,查询,d2
From: https://blog.csdn.net/Cui_Yuan_666/article/details/145173193

相关文章

  • GaussDB 客户端工具--gsql常见问题处理
    GaussDB-常见问题处理连接性能问题开启log_hostname,但是配置错误的DNS导致的连接性能问题。连接数据库,通过“showlog_hostname”语句,检查数据库中是否开启log_hostname参数。如果开启了相关参数,那么数据库内核通过DNS反查客户端所在机器的主机名。如果数据库配置了不正确......
  • 1.15 SQL语句练习(增删改查)
    1.DML(增删改)增给指定列添加数据INSERTINTO表名(列名1,列名2,…)VALUES(值1,值2,…);给全部列添加数据INSERTINTO表名VALUES(值1,值2,…);批量添加数据INSERTINTO表名(列名1,列名2,…)VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;INSERTINTO表名VALUES(......
  • JAVA开源毕业设计 中药实验管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T130,文末自助获取源码\color{red}{T130,文末自助获取源码}......
  • JAVA开源毕业设计 网上商城系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T129,文末自助获取源码\color{red}{T129,文末自助获取源码}......
  • JAVA开源毕业设计 编程训练系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T128,文末自助获取源码\color{red}{T128,文末自助获取源码}......
  • Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢
    一、查询优化1、查询优化器(QueryOptimizer)MySQL查询优化器(QueryOptimizer)是MySQL数据库管理系统中的一个关键组件,负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗,从而提高查询性能。查询语句不同关键字(where、......
  • Mysql--实战篇--数据库设计(范式和反范式,数据表设计原则)
    一、范式和反范式在数据库设计中,范式(Normalization)和反范式(Denormalization)是两种不同的设计理念,它们分别用于优化数据库的结构以满足不同的需求。范式主要用于减少数据冗余和提高数据完整性,而反范式则通过引入冗余来优化查询性能。1、范式(Normalization)范式是一种数据库......
  • Mysql--运维篇--备份和恢复(逻辑备份,mysqldump,物理备份,热备份,温备份,冷备份,二进制文件备
    MySQL提供了多种备份方式,每种方式适用于不同的场景和需求。根据备份的粒度、速度、恢复时间和对数据库的影响,可以选择合适的备份策略。主要备份方式有三大类:逻辑备份(mysqldump),物理备份和二进制文件备份。一、逻辑备份(LogicalBackup)逻辑备份是通过导出SQL语句或表结构和......
  • MySQL优化
    SQL优化原则尽可能消除全表扫描,除非表数据量是在万条一下增加适当的索引能提高查询的速度,但增加索引需要遵循一定的基本规则: a.加在where条件上 b.加在表之间join的键值上 c.如果查询范围是少量字段,可以考虑增加覆盖索引(仅走索引) d.有多个查询条件时,考虑增加复合索引......
  • mysqldump 命令介绍和使用案例
    mysqldump命令介绍和使用案例mysqldump是MySQL提供的一个命令行工具,用于备份数据库。它可以将数据库中的数据和结构导出为SQL文件,以便在需要时进行恢复。这个工具非常适合定期备份、迁移数据或在不同环境之间转移数据库。基本语法mysqldump[options]<database>[tab......