首页 > 数据库 >SQL优化-正确使用并行

SQL优化-正确使用并行

时间:2023-09-25 17:01:05浏览次数:43  
标签:HZ FP 并行 GFSH KP SQL 优化 SELECT

一、问题概述

 某业务人员反馈帮领导导数据的SQL,执行了20分钟没出结果。同时他疑问为什么加了并行SQL仍然跑的慢?

1.1 SQL文本

SELECT *
  FROM (SELECT XFSH, XFMC, GFSH, GHFDJXH, kpfs, kpje, ROWNUM AS XH
          FROM (SELECT  /*+  parallel(64)*/
                 KP.XFSH,
                 KP.XFMC,
                 KP.GFSH,
                 KP.GHFDJXH,
                 count(DISTINCT KP.SELF_FP_FPXX_ID) as kpfs,
                 sum(ABS(TO_NUMBER(HJJE)) + ABS(TO_NUMBER(HJSE))) as KPJE
                                  FROM SSDSJ.SELF_FP_FPXX KP
                 WHERE KP.GLKPBZ = 'Y'
                   AND NVL(ZFBZ, 'N') = 'N'
                   AND FPKJZT NOT IN ('0', '2')
                   AND SFHZFP = '0'
                   AND KP.KPRQ >= DATE '2020-01-01'
                   AND KP.KPRQ < DATE '2022-11-01'
                   AND NOT EXISTS
                 (SELECT   1
                          FROM SSDSJ.SELF_FP_FPXX HZ
                         WHERE HZ.BLUE_FPDM = KP.FP_DM
                           AND HZ.BLUE_FPHM = KP.FP_HM
                           AND NVL(HZ.ZFBZ, 'N') = 'N'
                           AND HZ.FPKJZT NOT IN ('0', '2'))
                 group by KP.XFSH, KP.XFMC, KP.GFSH, KP.GHFDJXH
                 ORDER BY 4 DESC, 3 DESC) S) V
 where V.XH <= 100
 ;

1.2 执行计划

SQL优化-正确使用并行_sql优化

二、问题原因

       结合SQL文本及执行计划,业务人员为了提高SQL执行效率,加了64的并发,但仍然效率低下,原因是什么?我们知道并行只适用于多块读,而INDEX FULL SCAN和INDEX RANGE SCAN均为单块读,这就是并行未启作用的原因。

      接下来观察执行计划,ID=7和9的过滤列,明显很差,但ROWS估算值却不大,如果ROWS估算正确,该SQL也不至于2小时出不了结果,所以这里不适合走索引+回表。

三、解决方案

    经过以上分析,该SQL适合两个关联表走全表扫描+hash join,这样再加上适量的并行度,可以有效的提升SQL性能。

  3.1 添加HINT

SQL> SELECT *
  2    FROM (SELECT XFSH, XFMC, GFSH, GHFDJXH, kpfs, kpje, ROWNUM AS XH
  3            FROM (SELECT  /*+  parallel(8) full(KP)*/
  4                   KP.XFSH,
  5                   KP.XFMC,
  6                   KP.GFSH,
  7                   KP.GHFDJXH,
  8                   count(DISTINCT KP.SELF_FP_FPXX_ID) as kpfs,
  9                   sum(ABS(TO_NUMBER(HJJE)) + ABS(TO_NUMBER(HJSE))) as KPJE
 10                                    FROM SSDSJ.SELF_FP_FPXX KP
 11                   WHERE KP.GLKPBZ = 'Y'
 12                     AND NVL(ZFBZ, 'N') = 'N'
 13                     AND FPKJZT NOT IN ('0', '2')
 14                     AND SFHZFP = '0'
 15                     AND KP.KPRQ >= DATE '2020-01-01'
 16                     AND KP.KPRQ < DATE '2022-11-01'
 17                     AND NOT EXISTS
 18                   (SELECT /*+  full(HZ) hj_aj*/  1
 19                            FROM SSDSJ.SELF_FP_FPXX HZ
 20                           WHERE HZ.BLUE_FPDM = KP.FP_DM
 21                             AND HZ.BLUE_FPHM = KP.FP_HM
 22                             AND NVL(HZ.ZFBZ, 'N') = 'N'
 23                             AND HZ.FPKJZT NOT IN ('0', '2'))
 24                   group by KP.XFSH, KP.XFMC, KP.GFSH, KP.GHFDJXH
 25                   ORDER BY 4 DESC, 3 DESC) S) V
 26   where V.XH <= 100;


