查看原文
其他

SQL优化案例 | 从Exadata迁移到国产沃趣一体机一般方法探究(四)

姚崇·沃趣科技 沃趣技术 2023-03-10


作者   姚崇·沃趣科技高级数据库技术专家

出品   沃趣科技



存储技术的发展,闪存的出现,大大提升了数据库一体机的性能,随着闪存成本的降低,我相信未来Exadata也不会再有flashcache、flashlog相关的特性。


目前有大量的基于Exadata数据库的业务逐渐迁移到国产沃趣一体机当中,那么我们看一下,迁移过程中,SQL优化的一般思路:


数据库性能提升的一个标志就是IO性能提升或者减少IO访问次数(不管是申请的IO是在buffer中还是在磁盘中),Exadata一体机Smart Scan特性是数据Offloading的一个统称,包含的子特性比较多,比如:行过滤、列过滤、存储索引、布隆过滤、压缩和解压缩等等。但都离不开减少IO访问的本质。


首先截取了部分数据库中使用卸载存储特性的SQL(这些SQL是必须要优先处理的):

SELECT SQL_ID,SUBSTR(SQL_TEXT,0,150), IO_CELL_OFFLOAD_ELIGIBLE_BYTES/1024/1024/1024 G FROM V$SQL WHERE IO_CELL_OFFLOAD_ELIGIBLE_BYTES<>0;



可以看到SQL中使用hint full(N) 或者直接路径加载方式引导SQL走智能扫描,那么就需要对这些SQL进行精细化调整。

 

举例,原SQL如下:

SELECT A.QSRQ,A.JZRQ,A.BZ,A.TELLER,SUM(A.A_AMOUNT) AS A_AMOUNT,SUM(A.B_AMOUNT) AS B_AMOUNT FROM
(SELECT /*+full(JR)*/ '2018-04-01' AS QSRQ, 
     '2018-06-30' AS JZRQ,
     JR.TELLER_NO AS TELLER,
     DECODE(ED.SIGN,'+',JR.FROM_CURR_CODE,JR.TO_CURRENCY_CODE) AS BZ,
     SUM(DECODE(ED.SIGN,'+',JR.JNRST_AMOUNT,0)) AS A_AMOUNT,
     SUM(DECODE(ED.SIGN,'-',JR.JNRST_AMOUNT,0)) AS B_AMOUNT
FROM JR01_01 JR
LEFT JOIN ED1P ED ON ED.TRAN_CODE=JR.TRAN_CODE
INNER JOIN CB_EDP RE ON RE.TRAN_CODE=JR.TRAN_CODE AND RE.CA_FLAG = 0
WHERE JR.POST_DATE >= TO_DATE('2018-04-01','YYYY-MM-DD')
  AND JR.POST_DATE <= TO_DATE('2018-06-30','YYYY-MM-DD')
      AND EXISTS (SELECT JGM FROM JGDY G WHERE G.JGM=JR.TRAN_BRANCH AND G.JGM='4051'
                  UNION
                  SELECT JGM FROM JGDY G WHERE G.JGM=JR.TRAN_BRANCH AND G.SJJGM='4051')
      AND EXISTS (SELECT '1' FROM TELM PARTITION("TELM_2018-06-30"WHERE EXTDATE =TO_DATE('2018-06-30','YYYY-MM-DD')
      AND TELLER_NO = JR.TELLER_NO AND TERM_TYPE='0' )
GROUP BY JR.TELLER_NO,JR.FROM_CURR_CODE,JR.TO_CURRENCY_CODE,ED.SIGN) A GROUP BY  A.BZ,A.TELLER,A.QSRQ,A.JZRQ ORDER BY A.TELLER;


SQL跑了将近3分钟,执行计划:


通过如下得知,智能扫描特性为本SQL节约了86.25%的IO开销,但平行迁移到普通数据库中不做任何处理效率是下降的。

select 
sql_id ,
child_number,
decode(io_cell_offload_eligible_bytes,0,'No','Yes') OFFLOAD,
decode(io_cell_offload_eligible_bytes,0,0,100*(io_cell_offload_eligible_bytes-IO_interconnect_bytes))/decode(io_cell_offload_eligible_bytes,0,1,io_cell_offload_eligible_bytes) "IO_saved%",
(ELAPSED_TIME/1000000/DECODE(NVL(EXECUTIONS,0),0,1,EXECUTIONS)) avg_time
from gv$sql s where sql_id in ('4gfsgnxzpjp90'order by 1,2,3;

SQL_ID        CHILD_NUMBER OFF  IO_saved%   AVG_TIME
------------- ------------ --- ---------- ----------
4gfsgnxzpjp90            0 Yes 86.2519623  216.99365


下面是不做任何调整跑到QData一体机中效果,SQL执行效果如下(SQL还没有执行完,时间肯定大于1500秒):

13:21:46 report.QData>r
1  select
2  sql_id ,
3  child_number,
4  decode(io_cell_offload_eligible_bytes,0,'No','Yes') OFFLOAD,
5  decode(io_cell_offload_eligible_bytes,0,0,100*(io_cell_offload_eligible_bytes-IO_interconnect_bytes))/decode(io_cell_offload_eligible_bytes,0,1,io_cell_offload_eligible_bytes) "IO_saved%",
6  (ELAPSED_TIME/1000000/DECODE(NVL(EXECUTIONS,0),0,1,EXECUTIONS)) avg_time
7from gv$sql s where sql_id in ('4gfsgnxzpjp90') order by 1,2,3

SQL_ID        CHILD_NUMBER OFF  IO_saved%   AVG_TIME
------------- ------------ --- ---------- ----------
4gfsgnxzpjp90            0 No           0 1504.55472


添加如下索引:


添加索引后的执行计划:


执行变快的一个标准就是取得JR01_01表数据的逻辑读从1942K变为19152。

 

随着硬件技术发展,企业不断追求低成本,必将有大量的国产一体机取代Exadata,同样的也有对应技术来帮助实现这份工作。



|  作者简介

姚崇·沃趣科技高级数据库技术专家

熟悉Oracle数据库内部机制,丰富的数据库及RAC集群层故障诊断、性能调优、OWI、数据库备份恢复及迁移经验。

相关链接

应用示例荟萃 | performance_schema全方位介绍(上)

应用示例荟萃 | performance_schema全方位介绍(中)

应用示例荟萃 | performance_schema全方位介绍(下)

Oracle中的sysctl.conf内核参数

SQL优化案例 - 从执行计划定位SQL问题(三)

容器化 RDS:借助 CSI 扩展 Kubernetes 存储能力


更多干货,欢迎来撩~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存