全表扫描优化手段
时间:2025-07-11
时间:2025-07-11
全表扫描优化手段
全表扫描的工作是扫描高水位一下所有的数据块。
这里就有一个问题,什么是高水位线。高水位的标志存在表头。
该数据块以后都是崭新未格式化的数据块,高水位的目的有二。它是全表扫描的
终点,并行插入的起点!
优化全表扫描的办法有四,核心就是降低高水位!
一、降低高水位;二、紧密码放数据;三、并行查询;四、修改初始化参数
降低高水位的办法有三:
一、在线回收空间;二、挪动表空间;三、导出和导入。
紧密码放数据办法有二:
一、调整pctfree;二、使用压缩特性。
实验如下:
建立大表,50万左右,分析表,列select * from t1;的计划,看代价!
SQL> conn scott/tiger
Connected.
SQL> drop table t1 purge;
Table dropped.
SQL> create table t1 as select * from emp where 0=9;
Table created.
SQL> insert into t1 select * from emp;
已创建14行。
SQL> insert into t1 select * from t1;
已创建14行。
SQL> /
--一直斜杠,直到
已创建229376行。
SQL> commit;
现在我们就有了45万行左右的大表!
分析表,获得统计信息!
analyze table T1 compute statistics;
Table analyzed.
SQL> set autot trace expl
SQL> select * from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 458K| 14M| 544 (10)| 00:00:07 |
| 1 | TABLE ACCESS FULL| T1 | 458K| 14M| 544 (10)| 00:00:07 |
--------------------------------------------------------------------------
我们看到代价为544,我们围绕544进行优化,降低代价!
set autot off
delete t1 where deptno=30;
commit;
analyze table T1 compute statistics;
select * from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 262K| 8192K| 526 (7)| 00:00:07 |
| 1 | TABLE ACCESS FULL| T1 | 262K| 8192K| 526 (7)| 00:00:07 |
--------------------------------------------------------------------------
我们看到代价为526,比原来小一点,因为cost是根据块,内存,cpu,网络综合计算的。
行少了一半,但代价没有少多少!因为这里高水位没有变化!
一、在线回收空间;
alter table t1 enable row movement;
alter table t1 shrink space;
analyze table T1 compute statistics;
SQL> select NUM_ROWS,BLOCKS,EMPT
全表扫描优化手段
Y_BLOCKS,AVG_SPACE from tabs where table_name='T1';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE
-------- ---------- ------------ ----------
262144 1376 32 21
占用了1376个数据块。
select * from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 262K| 8192K| 275 (11)| 00:00:04 |
| 1 | TABLE ACCESS FULL| T1 | 262K| 8192K| 275 (11)| 00:00:04 |
--------------------------------------------------------------------------
我们看到代价为275,比原来小了接近一半。
二、挪动表空间;
SQL> alter table t1 move tablespace users;
这句话也可以重新码放数据。
SQL> analyze table T1 compute statistics;
表已分析。
SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE from tabs where table_name='T1';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE
---------- ---------- ------------ ----------
262144 1568 96 826
占用了1568个数据块,比原来多了192个数据块,这是因为高水位不是一个一个块的挪动,
而是一组一组的挪动。
select * from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 262K| 8192K| 310 (10)| 00:00:04 |
| 1 | TABLE ACCESS FULL| T1 | 262K| 8192K| 310 (10)| 00:00:04 |
--------------------------------------------------------------------------
代价为310,比原来的275大,因为浪费了一些块,这些块存在于高水位下,但没有数据。
但数据库全表扫描的时候还是查看了空块,浪费了!
三、调整pctfree
SQL> alter table t1 pctfree 0;
Table altered.
这句话的目的是使每个数据块更加紧密的码放数据,没有update,或者upd …… 此处隐藏:4911字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:必修一细胞分化(浙科版)