您的位置:首页 > 数据库 > Oracle

ORACLE:由位图索引引发的sql问题

2016-06-28 09:37 423 查看
原来系统中运行2、3分钟的sql,突然2天跑不完

sql如下:

SELECT info.*, keyinfo.KEYSORT AS keysort

FROM (SELECT rep.SrhTime AS rq,

bus.providerid AS cq,

bus.srhpc AS pc,

cor.srhzs AS zs,

act.actname AS th,

cor.county_seat AS ct,

cor.cyd_type AS ib,

cor.ten_medal AS me,

cor.srhas AS sa,

bus.srhbz AS bz,

cor.srhjy AS jy,

cor.srhve AS ve,

rep.enddate AS et,

bus.go_type AS hd,

bus.go_name AS bq,

bus.name_318 AS bd,

rep.srhcc AS cc,

bus.srhcm AS cm,

bus.srhcy AS cy,

cor.srhcz AS cz,

bus.srhcd AS cd,

cor.deposit_state AS gd,

weisite AS ss,

cor.srhveunit AS vu,

cor.longitude AS lo,

cor.latitude AS lt,

bus.advance_payment AS ors,

'' AS pr,

bus.sales_amount AS ta,

bus.sales_volume AS tc,

cor.qq AS qq,

'' AS tf,

'' AS mt,

'' AS kn,

'' AS pn,

cor.telephone AS hb,

cor.fax AS he,

cor.SALES_VOLUME AS tv,

bus.sales_count AS tu,

'' AS ca,

cor.ishighquality AS fs,

bus.supply_count AS gy,

cor.userid AS ud,

usrcount.states AS yp,

bus.enquiry_status AS xp,

cor.mobile_telephone AS ml,

TRUNC (

( TO_NUMBER (

cor.authendate

- TO_DATE ('1970-01-01 00:00:00',

'yyyy-mm-dd hh24:mi:ss'))

* 86400

- 8 * 3600)

/ 30)

AS tb,

bus.pubtype AS pt,

cor.srhbu AS bu,

bus.srhtp AS tp,

bus.srhco AS co,

bus.srhcb AS cb,

bus.srhla AS la,

cor.groupid AS gn,

cor.shopname AS sn,

bus.is_support_trade AS zf,

bus.mm AS mm,

rep.srhmi AS mi,

REPLACE (bus.srhtitle, CHR (26), '') AS bt,

REPLACE (bus.srhcontent, CHR (26), '') AS jj,

REPLACE (cor.srhintro, CHR (26), '') AS intro,

bus.Yview360 || ',' || bus.srhim AS im,

'M' || rep.bc_id AS id,

cor.srhtitle AS qy,

cor.username AS un,

cor.srhvn AS vn,

cor.srhtm AS tm,

bus.srhup AS UP,

bus.srhba AS ba,

bus.srhpm AS pm,

bus.srhbb || '|' || bus.actid AS bb,

bus.bc_id AS infoid,

cor.mainpro AS zy,

'' AS pa,

bus.srhqu AS qu,

cor.srhsl AS sl,

'' AS ag,

'' AS ty,

bus.srhmo AS mo,

TRUNC (

( TO_NUMBER (

cor.srhsu

- TO_DATE ('1970-01-01 00:00:00',

'yyyy-mm-dd hh24:mi:ss'))

* 86400

- 8 * 3600)

/ 30)

AS su,

cor.user_level AS ul,

bus.evaluate_count AS ec,

TRUNC (

( TO_NUMBER (

bus.searchdate

- TO_DATE ('1970-01-01 00:00:00',

'yyyy-mm-dd hh24:mi:ss'))

* 86400

- 8 * 3600)

/ 30)

AS pq,

cor.contacter

FROM (SELECT /*+ index(aa IDX_BUSIN_HOT_BITMAP_SEARCHS IDX_BUSIN_HOT_BITMAP_OPERS) */ *

FROM busin_hot aa

WHERE srhcc = '001'

AND searchstate = '1'

AND operstate = '1'

AND loadstates = 'H'

AND searchdate <=

TO_DATE ('20150901 23:59:59',

'yyyymmdd hh24:mi:ss')

AND searchdate >=

TO_DATE ('20150725 00:00:00',

'yyyymmdd hh24:mi:ss')) rep

LEFT JOIN busin_srh bus ON rep.bc_id = bus.bc_id

LEFT JOIN provider_srh cor ON bus.providerid = cor.providerid

LEFT JOIN busin_activity act ON bus.actid = act.actid

LEFT JOIN user_averagequalitylog usrcount

ON (cor.providerid = usrcount.providerid)) info

