暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用位图索引时,没有计数的Group By速度慢8倍

askTom 2015-10-03
117

问题描述

我有一个位图索引,包括两列和这两列上的分区和子分区。

(1)按MATE从MT组中选择MATE --执行时间约为1000ms
但是
(2)通过MATE从MT组中选择MATE,count(*) --执行时间约125毫秒

这两个查询的执行计划相同,除了

(1)位图到Rowids的转换(较慢)
in (2)位图转换计数(提高8倍)

虽然我可以使用(2)查询,因为我使用的是创建像(1)这样的查询的第三方应用程序,实际上速度要慢25倍!

您可以看到下面的示例:

创建表MT
(
MATE日期不为空,
OBJ_TYPE varchar(30)不为空,
对象ID号不为null
)
按范围分区(MATE)
间隔( numtodsinterval(1,'DAY') )
按列表划分子分区(OBJ_TYPE)
子分区模板(
子分区mp_SYSNYM值('SYNNYM') ,
子分区mp_JVA_CAL值('Java类') ,
子分区mp_INDEX值('INDEX') ,
子分区mp_VIEW值('View') ,
子分区mp_ TABLE值('TABLE')
)
(
分区p0值小于( to_date('28.06.2015','dd.mm.yyyy') )
)
/

插入MT
选择MD.MATE、o.OBJECT_TYPE、O.OBJECT_ID

(将trunc(sysdate)-rownum选择为MATE
从 all_objects
其中,行号<100
) MD, all_对象o
其中o.OBJECT_TYPE在('SYNYM','JAVA类','索引','视图','TABLE')
/

在MT(MATE, OBJ_TYPE) Local上创建位图索引IDX_MT
/

exec dbms_stats.gather_table_stats (用户,'MT') ;

select MDATE 从 MT group by MDATE -- execute in ~1000 ms
select MDATE, count(0) 从 MT group by MDATE -- execute in ~750 ms
select MDATE, count(*) 从 MT group by MDATE -- execute in ~125 ms
select distinct MDATE 从 MT -- execute in ~125 ms

-----------------------------------------------------------
我在下面添加了自动跟踪脚本。请记录已用的时间。

SQL>
set linesize 200;

SQL>
select * 从 v$version;


横幅CON_ID
---------------
Oracle Database 12c Enterprise Edition 12.1.0.2.0版- 64位生产版0
PL/SQL 12.1.0.2.0版-生产0
核心12.1.0.2.0生产0
适用于64位Windows的TNS :版本12.1.0.2.0 -生产0
NLSRTL 12.1.0.2.0版-生产0

SQL>
set autotrace on;

SQL>
set timing on;

SQL>
alter system flush buffer_cache;


系统改变了。

已通过: 00:00:00.20
SQL>
alter system flush shared_pool;


系统改变了。

已通过: 00:00:00.01
SQL>
select MDATE, count(*) 从 MT group by MDATE;


Mdate计数(*)
--------------
2015-06-27 00:00:00 93157
2015-06-28 00:00:00 93157
.....
2015-10-02 00:00:00 93157
2015-10-03 00:00:00 93157

已选择99行。

Elapsed: 00:00:00.90

执行计划
--------------------------------------------------
计划散列值: 1227701158

--------------------------------------------------------
| Id |操作|名称|行|字节|开销(%CPU) |时间| Pstart| P停止|
--------------------------------------------------------
| 0 | SELECT语句| | 99 | 792 | 495 (0)| 00:00:01 | | | |
1 |分区范围全部| | 99 | 792 | 495 (0)| 00:00:01 | 1 |1048575|
|2 |散列分组依据| | 99 | 792 | 495 (0)| 00:00:01 | | | |
| 3 |分区列表全部| | | 9222K| 70M| 495 (0)| 00:00:01 | 1 | 5 |
| 4 | BITMAP转换计数| | 9222K| 70M| 495 (0)| 00:00:01 | | | |
5 | BITMAP索引完全扫描| IDX_MT | | | | 1 |1048575|
--------------------------------------------------------


