实测了以下Exadata smart scan对于INDEX STORAGE FAST FULL SCAN似乎实际并不生效,详见以下测试。不仅普通的B*tree index也包括compressed index、reverse key index等类型。
Why is my Exadata smart scan not offloading?
Exadata Smart Scan and Index Access
上面2篇文章介绍了了类似的XD offload 对index fast full scan不生效的问题, 相关的BUG有:
Bug 8257122 - Exadata smart scan caching does not work for INDEX FAST FULL scan (Doc ID 8257122.8)
以下测试了对NORMAL INDEX和bitmap index fast full scan的OFFLOAD情况:
SQL> select blocks,bytes/1024/1024/1024 from dba_segments where segment_name='LARGE_TABLE';
BLOCKS BYTES/1024/1024/1024
---------- --------------------
7127040 54.375
Elapsed: 00:00:00.19
SQL> alter system flush buffer_cache;
System altered.
Elapsed: 00:00:00.19
SQL> select count(*) from LARGE_TABLE where object_id between 1000 and 20000;
COUNT(*)
----------
486735872
Elapsed: 00:00:23.29
SQL> alter system flush buffer_cache;
System altered.
Elapsed: 00:00:00.19
SQL> select /*+ OPT_PARAM('cell_offload_processing' 'false') */ count(*) from LARGE_TABLE where object_id between 1000 and 20000;
COUNT(*)
----------
486735872
Elapsed: 00:03:24.22
SQL> create index pk_lt on large_table (object_id,data_object_id) tablespace larget parallel nologging;
Index created.
Elapsed: 00:01:14.18
SQL> alter index pk_lt noparallel;
Index altered.
SQL> exec dbms_stats.gather_table_stats('SYS','LARGE_TABLE',cascade=>TRUE, estimate_percent=>100, degree=>8);
PL/SQL procedure successfully completed.
Elapsed: 00:13:12.61
select a.name,b.value
from v$sysstat a , v$mystat b
where
a.statistic#=b.statistic#
and (a.name in ('physical read total bytes','physical write total bytes',
'cell IO uncompressed bytes') or a.name like 'cell phy%' );
NAME VALUE
---------------------------------------------------------------- ----------
physical read total bytes 0
physical write total bytes 0
cell physical IO interconnect bytes 0
cell physical IO bytes saved during optimized file creation 0
cell physical IO bytes saved during optimized RMAN file restore 0
cell physical IO bytes eligible for predicate offload 0
cell physical IO bytes saved by storage index 0
cell physical IO bytes sent directly to DB node to balance CPU 0
cell physical IO interconnect bytes returned by smart scan 0
cell IO uncompressed bytes 0
10 rows selected.
alter system flush buffer_cache;
set timing on;
set linesize 200 pagesize 2000
select /*+ FULL(LARGE_TABLE) */ count(*) from LARGE_TABLE where object_id between 1000 and 20000;
COUNT(*)
----------
486735872
Elapsed: 00:00:23.30
TABLE ACCESS STORAGE FULL| LARGE_TABLE | 403M| 1925M| 1935K (1)|
SQL> select a.name,b.value
2 from v$sysstat a , v$mystat b
3 where
a.statistic#=b.statistic#
and (a.name in ('physical read total bytes','physical write total bytes',
'cell IO uncompressed bytes') or a.name like 'cell phy%' ); 4 5 6
NAME VALUE
---------------------------------------------------------------- ----------
physical read total bytes 5.8303E+10
physical write total bytes 0
cell physical IO interconnect bytes 6055421032
cell physical IO bytes saved during optimized file creation 0
cell physical IO bytes saved during optimized RMAN file restore 0
cell physical IO bytes eligible for predicate offload 5.8303E+10
cell physical IO bytes saved by storage index 0
cell physical IO bytes sent directly to DB node to balance CPU 0
cell physical IO interconnect bytes returned by smart scan 6055396456
cell IO uncompressed bytes 5.8321E+10
10 rows selected.
Elapsed: 00:00:00.01
SQL>
SQL> alter system flush buffer_cache;
set timing on;
set linesize 200 pagesize 2000
System altered.
SQL> SQL>
SQL>
SQL> explain plan for select count(*) from LARGE_TABLE where object_id between 1000 and 20000;
Explained.
Elapsed: 00:00:00.02
SQL> @?/rdbms/admin/utlxplp
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 800139279
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 356K (1)| 00:00:14 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
|* 2 | INDEX STORAGE FAST FULL SCAN| PK_LT | 403M| 1925M| 356K (1)| 00:00:14 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - storage("OBJECT_ID"<=20000 AND "OBJECT_ID">=1000)
filter("OBJECT_ID"<=20000 AND "OBJECT_ID">=1000)
15 rows selected.
Elapsed: 00:00:00.02
SQL> select count(*) from LARGE_TABLE where object_id between 1000 and 20000;
COUNT(*)
----------
486735872
Elapsed: 00:02:01.66
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_39539.trc
SQL> select a.name,b.value
2 from v$sysstat a , v$mystat b
3 where
a.statistic#=b.statistic#
and (a.name in ('physical read total bytes','physical write total bytes',
'cell IO uncompressed bytes') or a.name like 'cell phy%' ); 4 5 6
NAME VALUE
---------------------------------------------------------------- ----------
physical read total bytes 1.3300E+10
physical write total bytes 0
cell physical IO interconnect bytes 1.3300E+10
cell physical IO bytes saved during optimized file creation 0
cell physical IO bytes saved during optimized RMAN file restore 0
cell physical IO bytes eligible for predicate offload 0
cell physical IO bytes saved by storage index 0
cell physical IO bytes sent directly to DB node to balance CPU 0
cell physical IO interconnect bytes returned by smart scan 0
cell IO uncompressed bytes 0
10 rows selected.
Elapsed: 00:00:00.01
END OF STMT
PARSE #47310019587768:c=2000,e=2137,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=800139279,tim=1353385966411213
EXEC #47310019587768:c=1000,e=67,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=800139279,tim=1353385966411365
WAIT #47310019587768: nam='SQL*Net message to client' ela= 3 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1353385966411401
WAIT #47310019587768: nam='cell single block physical read' ela= 511 cellhash#=451279719 diskhash#=3519799300 bytes=8192 obj#=25183 tim=1353385966414839
WAIT #47310019587768: nam='cell multiblock physical read' ela= 16720 cellhash#=451279719 diskhash#=3519799300 bytes=1048576 obj#=25183 tim=1353385966433058
WAIT #47310019587768: nam='cell multiblock physical read' ela= 2965 cellhash#=451279719 diskhash#=3519799300 bytes=1048576 obj#=25183 tim=1353385966440986
...........................
select count(*) from LARGE_TABLE where owner like '%SY%';
QL> explain plan for select count(*) from LARGE_TABLE where owner like '%SY%';
Explained.
Elapsed: 00:00:00.00
SQL> @?/rdbms/admin/utlxplp
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3706014413
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 19017 (1)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
| 2 | BITMAP CONVERSION COUNT | | 26M| 127M| 19017 (1)| 00:00:01 |
|* 3 | BITMAP INDEX STORAGE FAST FULL SCAN| BIT_LT | | | | |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - storage("OWNER" LIKE '%SY%' AND "OWNER" IS NOT NULL)
filter("OWNER" LIKE '%SY%' AND "OWNER" IS NOT NULL)
16 rows selected.
Elapsed: 00:00:00.01
SQL> set linesize 200 pagesize 2000
SQL> select count(*) from LARGE_TABLE where owner like '%SY%';
COUNT(*)
----------
362643456
Elapsed: 00:00:01.07
SQL> select a.name,b.value
2 from v$sysstat a , v$mystat b
3 where
a.statistic#=b.statistic#
and (a.name in ('physical read total bytes','physical write total bytes',
'cell IO uncompressed bytes') or a.name like 'cell phy%' ); 4 5 6
NAME VALUE
---------------------------------------------------------------- ----------
physical read total bytes 173424640
physical write total bytes 0
cell physical IO interconnect bytes 173424640
cell physical IO bytes saved during optimized file creation 0
cell physical IO bytes saved during optimized RMAN file restore 0
cell physical IO bytes eligible for predicate offload 0
cell physical IO bytes saved by storage index 0
cell physical IO bytes sent directly to DB node to balance CPU 0
cell physical IO interconnect bytes returned by smart scan 0
cell IO uncompressed bytes 0
10 rows selected.
Elapsed: 00:00:00.02
SQL>