Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

86

积分

0

好友

2

主题
1#
发表于 2012-5-10 17:52:09 | 查看: 8038| 回复: 28
SQL>
SQL> set autotrace trace
SQL> select rowid,
  2         title,
  3         filepath,
  4         filename,
  5         layoutpath,
  6         publishdate,
  7         classid,
  8         infolink,
  9         defaultpicurl,
10         hits
11    FROM (SELECT t.Title         as title,
12                 t.FilePath      as filepath,
13                 t.FileName      as filename,
14                 t.LayOutPath    as layoutpath,
15                 t.PublishDate   as publishdate,
16                 t.ClassID       as classid,
17                 t.InfoLink      as infolink,
18                 t.DefaultPicUrl as defaultpicurl,
19                 t.Hits          as hits
20            FROM Article t
21           WHERE EXISTS (SELECT a.ArticleID
22                    FROM Article a, ArticleKeyWord k
23                   WHERE a.Deleted = 0
24                     AND a.Passed = 1
25                     AND a.ToHtml = 1
26                     AND a.ArticleID != 1241637
27                     AND t.ArticleID = a.ArticleID
28                     AND a.InfoShareType = 0
29                     AND a.ArticleID = k.INFOID
30                     AND (k.KeyWord = 'A' OR k.KeyWord = 'B' OR
31                         k.KeyWord = 'C' OR k.KeyWord = 'D' OR
32                         k.KeyWord = 'E' OR k.KeyWord = 'F' OR
33                         k.KeyWord = 'G' OR k.KeyWord = 'H' OR
34                         k.KeyWord = 'I' OR k.KeyWord = 'J'))
35             AND t.SiteID = 202
36             AND t.cssType = 'none'
37           ORDER BY t.ArticleID DESC)
38   WHERE ROWNUM < 6;


执行计划
----------------------------------------------------------
Plan hash value: 2530861319

--------------------------------------------------------------------------------

--------------------------------------------------

| Id  | Operation                                | Name          | Rows  | Bytes

|TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |

--------------------------------------------------------------------------------

--------------------------------------------------

|   0 | SELECT STATEMENT                         |               |     1 |   840

|       |    11M  (1)| 37:06:40 |       |       |

|*  1 |  COUNT STOPKEY                           |               |       |
|       |            |          |       |       |

|   2 |   VIEW                                   |               |     1 |   840

|       |    11M  (1)| 37:06:40 |       |       |

|*  3 |    SORT ORDER BY STOPKEY                 |               |     1 |   157

|   271M|    11M  (1)| 37:06:40 |       |       |

|*  4 |     FILTER                               |               |       |
|       |            |          |       |       |

|   5 |      PARTITION HASH ALL                  |               |   745K|   111

M|       | 50085   (1)| 00:10:02 |     1 |     4 |

|*  6 |       TABLE ACCESS FULL                  | ARTICLE       |   745K|   111

M|       | 50085   (1)| 00:10:02 |     1 |     4 |

|*  7 |      FILTER                              |               |       |
|       |            |          |       |       |

|   8 |       NESTED LOOPS                       |               |     1 |    30

|       |    15   (0)| 00:00:01 |       |       |

|*  9 |        TABLE ACCESS BY GLOBAL INDEX ROWID| ARTICLE       |     1 |    17

|       |     3   (0)| 00:00:01 | ROWID | ROWID |

|* 10 |         INDEX UNIQUE SCAN                | PKKEY_ARTICLE |     1 |
|       |     2   (0)| 00:00:01 |       |       |

|  11 |        INLIST ITERATOR                   |               |       |
|       |            |          |       |       |

|* 12 |         INDEX UNIQUE SCAN                | INFO_KEYWORD  |     1 |    13

|       |    12   (0)| 00:00:01 |       |       |

--------------------------------------------------------------------------------

--------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM<6)
   3 - filter(ROWNUM<6)
   4 - filter( EXISTS (SELECT /*+ */ 0 FROM "ARTICLEKEYWORD" "K","ARTICLE" "A" W

HERE :B1<>1241637 AND "A"."ARTICLEID"=:B2

              AND "A"."TOHTML"=1 AND "A"."DELETED"=0 AND "A"."PASSED"=1 AND "A".

"INFOSHARETYPE"=0 AND "A"."ARTICLEID"<>1241637 AND

              ("K"."KEYWORD"='A' OR "K"."KEYWORD"='B' OR "K"."KEYWORD"='C' OR "K"."KEYWORD"='D' OR "K"."KEYWORD"=E' OR

              "K"."KEYWORD"='F' OR "K"."KEYWORD"='G' OR "K"."KEYWORD

"='H' OR "K"."KEYWORD"='I' OR "K"."KEYWORD"='J') AND

              "K"."INFOID"=:B3 AND "K"."INFOID"<>1241637))
   6 - filter("T"."SITEID"=202 AND "T"."CSSTYPE"='none')
   7 - filter(:B1<>1241637)
   9 - filter("A"."TOHTML"=1 AND "A"."DELETED"=0 AND "A"."PASSED"=1 AND "A"."INF

OSHARETYPE"=0)

  10 - access("A"."ARTICLEID"=:B1)
       filter("A"."ARTICLEID"<>1241637)
  12 - access("K"."INFOID"=:B1 AND ("K"."KEYWORD"='A' OR "K"."KEYWORD"='B'

OR "K"."KEYWORD"='A' OR "K"."KEYWORD"='C'

              OR "K"."KEYWORD"='D' OR "K"."KEYWORD"='E' OR "K"."KEYWOR

D"='F' OR "K"."KEYWORD"='G' OR "K"."KEYWORD"='H' OR

              "K"."KEYWORD"='I'))
       filter("K"."INFOID"<>1241637)


统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
   33193276  consistent gets
       8697  physical reads
          0  redo size
       1676  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          5  rows processed

逻辑读狂高,请问刘大怎么才能把这个降低下去?
article表大概80w(articleid主键),ARTICLEKEYWORD(id和keyword是主键)大概200w数据。
里面exists的查询大概能查5k条左右数据。请问为何唯有如此之高的逻辑读。
难道问题在exists上,会用每一天articleid去轮询外面的大概?请刘大看看
2#
发表于 2012-5-10 18:28:26
执行计划能否用code tag括起来,看起来好像不是太好看。

回复 只看该作者 道具 举报

3#
发表于 2012-5-10 19:12:28
请使用 sql health check 脚本 分析该SQL 然后上传HTML
http://www.oracledatabase12g.com ... h-check-script.html

回复 只看该作者 道具 举报

4#
发表于 2012-5-11 10:02:42
sqlhc附件传上来了。

[ 本帖最后由 lhpapa 于 2012-5-11 10:11 编辑 ]

sqlhc.html

47.11 KB, 下载次数: 678

sqltuning.txt

20.17 KB, 下载次数: 1026

回复 只看该作者 道具 举报

5#
发表于 2012-5-11 10:15:14
建议如果有测试环境可以试试对SITEID和CSSTYPE弄一个复合索引,再观察下执行计划。
另外,感觉对于Article这个表,索引好像过多了吧。

回复 只看该作者 道具 举报

6#
发表于 2012-5-11 10:17:22
sqltuning采用自动生成的profile性能可以性能提高96.72,请刘大分析下是否合理。有没有更好的办法?

回复 只看该作者 道具 举报

7#
发表于 2012-5-11 10:19:04
我擦...楼主绑定的变量都是些什么啊?敢不敢健康一点啊...

回复 只看该作者 道具 举报

8#
发表于 2012-5-11 10:20:07
execution_plan1.png


SQL:

select rowid,
       title,
       filepath,
       filename,
       layoutpath,
       publishdate,
       classid,
       infolink,
       defaultpicurl,
       hits
  FROM (SELECT t.Title         as title,
               t.FilePath      as filepath,
               t.FileName      as filename,
               t.LayOutPath    as layoutpath,
               t.PublishDate   as publishdate,
               t.ClassID       as classid,
               t.InfoLink      as infolink,
               t.DefaultPicUrl as defaultpicurl,
               t.Hits          as hits
          FROM Article t
         WHERE EXISTS
         (SELECT /*+ index(k,KEYWORD_LH)*/
                 a.ArticleID
                  FROM Article a, ArticleKeyWord k
                 WHERE a.Deleted = :"SYS_B_00"
                   AND a.Passed = :"SYS_B_01"
                   AND a.ToHtml = :"SYS_B_02"
                   AND a.ArticleID != :"SYS_B_03"
                   AND t.ArticleID = a.ArticleID
                   AND a.InfoShareType = :"SYS_B_04"
                   AND a.ArticleID = k.INFOID
                   AND (k.KeyWord = :"SYS_B_05" OR k.KeyWord = :"SYS_B_06" OR
                       k.KeyWord = :"SYS_B_07" OR k.KeyWord = :"SYS_B_08" OR
                       k.KeyWord = :"SYS_B_09" OR k.KeyWord = :"SYS_B_10" OR
                       k.KeyWord = :"SYS_B_11" OR k.KeyWord = :"SYS_B_12" OR
                       k.KeyWord = :"SYS_B_13" OR k.KeyWord = :"SYS_B_14"))
           AND t.SiteID = :"SYS_B_15"
           AND t.cssType = :"SYS_B_16"
         ORDER BY t.ArticleID DESC)
WHERE ROWNUM < :"SYS_B_17"

回复 只看该作者 道具 举报

9#
发表于 2012-5-11 10:27:03
key word SORT ORDER BY STOPKEY with bind rownum


action plan:

1. 对于语句最后的 ROWNUM 避免使用绑定变量

2.  尝试使用 IN  替换 Exists

3.  尝试 加入 First_rows hint 在最外部

回复 只看该作者 道具 举报

10#
发表于 2012-5-11 10:29:24
那系统的sql变量都是动态生成的,我改成force了。所以这样。

回复 只看该作者 道具 举报

11#
发表于 2012-5-11 10:34:10
你采用了 cursor_sharing = FORCE 这造成强制绑定

对于rownum的 绑定可能造成 灾难性的后果:

SQL>
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production







SQL> drop table test;            

Table dropped.

SQL> create table test as select * from dba_objects;

Table created.

SQL> create index ind_objd on test(object_id);

Index created.

SQL> exec dbms_stats.gather_table_stats('','TEST',cascade=>TRUE);

PL/SQL procedure successfully completed.

SQL> explain plan for select * from test where object_id between 10 and 20000;

Explained.

SQL> set linesize 100 pagesize 1000
SQL> @?/rdbms/admin/utlxplp

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 1357081020

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 18680 |  1696K|   157   (2)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| TEST | 18680 |  1696K|   157   (2)| 00:00:02 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("OBJECT_ID"<=20000 AND "OBJECT_ID">=10)

13 rows selected.

SQL>  explain plan for select * from test where object_id between 10 and 20000 and rownum<10;

Explained.

SQL> @?/rdbms/admin/utlxplp

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 439845519

-----------------------------------------------------------------------------------------
| Id  | Operation                    | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |          |     9 |   837 |     3   (0)| 00:00:01 |
|*  1 |  COUNT STOPKEY               |          |       |       |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID| TEST     |    11 |  1023 |     3   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | IND_OBJD |       |       |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM<10)
   3 - access("OBJECT_ID">=10 AND "OBJECT_ID"<=20000)

16 rows selected.

SQL> variable rn number;
SQL> exec :rn:=10;

PL/SQL procedure successfully completed.

SQL> explain plan for select * from test where object_id between 10 and 20000 and rownum<:rn;

Explained.

SQL>  @?/rdbms/admin/utlxplp

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 3931117773

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      | 18680 |  1696K|   157   (2)| 00:00:02 |
|*  1 |  COUNT STOPKEY     |      |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| TEST | 18680 |  1696K|   157   (2)| 00:00:02 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM<TO_NUMBER(:RN))
   2 - filter("OBJECT_ID"<=20000 AND "OBJECT_ID">=10)

15 rows selected.

回复 只看该作者 道具 举报

12#
发表于 2012-5-11 10:57:11
呵呵,这是rownum 执行计划的bug,但返回的实际条数是9 rows

回复 只看该作者 道具 举报

13#
发表于 2012-5-11 10:58:06
将cursor改回了exact还是有COUNT STOPKEY 的情况。。。。

trace.txt

6.3 KB, 下载次数: 875

回复 只看该作者 道具 举报

14#
发表于 2012-5-11 11:01:43
COUNT STOPKEY 是rownum的执行计划

回复 只看该作者 道具 举报

15#
发表于 2012-5-11 11:03:38
那SORT ORDER BY STOPKEY 还是有哎。271M 呢。

回复 只看该作者 道具 举报

16#
发表于 2012-5-11 11:04:14
继续 follow action plan

回复 只看该作者 道具 举报

17#
发表于 2012-5-11 11:19:48
刚才又测了遍:单独跑(SELECT t.Title         as title,
               t.FilePath      as filepath,
               t.FileName      as filename,
               t.LayOutPath    as layoutpath,
               t.PublishDate   as publishdate,
               t.ClassID       as classid,
               t.InfoLink      as infolink,
               t.DefaultPicUrl as defaultpicurl,
               t.Hits          as hits
          FROM Article t
         WHERE EXISTS (SELECT a.ArticleID
                  FROM Article a, ArticleKeyWord k
                 WHERE a.Deleted = 0
                   AND a.Passed = 1
                   AND a.ToHtml = 1
                   AND a.ArticleID != 1241637
                   AND t.ArticleID = a.ArticleID
                   AND a.InfoShareType = 0
                   AND a.ArticleID = k.INFOID
                   AND (k.KeyWord = '大叔' OR k.KeyWord = '裸体' OR
                       k.KeyWord = '少女' OR k.KeyWord = '性观念' OR
                       k.KeyWord = '性侵害' OR k.KeyWord = '杨金元' OR
                       k.KeyWord = '远程视频' OR k.KeyWord = '诊所' OR
                       k.KeyWord = '正当防卫' OR k.KeyWord = '匕首'))
           AND t.SiteID = 202
           AND t.cssType = 'none'
         ORDER BY t.ArticleID DESC)只要2秒就可以读出来700多条记录。

