• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

解析一个通过添加本地分区索引提高SQL性能的案例

mysql 搞代码 4年前 (2022-01-09) 25次浏览 已收录 0个评论

今天接到同事求助,说有一个select query,在Oracle上要跑一分多钟,他希望能在5s内出结果,以下就是解决这个问题的方法,需要的朋友可以参考下 该sql如下: 复制代码 代码如下: Select /*+ parallel(src, 8) */ distinct src.systemname as systemname ,

今天接到同事求助,说有一个select query,在Oracle上要跑一分多钟,他希望能在5s内出结果,以下就是解决这个问题的方法,需要的朋友可以参考下

该sql如下:

复制代码 代码如下:

Select /*+ parallel(src, 8) */ distinct
src.systemname as systemname
, src.databasename as databasename
, src.tablename as tablename
, src.username as username
from meta_dbql_table_usage_exp_hst src
inner join DR_QRY_LOG_EXP_HST rl on
src.acctstringdate = rl.acctstringdate
and src.queryid = rl.queryid

And Src.Systemname = Rl.Systemname
and src.acctstringdate > sysdate – 30
And Rl.Acctstringdate > Sysdate – 30
inner join meta_dr_qry_log_tgt_all_hst tgt on
upper(tgt.systemname) = upper(‘MOZART’)
And Upper(tgt.Databasename) = Upper(‘GDW_TABLES’)
And Upper(tgt.Tablename) = Upper(‘SSA_SLNG_LSTG_MTRC_SD’)本文来源gaodai#ma#com搞@@代~&码*网/
AND src.acctstringdate = tgt.acctstringdate
and rl.statement_id = tgt.statement_id

and rl.systemname = tgt.systemname
And Tgt.Acctstringdate > Sysdate – 30
And Not(
Upper(Tgt.Systemname)=Upper(src.systemname)
And
Upper(Tgt.Databasename) = Upper(Src.Databasename)
And
Upper(Tgt.Tablename) = Upper(Src.Tablename)
)
And tgt.Systemname is not null
And tgt.Databasename Is Not Null
And tgt.tablename is not null

SQL的简单分析
总 得来看,这个SQL就是三个表 (meta_dbql_table_usage_exp_hst,DR_QRY_LOG_EXP_HST,meta_dr_qry_log_tgt_all_hst) 的INNER JOIN,这三个表数据量都在百万级别,且都是分区表(以acctstringdate为分区键),执行计划如下:

复制代码 代码如下:

————————————————————————————————————————
| Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop |
————————————————————————————————————————
| 0 | SELECT STATEMENT | | 1 | 159 | 8654 | | |
| 1 | PX COORDINATOR | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10002 | 1 | 159 | 8654 | | |
| 3 | SORT UNIQUE | | 1 | 159 | 8654 | | |
| 4 | PX RECEIVE | | 1 | 36 | 3 | | |
| 5 | PX SEND HASH | :TQ10001 | 1 | 36 | 3 | | |
|* 6 | TABLE ACCESS BY LOCAL INDEX ROWID| DR_QRY_LOG_EXP_HST | 1 | 36 | 3 | | |
| 7 | NESTED LOOPS | | 1 | 159 | 8633 | | |
| 8 | NESTED LOOPS | | 8959 | 1076K| 4900 | | |
| 9 | BUFFER SORT | | | | | | |
| 10 | PX RECEIVE | | | | | | |
| 11 | PX SEND BROADCAST | :TQ10000 | | | | | |
| 12 | PARTITION RANGE ITERATOR | | 1 | 56 | 4746 | KEY | 14 |
|* 13 | TABLE ACCESS FULL | META_DR_QRY_LOG_TGT_ALL_HST | 1 | 56 | 4746 | KEY | 14 |
| 14 | PX BLOCK ITERATOR | | 8959 | 586K| 154 | KEY | KEY |
|* 15 | TABLE ACCESS FULL | META_DBQL_TABLE_USAGE_EXP_HST | 8959 | 586K| 154 | KEY | KEY |
| 16 | PARTITION RANGE ITERATOR | | 1 | | 2 | KEY | KEY |
|* 17 | INDEX RANGE SCAN | DR_QRY_LOG_EXP_HST_IDX | 1 | | 2 | KEY | KEY |
————————————————————————————————————————
Predicate Information (identified by operation id):
—————————————————
6 – filter(“RL”.”STATEMENT_ID”=”TGT”.”STATEMENT_ID” AND “RL”.”SYSTEMNAME”=”TGT”.”SYSTEMNAME” AND “SRC”.”SYSTEMNAME”=”RL”.”SYSTEMNAME”)
13 – filter(UPPER(“TGT”.”SYSTEMNAME”)=’MOZART’ AND UPPER(“TGT”.”DATABASENAME”)=’GDW_TABLES’ AND
UPPER(“TGT”.”TABLENAME”)=’SSA_SLNG_LSTG_MTRC_SD’ AND “TGT”.”ACCTSTRINGDATE”>SYSDATE@!-30 AND “TGT”.”SYSTEMNAME” IS NOT NULL
“TGT”.”DATABASENAME” IS NOT NULL AND “TGT”.”TABLENAME” IS NOT NULL)
15 – filter(“SRC”.”ACCTSTRINGDATE”=”TGT”.”ACCTSTRINGDATE” AND (UPPER(“TGT”.”SYSTEMNAME”)UPPER(“SRC”.”SYSTEMNAME”) OR
UPPER(“TGT”.”DATABASENAME”)UPPER(“SRC”.”DATABASENAME”) OR UPPER(“TGT”.”TABLENAME”)UPPER(“SRC”.”TABLENAME”)) AND
“SRC”.”ACCTSTRINGDATE”>SYSDATE@!-30)
17 – access(“SRC”.”QUERYID”=”RL”.”QUERYID” AND “SRC”.”ACCTSTRINGDATE”=”RL”.”ACCTSTRINGDATE”)
filter(“RL”.”ACCTSTRINGDATE”>SYSDATE@!-30)


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:解析一个通过添加本地分区索引提高SQL性能的案例
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址