LEFT JOIN keyword_info_srh keyinfo

ON (info.infoid = keyinfo.infoid AND keyinfo.infotype = '0')

执行计划:

Plan hash value: 1031842883
----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name                         | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                              |       |       | 65385 (100)|          |       |       |
|   1 |  NESTED LOOPS OUTER                     |                              |    50 |   235K| 65385   (2)| 00:13:05 |       |       |
|*  2 |   HASH JOIN RIGHT OUTER                 |                              |    50 |   232K| 65234   (2)| 00:13:03 |       |       |
|   3 |    MAT_VIEW ACCESS FULL                 | BUSIN_ACTIVITY               |    24 |   336 |     3   (0)| 00:00:01 |       |       |
|   4 |    NESTED LOOPS OUTER                   |                              |    10 | 23760 | 65231   (2)| 00:13:03 |       |       |
|   5 |     NESTED LOOPS OUTER                  |                              |    10 | 23660 | 21806   (1)| 00:04:22 |       |       |
|   6 |      NESTED LOOPS OUTER                 |                              |    10 | 21080 | 21786   (1)| 00:04:22 |       |       |
|   7 |       PARTITION RANGE ITERATOR          |                              |    10 |   890 | 21746   (1)| 00:04:21 |   140 |   142 |
|*  8 |        TABLE ACCESS BY LOCAL INDEX ROWID| BUSIN_HOT                    |    10 |   890 | 21746   (1)| 00:04:21 |   140 |   142 |
|   9 |         BITMAP CONVERSION TO ROWIDS     |                              |       |       |            |          |       |       |
|* 10 |          BITMAP INDEX SINGLE VALUE      | IDX_BUSIN_HOT_BITMAP_SEARCHS |       |       |            |          |   140 |   142 |
|  11 |       TABLE ACCESS BY GLOBAL INDEX ROWID| BUSIN_SRH                    |     1 |  2019 |     4   (0)| 00:00:01 | ROW L | ROW L |
|* 12 |        INDEX RANGE SCAN                 | ID_BUSIN_SRH_BC_ID1          |     1 |       |     3   (0)| 00:00:01 |       |       |
|  13 |      TABLE ACCESS BY GLOBAL INDEX ROWID | PROVIDER_SRH                 |     1 |   258 |     2   (0)| 00:00:01 | ROW L | ROW L |
|* 14 |       INDEX UNIQUE SCAN                 | PK166_1_1                    |     1 |       |     1   (0)| 00:00:01 |       |       |
|* 15 |     TABLE ACCESS FULL                   | USER_AVERAGEQUALITYLOG       |     1 |    10 |  4342   (2)| 00:00:53 |       |       |
|* 16 |   TABLE ACCESS BY INDEX ROWID           | KEYWORD_INFO_SRH             |     1 |    50 |     3   (0)| 00:00:01 |       |       |
|* 17 |    INDEX RANGE SCAN                     | I_KEYINFOSRH_TONUM_INFOID    |     1 |       |     2   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("BUS"."ACTID"="ACT"."ACTID")
8 - filter(("SEARCHDATE">=TO_DATE(' 2015-07-25 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "LOADSTATES"='H' AND
"SEARCHDATE"<=TO_DATE(' 2015-09-01 23:59:59', 'syyyy-mm-dd hh24:mi:ss') AND "SRHCC"='001' AND "OPERSTATE"='1'))
10 - access("SEARCHSTATE"='1')
12 - access("BUSIN_HOT"."BC_ID"="BUS"."BC_ID")
14 - access("BUS"."PROVIDERID"="COR"."PROVIDERID")
15 - filter("COR"."PROVIDERID"="USRCOUNT"."PROVIDERID")
16 - filter("KEYINFO"."INFOTYPE"='0')
17 - access("BUS"."BC_ID"="KEYINFO"."SYS_NC00006$")

hint不要走位图索引的执行计划:

SELECT /*+ no_index(aa  IDX_BUSIN_HOT_BITMAP_SEARCHS) */ *
-------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name                      | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                           |       |       | 73655 (100)|          |       |       |
|   1 |  NESTED LOOPS OUTER                     |                           |    50 |   235K| 73655   (2)| 00:14:44 |       |       |
|*  2 |   HASH JOIN RIGHT OUTER                 |                           |    50 |   232K| 73505   (2)| 00:14:43 |       |       |
|   3 |    MAT_VIEW ACCESS FULL                 | BUSIN_ACTIVITY            |    24 |   336 |     3   (0)| 00:00:01 |       |       |
|   4 |    NESTED LOOPS OUTER                   |                           |    10 | 23760 | 73502   (2)| 00:14:43 |       |       |
|   5 |     NESTED LOOPS OUTER                  |                           |    10 | 23660 | 30077   (1)| 00:06:01 |       |       |
|   6 |      NESTED LOOPS OUTER                 |                           |    10 | 21080 | 30057   (1)| 00:06:01 |       |       |
|   7 |       PARTITION RANGE ITERATOR          |                           |    10 |   890 | 30017   (1)| 00:06:01 |   140 |   142 |
|*  8 |        TABLE ACCESS FULL                | BUSIN_HOT                 |    10 |   890 | 30017   (1)| 00:06:01 |   140 |   142 |
|   9 |       TABLE ACCESS BY GLOBAL INDEX ROWID| BUSIN_SRH                 |     1 |  2019 |     4   (0)| 00:00:01 | ROW L | ROW L |
|* 10 |        INDEX RANGE SCAN                 | ID_BUSIN_SRH_BC_ID1       |     1 |       |     3   (0)| 00:00:01 |       |       |
|  11 |      TABLE ACCESS BY GLOBAL INDEX ROWID | PROVIDER_SRH              |     1 |   258 |     2   (0)| 00:00:01 | ROW L | ROW L |
|* 12 |       INDEX UNIQUE SCAN                 | PK166_1_1                 |     1 |       |     1   (0)| 00:00:01 |       |       |
|* 13 |     TABLE ACCESS FULL                   | USER_AVERAGEQUALITYLOG    |     1 |    10 |  4342   (2)| 00:00:53 |       |       |
|* 14 |   TABLE ACCESS BY INDEX ROWID           | KEYWORD_INFO_SRH          |     1 |    50 |     3   (0)| 00:00:01 |       |       |
|* 15 |    INDEX RANGE SCAN                     | I_KEYINFOSRH_TONUM_INFOID |     1 |       |     2   (0)| 00:00:01 |       |       |
-------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("BUS"."ACTID"="ACT"."ACTID")
8 - filter(("SEARCHDATE">=TO_DATE(' 2015-07-25 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "LOADSTATES"='H' AND
"SEARCHSTATE"='1' AND "SEARCHDATE"<=TO_DATE(' 2015-09-01 23:59:59', 'syyyy-mm-dd hh24:mi:ss') AND "SRHCC"='001' AND
"OPERSTATE"='1'))
10 - access("AA"."BC_ID"="BUS"."BC_ID")
12 - access("BUS"."PROVIDERID"="COR"."PROVIDERID")
13 - filter("COR"."PROVIDERID"="USRCOUNT"."PROVIDERID")
14 - filter("KEYINFO"."INFOTYPE"='0')
15 - access("BUS"."BC_ID"="KEYINFO"."SYS_NC00006$")
3分钟

此表还有一个位图索引,配合使用的执行计划:

SELECT /*+ index(aa  IDX_BUSIN_HOT_BITMAP_SEARCHS IDX_BUSIN_HOT_BITMAP_OPERS) */ *
----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name                         | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                              |       |       | 65393 (100)|          |       |       |
|   1 |  NESTED LOOPS OUTER                     |                              |    50 |   235K| 65393   (2)| 00:13:05 |       |       |
|*  2 |   HASH JOIN RIGHT OUTER                 |                              |    50 |   232K| 65243   (2)| 00:13:03 |       |       |
|   3 |    MAT_VIEW ACCESS FULL                 | BUSIN_ACTIVITY               |    24 |   336 |     3   (0)| 00:00:01 |       |       |
|   4 |    NESTED LOOPS OUTER                   |                              |    10 | 23760 | 65239   (2)| 00:13:03 |       |       |
|   5 |     NESTED LOOPS OUTER                  |                              |    10 | 23660 | 21814   (1)| 00:04:22 |       |       |
|   6 |      NESTED LOOPS OUTER                 |                              |    10 | 21080 | 21794   (1)| 00:04:22 |       |       |
|   7 |       PARTITION RANGE ITERATOR          |                              |    10 |   890 | 21754   (1)| 00:04:22 |   140 |   142 |
|*  8 |        TABLE ACCESS BY LOCAL INDEX ROWID| BUSIN_HOT                    |    10 |   890 | 21754   (1)| 00:04:22 |   140 |   142 |
|   9 |         BITMAP CONVERSION TO ROWIDS     |                              |       |       |            |          |       |       |
|  10 |          BITMAP AND                     |                              |       |       |            |          |       |       |
|* 11 |           BITMAP INDEX SINGLE VALUE     | IDX_BUSIN_HOT_BITMAP_SEARCHS |       |       |            |          |   140 |   142 |
|* 12 |           BITMAP INDEX SINGLE VALUE     | IDX_BUSIN_HOT_BITMAP_OPERS   |       |       |            |          |   140 |   142 |
|  13 |       TABLE ACCESS BY GLOBAL INDEX ROWID| BUSIN_SRH                    |     1 |  2019 |     4   (0)| 00:00:01 | ROW L | ROW L |
|* 14 |        INDEX RANGE SCAN                 | ID_BUSIN_SRH_BC_ID1          |     1 |       |     3   (0)| 00:00:01 |       |       |
|  15 |      TABLE ACCESS BY GLOBAL INDEX ROWID | PROVIDER_SRH                 |     1 |   258 |     2   (0)| 00:00:01 | ROW L | ROW L |
|* 16 |       INDEX UNIQUE SCAN                 | PK166_1_1                    |     1 |       |     1   (0)| 00:00:01 |       |       |
|* 17 |     TABLE ACCESS FULL                   | USER_AVERAGEQUALITYLOG       |     1 |    10 |  4342   (2)| 00:00:53 |       |       |
|* 18 |   TABLE ACCESS BY INDEX ROWID           | KEYWORD_INFO_SRH             |     1 |    50 |     3   (0)| 00:00:01 |       |       |
|* 19 |    INDEX RANGE SCAN                     | I_KEYINFOSRH_TONUM_INFOID    |     1 |       |     2   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("BUS"."ACTID"="ACT"."ACTID")
8 - filter(("SEARCHDATE">=TO_DATE(' 2015-07-25 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "LOADSTATES"='H' AND
"SEARCHDATE"<=TO_DATE(' 2015-09-01 23:59:59', 'syyyy-mm-dd hh24:mi:ss') AND "SRHCC"='001'))
11 - access("SEARCHSTATE"='1')
12 - access("OPERSTATE"='1')
14 - access("AA"."BC_ID"="BUS"."BC_ID")
16 - access("BUS"."PROVIDERID"="COR"."PROVIDERID")
17 - filter("COR"."PROVIDERID"="USRCOUNT"."PROVIDERID")
18 - filter("KEYINFO"."INFOTYPE"='0')
19 - access("BUS"."BC_ID"="KEYINFO"."SYS_NC00006$")
比上面不走位图索引略快

生产上使用位图索引要慎重!!!


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql