问题描述
我有一个位图索引,包括两列和这两列上的分区和子分区。
(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>
SQL>
横幅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>
SQL>
SQL>
系统改变了。
已通过: 00:00:00.20
SQL>
系统改变了。
已通过: 00:00:00.01
SQL>
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>
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>
系统改变了。
已通过: 00:00:00.09
SQL>
系统改变了。
已通过: 00:00:00:00
SQL>
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>
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>
(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问题(这就是为什么我总是建议使用最新的修补程序集)
增编:
谢谢你的帮忙。现在我可以看出其中的区别- -这一点特别有趣,因为两者都具有相同的一致性获取,因此开销似乎完全是基于CPU的。
我没有为您提供解决方案(如果您说查询不能被更改)。它们是动态生成的吗? (我在想,如果你事先“知道”他们的样子,你可以做一些sql计划管理,把好的计划换成差的计划......但如果它都是动态的,那么这个选项可能会有问题)
我去打听一下,看看能为你找到什么。
我把这个设置为“等待更多信息”- -但这不是在等你。
增编:
乔纳森·刘易斯帮助我解决了一些类似问题的链接,看起来这只是一个优化程序的反常现象
https://jonathanlewis.wordpress.com/2015/01/09/count-again/
https://jonathanlewis.wordpress.com/2015/01/19/bitmap-counts/
在这个阶段,我想你是无法避免的(因为您说您无法控制正在生成的SQL ) -也许是时候与支持部门记录电话了
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




