8.读书笔记收获不止Oracle之 逻辑体系三 扩展和性能
来源:互联网 发布:巨人城刷龙啸翻牌软件 编辑:程序博客网 时间:2024/04/30 20:58
8.读书笔记收获不止Oracle之 逻辑体系三 扩展和性能
1. 扩展与性能
如果表记录增长的特别快,可以考虑把这个EXTENT的大小设置得大一点,比如initial extent 和 incremental extent .
做个试验:
SQL> Create tablespace tbs_toad_a
Datafile '+DATA/ORCL/DATAFILE/tbs_toad_a.dbf' size 1M autoextend on uniform size64k;Set
SQL> Create tablespace tbs_toad_b
Datafile '+DATA/ORCL/DATAFILE/tbs_toad_b.dbf' size 500M
Set timing on
Create table t_a (id int) tablespacetbs_toad_a;
Create table t_b (id int) tablespacetbs_toad_b;
插入比较速度:
SQL> insert into t_a select rownum from dual connect bylevel<=1000000;
1000000 rows created.
Elapsed: 00:00:04.84
SQL> insert into t_b select rownum from dual connect bylevel<=1000000;
1000000 rows created.
Elapsed: 00:00:00.88
速度差了很多。
查看扩展的次数:
SQL> select count(*) from user_extentswhere segment_name='T_A';
COUNT(*)
----------
194
Elapsed: 00:00:00.19
SQL> select count(*) from user_extentswhere segment_name='T_B';
COUNT(*)
----------
28
Elapsed: 00:00:00.13
T_A扩展了194次,而T_B扩展了28次才,所以速度相差几倍。
在申请扩大空间时候,花费了大量时间。
表空间扩大是要格式化操作系统文件成为ORACLE可以识别的数据库,开销的确很大。
2. PCTFREE与性能
先创建HR 用户的相关数据,没有就执行hr_main.sql脚本。
链接如下:
http://download.csdn.net/detail/notbaron/9101265
执行后
#sqlplus hr/hr
SQL> create table employees as select * from hr.employees;
Table created.
SQL> desc employees;
Name Null? Type
------------------------------------------------- ----------------------------
EMPLOYEE_ID NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
扩大字段
Alter table employees modify first_namevarchar2(2000);
Alter table employees modify last_namevarchar2(2000);
Alter table employees modify emailvarchar2(2000);
Alter table employees modify phone_numbervarchar2(2000);
然后填满数据,将导致原先大量的行迁移产生:
SQL> update employees setfirst_name=LPAD('1',2000,'*'),LAST_name=lpad('1',2000,'*'),EMAIL=LPAD('1',2000,'*'),
phone_number=lpad('1',2000,'*');
SQL>commit;
进行查询
SQL>set autotrace traceonly
Set linesize 1000
SQL> Select * from employees;
107 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|Time |
-------------------------------------------------------------------------------
| 0| SELECT STATEMENT | | 107 | 7383 | 3 (0)| 00:00:01 |
| 1| TABLE ACCESS FULL| EMPLOYEES | 107 | 7383 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
2 recursive calls
1 dbblock gets
318 consistent gets
0 physicalreads
184 redo size
867264 bytes sent via SQL*Net toclient
628 bytes received via SQL*Net from client
9 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
107 rows processed
产生了318个逻辑读。
然后再复制一份,再进行查询
SQL> create table employees_bk as select * from employees;
Table created.
SQL> set autotrace traceonly
SQL> set linesize 1000
SQL> select * from employees_bk;
107 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 2676497765
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 839K| 38 (0)| 00:00:01 |
| 1| TABLE ACCESS FULL| EMPLOYEES_BK | 107 | 839K| 38 (0)| 00:00:01 |
----------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
5 recursive calls
0 dbblock gets
252 consistent gets
124 physical reads
0 redosize
867115 bytes sent via SQL*Net toclient
628 bytes received via SQL*Net from client
9 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
107 rows processed
原先20个字节的长度被更新为200个字节长度。
消除行迁移的一个简单的办法,就是数据重建。
查询数据库的PCTFREE
SQL> select pct_free from user_tables wheretable_name='EMPLOYEES';
PCT_FREE
----------
10
修改PCTFREE这个参数
Alter table employees pctfree 20;
SQL> select pct_free from user_tables wheretable_name='EMPLOYEES';
PCT_FREE
----------
20
这个参数要设置多大,需要深入了解和测试。
3. 行迁移与优化
创建一个chained_rows
#sqlplus / as sysdba
SQL>@?/rdbms/admin/utlchain.sql
对EMPLOYEES表和EMPLOYEES_BK做分析。
Analyze table employees list chained rowsinto chained_rows;
Analyze table employees_bk list chainedrows into chained_rows;
进行查询
SQL> select count(*) from chained_rows where table_name='EMPLOYEES';
SQL> select count(*) from chained_rows where table_name='EMPLOYEES_BK';
如下脚本发现行迁移严重的情况:
SQL> select 'analyze table' ||table_name||'list chained rows intochained_rows;' from user_tables;
'ANALYZETABLE'||TABLE_NAME||'LISTCHAINEDROWSINTOCHAINED_ROWS;'
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
analyze tableTlist chained rows intochained_rows;
analyze tableT2list chained rows intochained_rows;
analyze tableT_Alist chained rows intochained_rows;
analyze tableT_Blist chained rows intochained_rows;
analyze tableEMPLOYEESlist chained rowsinto chained_rows;
analyze tableCHAINED_ROWSlist chained rowsinto chained_rows;
analyze tableEMPLOYEES_BKlist chained rowsinto chained_rows;
7 rows selected.
SQL> select * from chained_rows;
4. 块大小与应用
BLOCK是ORACLE最小的单位。
如果块越大,装的行记录就越多,需要的块就越少。产生的IO就越少。
对于OLAP应用,一般倾向于BLOCK尽量大。OLTP倾向于 BLOCK尽量不要太大。
索引读返回少量记录这样的OLTP主打环境下,块的大小对性能影响不大。
OLTP块太大,容易导致大量并发查询及更新操作都指向同一个数据块,从而产生热点块竞争。
- 8.读书笔记收获不止Oracle之 逻辑体系三 扩展和性能
- 6.读书笔记收获不止Oracle之 逻辑体系
- 7.读书笔记收获不止Oracle之 逻辑体系二 深入与调整
- 收获不止Oracle读书笔记之一:体验物理体系之旅
- 3.读书笔记收获不止Oracle之 物理体系
- 5.读书笔记收获不止Oracle之 插入表性能示例
- 1.读书笔记收获不止Oracle之开篇
- 2.读书笔记收获不止Oracle之 意识
- 13.读书笔记收获不止Oracle之 簇表
- 14.读书笔记收获不止Oracle之 索引
- 10.读书笔记收获不止Oracle之 表设计之分区表
- 18.读书笔记收获不止Oracle之 索引SUM和AVG优化
- 19.读书笔记收获不止Oracle之 索引MAX和MIN优化
- 20.读书笔记收获不止Oracle之 索引回表和优化
- 4.读书笔记收获不止Oracle之 体系结构原理
- 9.读书笔记收获不止Oracle之 表设计
- 12.读书笔记收获不止Oracle之 索引分区表
- 15.读书笔记收获不止Oracle之 索引高度
- go 代码的调试---打印调用堆栈
- 剑指offer 连续子数组的最大和
- 作为刚出培训机构的面试之路
- 数组中未出现的最小正整数
- Git入门(二)常用指令
- 8.读书笔记收获不止Oracle之 逻辑体系三 扩展和性能
- 9.读书笔记收获不止Oracle之 表设计
- 【Linux】文件类型
- 10.读书笔记收获不止Oracle之 表设计之分区表
- java中的关于时间的概念
- 11.读书笔记收获不止Oracle之 表设计之分区使用
- 12.读书笔记收获不止Oracle之 索引分区表
- web.xml
- 13.读书笔记收获不止Oracle之 簇表