统计信息
--------------------------------------------------
2404递归调用
0 db块获取
6607一致获得
604物理读取
0重做大小
通过SQL*Net向客户端发送3090字节
618 bytes received via SQL*Net 从 client
8 SQL*Net roundtrips to/从 client
77种(内存)
0排序(磁盘)
处理了99行

SQL>
select MDATE, count(*) 从 MT group by MDATE;


Mdate计数(*)
--------------
2015-06-27 00:00:00 93157
2015-06-28 00:00:00 93157
.......
2015-10-02 00:00:00 93157
2015-10-03 00:00:00 93157

已选择99行。

Elapsed: 00:00:00.18

执行计划
--------------------------------------------------
计划散列值: 1227701158

--------------------------------------------------------
| Id |操作|名称|行|字节|开销(%CPU) |时间| Pstart| P停止|
--------------------------------------------------------
| 0 | SELECT语句| | 99 | 792 | 495 (0)| 00:00:01 | | | |
1 |分区范围全部| | 99 | 792 | 495 (0)| 00:00:01 | 1 |1048575|
|2 |散列分组依据| | 99 | 792 | 495 (0)| 00:00:01 | | | |
| 3 |分区列表全部| | | 9222K| 70M| 495 (0)| 00:00:01 | 1 | 5 |
| 4 | BITMAP转换计数| | 9222K| 70M| 495 (0)| 00:00:01 | | | |
5 | BITMAP索引完全扫描| IDX_MT | | | | 1 |1048575|
--------------------------------------------------------


统计信息
--------------------------------------------------
0个递归调用
0 db块获取
495一致获得
0物理读取
0重做大小
通过SQL*Net向客户端发送3090字节
618 bytes received via SQL*Net 从 client
8 SQL*Net roundtrips to/从 client
0排序(内存)
0排序(磁盘)
处理了99行

SQL>
alter system flush buffer_cache;


系统改变了。

已通过: 00:00:00.09
SQL>
alter system flush shared_pool;


系统改变了。

已通过: 00:00:00:00
SQL>
select MDATE 从 MT group by MDATE;


MATE
--------------------
2015-06-27 00:00:00
2015-06-28 00:00:00
.....
2015-10-02 00:00:00
2015-10-03 00:00:00

已选择99行。

Elapsed: 00:00:01.18

执行计划
--------------------------------------------------
计划散列值: 2091394526

--------------------------------------------------------------------
| Id |操作|名称|行|字节|开销(%CPU) |时间| Pstart| P停止|
--------------------------------------------------------------------
| 0 | SELECT语句| | 99 | 792 | 495 (0)| 00:00:01 | | | |
1 |分区范围全部| | 99 | 792 | 495 (0)| 00:00:01 | 1 |1048575|
|2 |散列分组依据| | 99 | 792 | 495 (0)| 00:00:01 | | | |
| 3 |分区列表全部| | | 9222K| 70M| 495 (0)| 00:00:01 | 1 | 5 |
| 4 |位图转换为行IDS| | 9222K| 70M| 495 (0)| 00:00:01 | | |
5 |位图索引完全扫描| IDX_MT | | | | 1 |1048575|
--------------------------------------------------------------------


统计信息
--------------------------------------------------
2433递归调用
0 db块获取
6607一致获得
605物理读取
0重做大小
通过SQL*Net向客户端发送2696个字节
618 bytes received via SQL*Net 从 client
8 SQL*Net roundtrips to/从 client
77种(内存)
0排序(磁盘)
处理了99行

SQL>
select MDATE 从 MT group by MDATE;


MATE
--------------------
2015-06-27 00:00:00
2015-06-28 00:00:00
........
2015-10-02 00:00:00
2015-10-03 00:00:00

已选择99行。

Elapsed: 00:00:00.82

执行计划
--------------------------------------------------
计划散列值: 2091394526

--------------------------------------------------------------------
| Id |操作|名称|行|字节|开销(%CPU) |时间| Pstart| P停止|
--------------------------------------------------------------------
| 0 | SELECT语句| | 99 | 792 | 495 (0)| 00:00:01 | | | |
1 |分区范围全部| | 99 | 792 | 495 (0)| 00:00:01 | 1 |1048575|
|2 |散列分组依据| | 99 | 792 | 495 (0)| 00:00:01 | | | |
| 3 |分区列表全部| | | 9222K| 70M| 495 (0)| 00:00:01 | 1 | 5 |
| 4 |位图转换为行IDS| | 9222K| 70M| 495 (0)| 00:00:01 | | |
5 |位图索引完全扫描| IDX_MT | | | | 1 |1048575|
--------------------------------------------------------------------


统计信息
--------------------------------------------------
0个递归调用
0 db块获取
495一致获得
0物理读取
0重做大小
通过SQL*Net向客户端发送2696个字节
618 bytes received via SQL*Net 从 client
8 SQL*Net roundtrips to/从 client
0排序(内存)
0排序(磁盘)
处理了99行

SQL>
spool off;


专家解答

你能添加一些自动跟踪输出吗?我已经将您的(优秀! )测试用例运行到11.2.0.4和12.1.0.2中,我没有看到您看到的巨大差异。您可能遇到11.2.0.1问题(这就是为什么我总是建议使用最新的修补程序集)

SQL> set autotrace off
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL> set timing off
SQL> set autotrace off
SQL> drop table MT purge;
drop table MT purge
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>
SQL> create table MT
  2  (
  3  MDATE date not null,
  4  OBJ_TYPE varchar(30) not null,
  5  OBJECT_ID number not null
  6  )
  7  partition by range(MDATE)
  8  interval (numtodsinterval(1,'DAY'))
  9  subpartition by list (OBJ_TYPE)
 10  subpartition template(
 11  subpartition mp_SYNONYM values ('SYNONYM'),
 12  subpartition mp_JAVA_CLASS values ('JAVA CLASS'),
 13  subpartition mp_INDEX values ('INDEX'),
 14  subpartition mp_VIEW values ('VIEW'),
 15  subpartition mp_TABLE values ('TABLE')
 16  )
 17  (
 18  partition p0 values less than (to_date('28.06.2015','dd.mm.yyyy'))
 19  )
 20  /

Table created.

SQL>
SQL>
SQL>
SQL> insert /*+ APPEND */ into MT
  2  select MD.MDATE, o.OBJECT_TYPE, O.OBJECT_ID
  3  from
  4  (select trunc(sysdate)-rownum as MDATE
  5  from all_objects
  6  where rownum<100
  7  ) MD, all_objects o
  8  where o.OBJECT_TYPE in ('SYNONYM','JAVA CLASS','INDEX','VIEW','TABLE')
  9  /

7439058 rows created.

SQL>
SQL>
SQL> create bitmap index IDX_MT on MT(MDATE, OBJ_TYPE) LOCAL
  2  /

Index created.

SQL>
SQL> exec dbms_stats.gather_table_stats(user,'MT');

PL/SQL procedure successfully completed.

SQL>
SQL> set timing on
SQL>
SQL> set autotrace on
SQL> select MDATE from MT group by MDATE;

MDATE
---------
27-JUN-15
28-JUN-15
29-JUN-15
30-JUN-15
...
01-OCT-15
02-OCT-15
03-OCT-15

99 rows selected.

Elapsed: 00:00:00.65

Execution Plan
----------------------------------------------------------
Plan hash value: 2091394526

---------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |        |    99 |   792 |   495   (0)| 00:00:06 |       |    |
|   1 |  PARTITION RANGE ALL           |        |    99 |   792 |   495   (0)| 00:00:06 |     1 |1048575|
|   2 |   HASH GROUP BY                |        |    99 |   792 |   495   (0)| 00:00:06 |       |    |
|   3 |    PARTITION LIST ALL          |        |  7439K|    56M|   495   (0)| 00:00:06 |     1 |     5 |
|   4 |     BITMAP CONVERSION TO ROWIDS|        |  7439K|    56M|   495   (0)| 00:00:06 |       |    |
|   5 |      BITMAP INDEX FULL SCAN    | IDX_MT |       |       |            |          |     1 |1048575|
---------------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        495  consistent gets
          0  physical reads
          0  redo size
       2632  bytes sent via SQL*Net to client
        586  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         99  rows processed

SQL> select MDATE, count(0) from MT group by MDATE;

MDATE       COUNT(0)
--------- ----------
27-JUN-15      75142
28-JUN-15      75142
29-JUN-15      75142
30-JUN-15      75142
...
01-OCT-15      75142
02-OCT-15      75142
03-OCT-15      75142

99 rows selected.

Elapsed: 00:00:00.04

Execution Plan
----------------------------------------------------------
Plan hash value: 1227701158

-----------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |        |    99 |   792 |   495   (0)| 00:00:06 |       |       |
|   1 |  PARTITION RANGE ALL       |        |    99 |   792 |   495   (0)| 00:00:06 |     1 |1048575|
|   2 |   HASH GROUP BY            |        |    99 |   792 |   495   (0)| 00:00:06 |       |       |
|   3 |    PARTITION LIST ALL      |        |  7439K|    56M|   495   (0)| 00:00:06 |     1 |     5 |
|   4 |     BITMAP CONVERSION COUNT|        |  7439K|    56M|   495   (0)| 00:00:06 |       |       |
|   5 |      BITMAP INDEX FULL SCAN| IDX_MT |       |       |            |          |     1 |1048575|
-----------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        495  consistent gets
          0  physical reads
          0  redo size
       3026  bytes sent via SQL*Net to client
        586  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         99  rows processed

SQL> select MDATE, count(*) from MT group by MDATE;

MDATE       COUNT(*)
--------- ----------
27-JUN-15      75142
28-JUN-15      75142
29-JUN-15      75142
30-JUN-15      75142
...
01-OCT-15      75142
02-OCT-15      75142
03-OCT-15      75142

99 rows selected.

Elapsed: 00:00:00.04

Execution Plan
----------------------------------------------------------
Plan hash value: 1227701158

-----------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |        |    99 |   792 |   495   (0)| 00:00:06 |       |       |
|   1 |  PARTITION RANGE ALL       |        |    99 |   792 |   495   (0)| 00:00:06 |     1 |1048575|
|   2 |   HASH GROUP BY            |        |    99 |   792 |   495   (0)| 00:00:06 |       |       |
|   3 |    PARTITION LIST ALL      |        |  7439K|    56M|   495   (0)| 00:00:06 |     1 |     5 |
|   4 |     BITMAP CONVERSION COUNT|        |  7439K|    56M|   495   (0)| 00:00:06 |       |       |
|   5 |      BITMAP INDEX FULL SCAN| IDX_MT |       |       |            |          |     1 |1048575|
-----------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        495  consistent gets
          0  physical reads
          0  redo size
       3026  bytes sent via SQL*Net to client
        586  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         99  rows processed

SQL> select distinct MDATE from MT;

MDATE
---------
27-JUN-15
28-JUN-15
29-JUN-15
...
01-OCT-15
02-OCT-15
03-OCT-15

99 rows selected.

Elapsed: 00:00:00.04

Execution Plan
----------------------------------------------------------
Plan hash value: 1526666642

---------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |        |    99 |   792 |   985  (55)| 00:00:12 |       |    |
|   1 |  PARTITION RANGE ALL           |        |    99 |   792 |   985  (55)| 00:00:12 |     1 |1048575|
|   2 |   HASH UNIQUE                  |        |    99 |   792 |   985  (55)| 00:00:12 |       |    |
|   3 |    PARTITION LIST ALL          |        |  7439K|    56M|   446   (0)| 00:00:06 |     1 |     5 |
|   4 |     BITMAP INDEX FAST FULL SCAN| IDX_MT |  7439K|    56M|   446   (0)| 00:00:06 |     1 |1048575|
---------------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       1485  consistent gets
          0  physical reads
          0  redo size
       2632  bytes sent via SQL*Net to client
        586  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         99  rows processed

SQL>
SQL>