3.2 优化后执行计划

SQL优化-正确使用并行_并行_02

四、性能对比

    经过以上优化措施,大大提升了SQL效率,对比如下:

逻辑读

物理读

执行时间(秒)

优化前

15278511

12659,022

1200+

优化后

3946974

3879140

34

标签:HZ,FP,并行,GFSH,KP,SQL,优化,SELECT
From: https://blog.51cto.com/u_13482808/7597307

相关文章

  • sql 92语法和99语法
    SQL92语法SQL语言在1992年推出的一套标准语法(关联查询中没有新的关键字)SQL99语法SQL语言在1999年推出的一套新的标准语法(最新的sql语言版本,关联查询中添加了一系列新的关键字:innerjoin;on;)Sql92语法和Sql99语法的区别:99语法可以做到表的连接和查询条件分离,特别是多个表进行......
  • 多选人员id转换成人员名称(sqlserver)
    1.selectstuff((select','+a.exttextfield1fromprojectawhere','+b.field027+','like'%,'+cast(a.idasvarchar(32))+',%'forxmlpath('')),1,1,'')asprojectfromufp0w7y71553484......
  • mysql学习
    mysql0.数据库常见概念0.1概念数据库:英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。数据库管理系统:DataBaseManagement,简称DBMS。数据库管理系统是专门用来管理......
  • MySQL实战实战系列 07 行锁功过:怎么减少行锁对性能的影响?
    在上一篇文章中,我跟你介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只......
  • Linux系统优化
     一、系统信息查看方法#查看系统名称信息#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)查看系统内核版本#uname-r3.10.0-1160.el7.x86_64查看系统硬件位数#uname-mx86_64二、系统基础优化#2.1添加系统普通用......
  • MySQL——处理JSON类型的数据
    MySQL对JSON类型数据的处理参考视频:快速学习MySQL8JSON注意,本文的键名也可以叫key,键值也可以叫value,意思是一样的1.字符串查询:JSON_EXTRACT假设我们有一个表叫做testDemo,其中有一个字段叫做details,类型为JSON,他的数据结构如下,我们就以这个结构为例(这是个例子,假设有很多行......
  • MySQL 索引、事务与存储引擎
    MySQL索引、事务与存储引擎---MySQL索引---1.索引的概念●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。●使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数......
  • mysql常用函数
    1、AVG():返回平均值2、COUNT():返回行数3、FIRST():返回第一个记录的值4、LAST():返回最后一个记录的值5、MAX():返回最大值6、MIN():返回最小值7、SUM():返回总和8、UCASE():将某个字段转换为大写9、LCASE():将某个字段转换为小写12、ROUND():对某个数值字段进行指定小数位数的四......
  • (十)Unity性能优化-UGUI优化
    原链接:https://github.com/lwwhb/Unity2022_SUNTAIL_Stylized_Fantasy_Village_OptimizationUnityUI性能的四类问题CanvasRe-batch时间过长CanvasOver-dirty,Re-batch次数过多生成网格顶点时间过长Fill-rateoverutilizationCanvas画布​Canvas负责管理UGUI元素,负责UI渲染......
  • mysql8安装踩坑记
    背景:已安装mysql5.7版本问题一:默认的3306端口被占用进入mysql5.7的my.ini文件,更改port为3307或者其他未被占用的端口问题二:Install/RemoveoftheServiceDenied!cmd用管理员的身份运行,执行mysqld--installmysql8.0.34(拿版本号取得别名)问题三:启动MySQL服务时出......