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

今天接到同事求助,说有一个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  <strong>meta_dbql_table_usage_exp_hst</strong> src
 inner <strong>join DR_QRY_LOG_EXP_HST</strong> rl on
  <strong>src.acctstringdate = rl.acctstringdate
  and src.queryid = rl.queryid</strong>
  And Src.Systemname = Rl.Systemname
  and src.acctstringdate > sysdate - 30
  And Rl.Acctstringdate > Sysdate - 30
 inner join  <strong>meta_dr_qry_log_tgt_all_hst </strong>tgt on
  upper(tgt.systemname) = upper('MOZART')
  And Upper(tgt.Databasename) = Upper('GDW_TABLES')
  And Upper(tgt.Tablename) = Upper('SSA_SLNG_LSTG_MTRC_SD')
  <strong>AND src.acctstringdate = tgt.acctstringdate
  and rl.statement_id = tgt.statement_id</strong>
  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)

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索src
, and
, lenet iter 10000
UPPER
oracle 本地分区索引、oracle 分区索引、oracle 分区表 索引、oracle 创建分区索引、oracle 重建分区索引,以便于您获取更多的相关知识。

时间: 2024-10-29 11:13:15

Oracle中一个通过添加本地分区索引提高SQL性能的案例的相关文章

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

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

Oracle中检查外键是否有索引的SQL脚本分享_oracle

复制代码 代码如下: COLUMN COLUMNS format a30 word_wrapped COLUMN tablename format a15 word_wrapped COLUMN constraint_name format a15 word_wrapped SELECT TABLE_NAME,        CONSTRAINT_NAME,        CNAME1 || NVL2(CNAME2, ',' || CNAME2, NULL) ||        NVL2(CNA

Oracle中range,hash及list分区现实应用和平共处优缺点

oracle的range,hash,list三大分区可能我们大家在熟悉不过了,但什么每种分区适用于什么场景可能是很多人的疑惑点,那么在选择不同的分区时应该注意什么,为什么这么选,有哪些需要我们加以注意的地方,让我们一一来探索一下吧:) A.创建range分区,一般用于日期化处理,range分区可以很好的管理基于日期来分区的数据 创建一个新用户ls SYS@LEO> create user ls identified by ls; SYS@LEO> grant dba to ls; SYS@LE

利用索引提高SQL Server数据处理的效率

在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或用哪一个索引.因为查询执行的大部分开销是磁盘I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读表的每一个数据页,如果有索引指向数据值,则查询只需读几次磁盘就可以了.所以如果建立了合理的索引,优化器就能利用索引加速数据的查询过程.但是,索引并不总是提高系统的性能,在增.删.改操作中索引的存在会增加

利用索引提高SQL Server数据处理效率

在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或用哪一个索引.因为查询执行的大部分开销是磁盘I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读表的每一个数据页,如果有索引指向数据值,则查询只需读几次磁盘就可以了.所以如果建立了合理的索引,优化器就能利用索引加速数据的查询过程.但是,索引并不总是提高系统的性能,在增.删.改操作中索引的存在会增加

SQL Server-聚焦过滤索引提高查询性能(十)

前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to review the basics. 过滤索引,在查询条件上创建非聚集索引(1) 过滤索引是SQL 2008的新特性,被应用在表中的部分行,所以利用过滤索引能够提高查询,相对于全表扫描它能减少索引维护和索引存储的成本.当我们在索引上应用WHERE条件时就是过滤索引.也就是满足如下格式: CREATE NONC

[数据库]Oracle中一个日期查找的误区

oracle|数据|数据库 经常要在数据中检索近一个月来发生的数据,所以采用如下语句select * from eventtable where eventdate>sysdate-30,当数据量小的时候还看不出来,数据量大一些就会发现上面的语句很慢,但eventdate(日期型字段)上也是有索引的,可为什么会慢呢? 原来是Oracle在进行查找的时候不断地去取sysdate这个不断变化的值,而不是我们想象中的一次产生一个条件语句然后进行查找.为了加快速度,我们可以先把当天的日期取出来,然后转成

oracle为一个表创建表分区问题

问题描述 oracle一个日志表,每日的数据量是2000万,该表数据要保留3-6个月.如何创建表分区.求指点 解决方案 这种么 直接hash分区或者range分区都可以吧,用hash用得比较多..因为字段的值不确定用range不好办而且不均匀,像这种日期比较确定的用range可以的,用hash也行http://blog.csdn.net/xieyuooo/article/details/5437126 http://space.itpub.net/18953778/viewspace-55747

oracle中 一个字段放入多个其它字段内容

问题描述 客户提出这个报表需求 投诉量受理号码2次 3次 4次 5次 5次以上查出2次投诉的投诉量,和所有有两次投诉的号码, 投诉量还比较好查,通过having count可以查出,但是需要把满足条件的受理号码都放入这个字段这个有啥办法么? 问题补充:Steven20101201 写道 解决方案 只有拼接了,就是针对同样的投诉量,把投诉号码拼接起来,然后在其中用分隔符分开了,哎,又是这样一个需求.刚刚给上面一个写了个存储过程 也是拼接的.