SQL> set autotrace off
SQL> select * from v$version;

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production              0
PL/SQL Release 12.1.0.2.0 - Production                                                    0
CORE    12.1.0.2.0      Production                                                                0
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production                                   0
NLSRTL Version 12.1.0.2.0 - Production                                                    0

SQL> set timing off
SQL> set autotrace off
SQL> drop table MT purge;

Table dropped.

SQL>
SQL> create table MT
  2  (
  3  MDATE date not null,
  4  OBJ_TYPE varchar(30) not null,
  5  OBJECT_ID number not null
  6  )
  7  partition by range(MDATE)
  8  interval (numtodsinterval(1,'DAY'))
  9  subpartition by list (OBJ_TYPE)
 10  subpartition template(
 11  subpartition mp_SYNONYM values ('SYNONYM'),
 12  subpartition mp_JAVA_CLASS values ('JAVA CLASS'),
 13  subpartition mp_INDEX values ('INDEX'),
 14  subpartition mp_VIEW values ('VIEW'),
 15  subpartition mp_TABLE values ('TABLE')
 16  )
 17  (
 18  partition p0 values less than (to_date('28.06.2015','dd.mm.yyyy'))
 19  )
 20  /

Table created.

SQL>
SQL>
SQL>
SQL> insert /*+ APPEND */ into MT
  2  select MD.MDATE, o.OBJECT_TYPE, O.OBJECT_ID
  3  from
  4  (select trunc(sysdate)-rownum as MDATE
  5  from all_objects
  6  where rownum<100
  7  ) MD, all_objects o
  8  where o.OBJECT_TYPE in ('SYNONYM','JAVA CLASS','INDEX','VIEW','TABLE')
  9  /

7980093 rows created.

SQL>
SQL>
SQL> create bitmap index IDX_MT on MT(MDATE, OBJ_TYPE) LOCAL
  2  /

Index created.

SQL>
SQL> exec dbms_stats.gather_table_stats(user,'MT');

PL/SQL procedure successfully completed.

SQL>
SQL> set timing on
SQL>
SQL> set autotrace on
SQL> select MDATE from MT group by MDATE;

MDATE
---------
27-JUN-15
28-JUN-15
29-JUN-15
30-JUN-15
...
01-OCT-15
02-OCT-15
03-OCT-15

99 rows selected.

Elapsed: 00:00:00.57

Execution Plan
----------------------------------------------------------
Plan hash value: 2091394526

---------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |        |    99 |   792 |   495   (0)| 00:00:01 |       |    |
|   1 |  PARTITION RANGE ALL           |        |    99 |   792 |   495   (0)| 00:00:01 |     1 |1048575|
|   2 |   HASH GROUP BY                |        |    99 |   792 |   495   (0)| 00:00:01 |       |    |
|   3 |    PARTITION LIST ALL          |        |  7980K|    60M|   495   (0)| 00:00:01 |     1 |     5 |
|   4 |     BITMAP CONVERSION TO ROWIDS|        |  7980K|    60M|   495   (0)| 00:00:01 |       |    |
|   5 |      BITMAP INDEX FULL SCAN    | IDX_MT |       |       |            |          |     1 |1048575|
---------------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        495  consistent gets
          0  physical reads
          0  redo size
       2696  bytes sent via SQL*Net to client
        618  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         99  rows processed

SQL> select MDATE, count(0) from MT group by MDATE;

MDATE       COUNT(0)
--------- ----------
27-JUN-15      80607
28-JUN-15      80607
29-JUN-15      80607
30-JUN-15      80607
...
01-OCT-15      80607
02-OCT-15      80607
03-OCT-15      80607

99 rows selected.

Elapsed: 00:00:00.28

Execution Plan
----------------------------------------------------------
Plan hash value: 1227701158