但是外面加上select rowid,
       title,
       filepath,
       filename,
       layoutpath,
       publishdate,
       classid,
       infolink,
       defaultpicurl,
       hits
  FROM (********************)  WHERE ROWNUM < 6 的话,就要37秒。

回复 只看该作者 道具 举报

18#
发表于 2012-5-11 11:23:14
用 hint no_merge no_push_pred 呢

回复 只看该作者 道具 举报

19#
发表于 2012-5-11 11:26:46
上面2个sql分开执行的plan:

newtrace.txt

9.62 KB, 下载次数: 858

回复 只看该作者 道具 举报

20#
发表于 2012-5-11 11:36:23
来个ture plan,不带rownum的只要11370个逻辑读,带了rownum却要33219328个逻辑读。郁闷。

[ 本帖最后由 lhpapa 于 2012-5-11 11:42 编辑 ]

newtrace2.txt

10.43 KB, 下载次数: 892

回复 只看该作者 道具 举报

21#
发表于 2012-5-11 11:39:11
应该是 merge view 和 谓词推进 造成的

回复 只看该作者 道具 举报

22#
发表于 2012-5-11 11:47:50
其实结果已经在括号里面查询出来了并且排序,外面只是根据rownum取了5行数据而已。这么大的无用,逻辑读,很奇怪啊。

回复 只看该作者 道具 举报

