goodwzb 发表于 2014-1-8 17:11:36

跪请刘大分析一个执行计划

尊敬的刘大:
请教一下如下SQL语句的执行计划,SQL如下:select count(*) from (
  SELECT /*+INDEX(IGW EMERALD_ISN_GRP_WIP11)*/ FAIL,GRP,MACTYPE,0,WIP
    FROM EMERALD_ISN_GRP_WIP IGW, PQA_SETUP_TMP TMP_R, PQA_SETUP_TMP TMP_L, PQA_SETUP_TMP TMP_G
   WHERE IGW.FIRST_DATE BETWEEN TO_DATE('20130105070000','YYYYMMDDHH24MISS') AND TO_DATE('20130106065959','YYYYMMDDHH24MISS')
     AND IGW.ROUTE=TMP_R.VAL
     AND IGW.GRP=TMP_G.VAL
     AND IGW.LINE=TMP_L.VAL
     AND TMP_R.TYP='ROUTE'
     AND TMP_G.TYP='GRP'
     AND TMP_L.TYP='LINE'
);索引EMERALD_ISN_GRP_WIP11字段如下:EMERALD_ISN_GRP_WIP11        ROUTE        1
EMERALD_ISN_GRP_WIP11        FIRST_DATE        2
EMERALD_ISN_GRP_WIP11        GRP        3
EMERALD_ISN_GRP_WIP11        LINE        4执行计划如下(来自v$SQL_PLAN):
0                SELECT STATEMENT                                               
1        0        SORT        AGGREGATE                                       
2        1        NESTED LOOPS                                               
3        2        MERGE JOIN        CARTESIAN                                       
4        3        MERGE JOIN        CARTESIAN                                       
5        4        SORT        UNIQUE                                       
6        5        TABLE ACCESS        BY INDEX ROWID        PQA_SETUP_TMP        TABLE (TEMP)                       
7        6        INDEX        RANGE SCAN        PQA_SETUP_TMP1        INDEX                "TYP"='LINE'       
8        4        BUFFER        SORT                                       
9        8        SORT        UNIQUE                                       
10        9        TABLE ACCESS        BY INDEX ROWID        PQA_SETUP_TMP        TABLE (TEMP)                       
11        10        INDEX        RANGE SCAN        PQA_SETUP_TMP1        INDEX                "TYP"='GRP'       
12        3        BUFFER        SORT                                       
13        12        SORT        UNIQUE                                       
14        13        TABLE ACCESS        BY INDEX ROWID        PQA_SETUP_TMP        TABLE (TEMP)                       
15        14        INDEX        RANGE SCAN        PQA_SETUP_TMP1        INDEX                "TYP"='ROUTE'       
16        2        PARTITION RANGE        SINGLE                                       
17        16        INDEX        RANGE SCAN        EMERALD_ISN_GRP_WIP11        INDEX                "IGW"."ROUTE"="VAL" AND "IGW"."FIRST_DATE">=TO_DATE(' 2013-01-05 07:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "IGW"."GRP"="VAL" AND "IGW"."LINE"="VAL" AND "IGW"."FIRST_DATE"<=TO_DATE(' 2013-01-06 06:59:59', 'syyyy-mm-dd hh24:mi:ss')        ("IGW"."GRP"="VAL" AND "IGW"."LINE"="VAL")我的疑问是:访问谓词里已经有IGW.GRP和IGW.LINE(如红色)了,为什么在过滤谓词里还会再次出现IGW.GRP和IGW.LINE(如蓝色)?难道先By IGW.GRP和IGW.LINE去访问表,再用IGW.GRP和IGW.LINE去过滤前面访问出来的数据?会不会多此一举?
另外最想不通的是第17,16步和第2步,按照执行顺序来看,是先17,16(索引范围扫),再第2步(NL),既然第17步的时候已经BY索引扫出来结果了,还有必要再进行第2步的NL吗?是不是应该17步索引扫,然后直接By Rowid Access Table即可?而不应该是NL?

以上疑惑,麻烦抽点时间帮忙解答一下,感激不尽,谢谢!

goodwzb 发表于 2014-1-8 17:14:53

奇怪,颜色没有正常显示:
这是访问谓词
"IGW"."ROUTE"="VAL" AND "IGW"."FIRST_DATE">=TO_DATE(' 2013-01-05 07:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "IGW"."GRP"="VAL" AND "IGW"."LINE"="VAL" AND "IGW"."FIRST_DATE"<=TO_DATE(' 2013-01-06 06:59:59', 'syyyy-mm-dd hh24:mi:ss')  

这是过滤谓词
"IGW"."GRP"="VAL" AND "IGW"."LINE"="VAL"

Liu Maclean(刘相兵 发表于 2014-1-8 17:19:03


一个好的问题 的基本要素:一个好的标题、 完整的版本信息、 完整的日志信息、 报错信息
请使用 sql health check 脚本 分析该SQL 然后上传HTML
http://www.oracledatabase12g.com/archives/sql-tuning-health-check-script.html

goodwzb 发表于 2014-1-8 17:24:39

Liu Maclean(刘相兵 发表于 2014-1-8 17:19 static/image/common/back.gif
一个好的问题 的基本要素:一个好的标题、 完整的版本信息、 完整的日志信息、 报错信息
请使用 sql heal ...

唉,生产环境,怕呀……
页: [1]
查看完整版本: 跪请刘大分析一个执行计划