-----------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |        |    99 |   792 |   495   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ALL       |        |    99 |   792 |   495   (0)| 00:00:01 |     1 |1048575|
|   2 |   HASH GROUP BY            |        |    99 |   792 |   495   (0)| 00:00:01 |       |       |
|   3 |    PARTITION LIST ALL      |        |  7980K|    60M|   495   (0)| 00:00:01 |     1 |     5 |
|   4 |     BITMAP CONVERSION COUNT|        |  7980K|    60M|   495   (0)| 00:00:01 |       |       |
|   5 |      BITMAP INDEX FULL SCAN| IDX_MT |       |       |            |          |     1 |1048575|
-----------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        495  consistent gets
          0  physical reads
          0  redo size
       3090  bytes sent via SQL*Net to client
        618  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         99  rows processed

SQL> select MDATE, count(*) from MT group by MDATE;

MDATE       COUNT(*)
--------- ----------
27-JUN-15      80607
28-JUN-15      80607
29-JUN-15      80607
30-JUN-15      80607
01-JUL-15      80607
02-JUL-15      80607
03-JUL-15      80607
04-JUL-15      80607
...
01-OCT-15      80607
02-OCT-15      80607
03-OCT-15      80607

99 rows selected.

Elapsed: 00:00:00.28

Execution Plan
----------------------------------------------------------
Plan hash value: 1227701158

-----------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |        |    99 |   792 |   495   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ALL       |        |    99 |   792 |   495   (0)| 00:00:01 |     1 |1048575|
|   2 |   HASH GROUP BY            |        |    99 |   792 |   495   (0)| 00:00:01 |       |       |
|   3 |    PARTITION LIST ALL      |        |  7980K|    60M|   495   (0)| 00:00:01 |     1 |     5 |
|   4 |     BITMAP CONVERSION COUNT|        |  7980K|    60M|   495   (0)| 00:00:01 |       |       |
|   5 |      BITMAP INDEX FULL SCAN| IDX_MT |       |       |            |          |     1 |1048575|
-----------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        495  consistent gets
          0  physical reads
          0  redo size
       3090  bytes sent via SQL*Net to client
        618  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         99  rows processed

SQL> select distinct MDATE from MT;

MDATE
---------
27-JUN-15
28-JUN-15
29-JUN-15
30-JUN-15
01-JUL-15
02-JUL-15
03-JUL-15
04-JUL-15
...
02-OCT-15
03-OCT-15

99 rows selected.

Elapsed: 00:00:00.28

Execution Plan
----------------------------------------------------------
Plan hash value: 1526666642

---------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |        |    99 |   792 |   661  (33)| 00:00:01 |       |    |
|   1 |  PARTITION RANGE ALL           |        |    99 |   792 |   661  (33)| 00:00:01 |     1 |1048575|
|   2 |   HASH UNIQUE                  |        |    99 |   792 |   661  (33)| 00:00:01 |       |    |
|   3 |    PARTITION LIST ALL          |        |  7980K|    60M|   446   (0)| 00:00:01 |     1 |     5 |
|   4 |     BITMAP INDEX FAST FULL SCAN| IDX_MT |  7980K|    60M|   446   (0)| 00:00:01 |     1 |1048575|
---------------------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       1980  consistent gets
          0  physical reads
          0  redo size
       2696  bytes sent via SQL*Net to client
        618  bytes received via SQL*Net from client
          8  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         99  rows processed

SQL>
SQL>


增编:

谢谢你的帮忙。现在我可以看出其中的区别- -这一点特别有趣,因为两者都具有相同的一致性获取,因此开销似乎完全是基于CPU的。

我没有为您提供解决方案(如果您说查询不能被更改)。它们是动态生成的吗? (我在想,如果你事先“知道”他们的样子,你可以做一些sql计划管理,把好的计划换成差的计划......但如果它都是动态的,那么这个选项可能会有问题)

我去打听一下,看看能为你找到什么。

我把这个设置为“等待更多信息”- -但这不是在等你。

增编:

乔纳森·刘易斯帮助我解决了一些类似问题的链接,看起来这只是一个优化程序的反常现象

https://jonathanlewis.wordpress.com/2015/01/09/count-again/
https://jonathanlewis.wordpress.com/2015/01/19/bitmap-counts/

在这个阶段,我想你是无法避免的(因为您说您无法控制正在生成的SQL ) -也许是时候与支持部门记录电话了
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论