23#
发表于 2012-5-11 12:21:59
  1. select rowid,
  2. title,
  3. filepath,
  4. filename,
  5. layoutpath,
  6. publishdate,
  7. classid,
  8. infolink,
  9. defaultpicurl,
  10. hits
  11. FROM (SELECT t.Title as title,
  12. t.FilePath as filepath,
  13. t.FileName as filename,
  14. t.LayOutPath as layoutpath,
  15. t.PublishDate as publishdate,
  16. t.ClassID as classid,
  17. t.InfoLink as infolink,
  18. t.DefaultPicUrl as defaultpicurl,
  19. t.Hits as hits
  20. row_number() over(order by t.ArticleID desc) rn
  21. FROM Article t
  22. WHERE t.articleid in (SELECT a.ArticleID
  23. FROM Article a, ArticleKeyWord k
  24. WHERE a.Deleted = 0
  25. AND a.Passed = 1
  26. AND a.ToHtml = 1
  27. AND a.ArticleID != 1241637
  28. AND t.ArticleID = a.ArticleID
  29. AND a.InfoShareType = 0
  30. AND a.ArticleID = k.INFOID
  31. AND k.KeyWord in('A','B','C','D','E','F','G','H','I','J'))
  32. AND t.SiteID = 202
  33. AND t.cssType = 'none')
  34. WHERE rn <= 5;
复制代码


试试这个呢?还有一种写法将最里面的子查询拿到和article进行关联查询。

回复 只看该作者 道具 举报

24#
发表于 2012-5-11 12:25:00
action plan:

alter session set "_push_join_predicate"=false;
alter session set "_pre_rewrite_push_pred"=false;
alter session set "_spr_push_pred_refspr"=false;
alter session set "_push_join_union_view2"=false;
alter session set "_complex_view_merging"=false;


RUN YOUR STATEMENT AGAIN !!

回复 只看该作者 道具 举报

25#
发表于 2012-5-11 12:39:05
抱歉,请刘大再看一看:

newtrace3.txt

10.86 KB, 下载次数: 874

回复 只看该作者 道具 举报

26#
发表于 2012-5-11 15:40:23
尝试 加入 以下 HINT first_rows 和  unnset
  1. select /*+ first_rows */  rowid,
  2.        title,
  3.        filepath,
  4.        filename,
  5.        layoutpath,
  6.        publishdate,
  7.        classid,
  8.        infolink,
  9.        defaultpicurl,
  10.        hits
  11.   FROM (SELECT /*+  unnset  */ t.Title         as title,
  12.                t.FilePath      as filepath,
  13.                t.FileName      as filename,
  14.                t.LayOutPath    as layoutpath,
  15.                t.PublishDate   as publishdate,
  16.                t.ClassID       as classid,
  17.                t.InfoLink      as infolink,
  18.                t.DefaultPicUrl as defaultpicurl,
  19.                t.Hits          as hits
  20.           FROM Article t
  21.          WHERE EXISTS
  22.          (SELECT /*+  unnset index(k,KEYWORD_LH)*/
  23.                  a.ArticleID
  24.                   FROM Article a, ArticleKeyWord k
  25.                  WHERE a.Deleted = :"SYS_B_00"
  26.                    AND a.Passed = :"SYS_B_01"
  27.                    AND a.ToHtml = :"SYS_B_02"
  28.                    AND a.ArticleID != :"SYS_B_03"
  29.                    AND t.ArticleID = a.ArticleID
  30.                    AND a.InfoShareType = :"SYS_B_04"
  31.                    AND a.ArticleID = k.INFOID
  32.                    AND (k.KeyWord = :"SYS_B_05" OR k.KeyWord = :"SYS_B_06" OR
  33.                        k.KeyWord = :"SYS_B_07" OR k.KeyWord = :"SYS_B_08" OR
  34.                        k.KeyWord = :"SYS_B_09" OR k.KeyWord = :"SYS_B_10" OR
  35.                        k.KeyWord = :"SYS_B_11" OR k.KeyWord = :"SYS_B_12" OR
  36.                        k.KeyWord = :"SYS_B_13" OR k.KeyWord = :"SYS_B_14"))
  37.            AND t.SiteID = :"SYS_B_15"
  38.            AND t.cssType = :"SYS_B_16"
  39.          ORDER BY t.ArticleID DESC)
  40. WHERE ROWNUM < :"SYS_B_17"
复制代码

回复 只看该作者 道具 举报

27#
发表于 2012-5-11 17:30:30
我把统计信息全删了,用的动态获取,目前的plan:
SQL>  select /*+ first_rows */   rowid,
  2         title,
  3         filepath,
  4         filename,
  5         layoutpath,
  6         publishdate,
  7         classid,
  8         infolink,
  9         defaultpicurl,
10         hits
11    FROM (SELECT /*+  unnset  */  t.Title         as title,
12                 t.FilePath      as filepath,
13                 t.FileName      as filename,
14                 t.LayOutPath    as layoutpath,
15                 t.PublishDate   as publishdate,
16                 t.ClassID       as classid,
17                 t.InfoLink      as infolink,
18                 t.DefaultPicUrl as defaultpicurl,
19                 t.Hits          as hits
20            FROM Article t
21           WHERE EXISTS (SELECT a.ArticleID
22                    FROM Article a, ArticleKeyWord k
23                   WHERE a.Deleted = 0
24                     AND a.Passed = 1
25                     AND a.ToHtml = 1
26                     AND a.ArticleID != 1241637
27                     AND t.ArticleID = a.ArticleID
28                     AND a.InfoShareType = 0
29                     AND a.ArticleID = k.INFOID
30                     AND (k.KeyWord = '大叔' OR k.KeyWord = '裸体' OR
31                         k.KeyWord = '少女' OR k.KeyWord = '性观念' OR
32                         k.KeyWord = '性侵害' OR k.KeyWord = '杨金元' OR
33                         k.KeyWord = '远程视频' OR k.KeyWord = '诊所' OR
34                         k.KeyWord = '正当防卫' OR k.KeyWord = '匕首'))
35             AND t.SiteID = 202
36             AND t.cssType = 'none'
37           ORDER BY t.ArticleID DESC)
38   WHERE ROWNUM < 6;

已用时间:  00: 00: 00.04

执行计划
----------------------------------------------------------
Plan hash value: 670148325

------------------------------------------------------------------------------
---------------------
| Id  | Operation                         | Name          | Rows  | Bytes | Co
st (%CPU)| Time     |
------------------------------------------------------------------------------
---------------------
|   0 | SELECT STATEMENT                  |               |     5 |  4200 |
13M  (1)| 46:01:02 |
|*  1 |  COUNT STOPKEY                    |               |       |       |
         |          |
|   2 |   VIEW                            |               |    29 | 24360 |
13M  (1)| 46:01:02 |
|*  3 |    TABLE ACCESS BY INDEX ROWID    | ARTICLE       |   999K|   851M|
753K  (1)| 02:30:37 |
|*  4 |     INDEX FULL SCAN DESCENDING    | PKKEY_ARTICLE |  1107K|       |  1
819   (1)| 00:00:22 |
|*  5 |      FILTER                       |               |       |       |
         |          |
|   6 |       NESTED LOOPS                |               |     1 |    78 |
15   (0)| 00:00:01 |
|*  7 |        TABLE ACCESS BY INDEX ROWID| ARTICLE       |     1 |    65 |
  3   (0)| 00:00:01 |
|*  8 |         INDEX UNIQUE SCAN         | PKKEY_ARTICLE |     1 |       |
  2   (0)| 00:00:01 |
|   9 |        INLIST ITERATOR            |               |       |       |
         |          |
|* 10 |         INDEX UNIQUE SCAN         | INFO_KEYWORD  |     1 |    13 |
12   (0)| 00:00:01 |
------------------------------------------------------------------------------
---------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM<6)
   3 - filter("T"."SITEID"=202 AND "T"."CSSTYPE"='none')
   4 - filter( EXISTS (SELECT 0 FROM "ARTICLEKEYWORD" "K","ARTICLE" "A" WHERE
:B1<>1241637
              AND "A"."ARTICLEID"=:B2 AND "A"."DELETED"=0 AND "A"."PASSED"=1 A
ND "A"."TOHTML"=1 AND
              "A"."INFOSHARETYPE"=0 AND "A"."ARTICLEID"<>1241637 AND ("K"."KEY
WORD"='大叔' OR
              "K"."KEYWORD"='裸体' OR "K"."KEYWORD"='少女' OR "K"."KEYWORD"='
性观念' OR "K"."KEYWORD"='性侵害' OR
              "K"."KEYWORD"='杨金元' OR "K"."KEYWORD"='远程视频' OR "K"."KEYWO
RD"='诊所' OR "K"."KEYWORD"='正当防卫'
              OR "K"."KEYWORD"='匕首') AND "K"."INFOID"=:B3 AND "K"."INFOID"<>
1241637))
   5 - filter(:B1<>1241637)
   7 - filter("A"."DELETED"=0 AND "A"."PASSED"=1 AND "A"."TOHTML"=1 AND
              "A"."INFOSHARETYPE"=0)
   8 - access("A"."ARTICLEID"=:B1)
       filter("A"."ARTICLEID"<>1241637)
  10 - access("K"."INFOID"=:B1 AND ("K"."KEYWORD"='大叔' OR "K"."KEYWORD"='裸
体' OR
              "K"."KEYWORD"='少女' OR "K"."KEYWORD"='性观念' OR "K"."KEYWORD"=
'性侵害' OR "K"."KEYWORD"='杨金元' OR
              "K"."KEYWORD"='远程视频' OR "K"."KEYWORD"='诊所' OR "K"."KEYWORD
"='正当防卫' OR "K"."KEYWORD"='匕首'))
       filter("K"."INFOID"<>1241637)

Note
-----
   - dynamic sampling used for this statement


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      23074  consistent gets
          0  physical reads
          0  redo size
       1694  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          5  rows processed

SQL>


---

回复 只看该作者 道具 举报

28#
发表于 2012-5-11 17:35:28
不加hint的的逻辑读也很低,貌似跟统计信息有很大关系,删除了统计信息后,主要和之前plan不一样的好像是没有走全表的fullscan
SQL>  select   rowid,
  2         title,
  3         filepath,
  4         filename,
  5         layoutpath,
  6         publishdate,
  7         classid,
  8         infolink,
  9         defaultpicurl,
10         hits
11    FROM (SELECT  t.Title         as title,
12                 t.FilePath      as filepath,
13                 t.FileName      as filename,
14                 t.LayOutPath    as layoutpath,
15                 t.PublishDate   as publishdate,
16                 t.ClassID       as classid,
17                 t.InfoLink      as infolink,
18                 t.DefaultPicUrl as defaultpicurl,
19                 t.Hits          as hits
20            FROM Article t
21           WHERE EXISTS (SELECT a.ArticleID
22                    FROM Article a, ArticleKeyWord k
23                   WHERE a.Deleted = 0
24                     AND a.Passed = 1
25                     AND a.ToHtml = 1
26                     AND a.ArticleID != 1241637
27                     AND t.ArticleID = a.ArticleID
28                     AND a.InfoShareType = 0
29                     AND a.ArticleID = k.INFOID
30                     AND (k.KeyWord = '大叔' OR k.KeyWord = '裸体' OR
31                         k.KeyWord = '少女' OR k.KeyWord = '性观念' OR
32                         k.KeyWord = '性侵害' OR k.KeyWord = '杨金元' OR
33                         k.KeyWord = '远程视频' OR k.KeyWord = '诊所' OR
34                         k.KeyWord = '正当防卫' OR k.KeyWord = '匕首'))
35             AND t.SiteID = 202
36             AND t.cssType = 'none'
37           ORDER BY t.ArticleID DESC)
38   WHERE ROWNUM < 6;
已用时间:  00: 00: 00.07
执行计划
----------------------------------------------------------
Plan hash value: 670148325
------------------------------------------------------------------------------
---------------------
| Id  | Operation                         | Name          | Rows  | Bytes | Co
st (%CPU)| Time     |
------------------------------------------------------------------------------
---------------------
|   0 | SELECT STATEMENT                  |               |     5 |  4200 |
13M  (1)| 43:30:26 |
|*  1 |  COUNT STOPKEY                    |               |       |       |
         |          |
|   2 |   VIEW                            |               |    29 | 24360 |
13M  (1)| 43:30:26 |
|*  3 |    TABLE ACCESS BY INDEX ROWID    | ARTICLE       |   999K|   851M|
  8   (0)| 00:00:01 |
|*  4 |     INDEX FULL SCAN DESCENDING    | PKKEY_ARTICLE |     7 |       |
  3   (0)| 00:00:01 |
|*  5 |      FILTER                       |               |       |       |
         |          |
|   6 |       NESTED LOOPS                |               |     1 |    78 |
15   (0)| 00:00:01 |
|*  7 |        TABLE ACCESS BY INDEX ROWID| ARTICLE       |     1 |    65 |
  3   (0)| 00:00:01 |
|*  8 |         INDEX UNIQUE SCAN         | PKKEY_ARTICLE |     1 |       |
  2   (0)| 00:00:01 |
|   9 |        INLIST ITERATOR            |               |       |       |
         |          |
|* 10 |         INDEX UNIQUE SCAN         | INFO_KEYWORD  |     1 |    13 |
12   (0)| 00:00:01 |
------------------------------------------------------------------------------
---------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(ROWNUM<6)
   3 - filter("T"."SITEID"=202 AND "T"."CSSTYPE"='none')
   4 - filter( EXISTS (SELECT /*+ */ 0 FROM "ARTICLEKEYWORD" "K","ARTICLE" "A"
WHERE
              :B1<>1241637 AND "A"."ARTICLEID"=:B2 AND "A"."DELETED"=0 AND "A"
."PASSED"=1 AND
              "A"."TOHTML"=1 AND "A"."INFOSHARETYPE"=0 AND "A"."ARTICLEID"<>12
41637 AND
              ("K"."KEYWORD"='大叔' OR "K"."KEYWORD"='裸体' OR "K"."KEYWORD"='
少女' OR "K"."KEYWORD"='性观念' OR
              "K"."KEYWORD"='性侵害' OR "K"."KEYWORD"='杨金元' OR "K"."KEYWORD
"='远程视频' OR "K"."KEYWORD"='诊所'
              OR "K"."KEYWORD"='正当防卫' OR "K"."KEYWORD"='匕首') AND "K"."IN
FOID"=:B3 AND
              "K"."INFOID"<>1241637))
   5 - filter(:B1<>1241637)
   7 - filter("A"."DELETED"=0 AND "A"."PASSED"=1 AND "A"."TOHTML"=1 AND
              "A"."INFOSHARETYPE"=0)
   8 - access("A"."ARTICLEID"=:B1)
       filter("A"."ARTICLEID"<>1241637)
  10 - access("K"."INFOID"=:B1 AND ("K"."KEYWORD"='大叔' OR "K"."KEYWORD"='裸
体' OR
              "K"."KEYWORD"='少女' OR "K"."KEYWORD"='性观念' OR "K"."KEYWORD"=
'性侵害' OR "K"."KEYWORD"='杨金元' OR
              "K"."KEYWORD"='远程视频' OR "K"."KEYWORD"='诊所' OR "K"."KEYWORD
"='正当防卫' OR "K"."KEYWORD"='匕首'))
       filter("K"."INFOID"<>1241637)
Note
-----
   - dynamic sampling used for this statement

统计信息
----------------------------------------------------------
          9  recursive calls
          0  db block gets
      22246  consistent gets
          0  physical reads
          0  redo size
       1715  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          5  rows processed

[ 本帖最后由 lhpapa 于 2012-5-11 17:45 编辑 ]

回复 只看该作者 道具 举报

29#
发表于 2012-5-11 17:46:44
另外还有个操作,原来article是按照hash分区的,刚才也搞成普通表了。

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-15 15:01 , Processed in 0.066116 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569