在創建表的時候系統把表空間默認創建在users下,奇怪為什么不創建在system 下呢
把非系統用戶的表存放到系統表空間,至於為什么,原來系統對SYSTEM表空間的自動維護會占用CPU資源,
如果將普通用戶的表存放到系統表空間,效率會下降,下面是轉載的測試案例,數據庫(11.2.0.2.0 for linux 64bit)測試過程和結果如下:
create table t_users(id number); --創建的是 默認的用戶下
create table t_system(id number); --把表創建到系統用戶下
select table_name,tablespace_name from user_tables;
2.查看當前CPU消耗
SQL> select STATISTIC#,NAME from v$statname where name='CPU used by this session';
select * from v$mystat where STATISTIC#=16;
SQL> set timing on SQL> begin 2 for i in 1..100000 loop 3 insert into t_users values(i); 4 end loop; 5 end; 6 / PL/SQL procedure successfully completed. Elapsed: 00:00:03.83 SQL> select * from v$mystat where STATISTIC#=19;
4.向T_SYSTEM表插入數據,查看CPU消耗
SQL> begin 2 for i in 1..100000 loop 3 insert into t_system values(i); 4 end loop; 5 end; 6 / PL/SQL procedure successfully completed. Elapsed: 00:00:11.41 SQL> select * from v$mystat where STATISTIC#=19;
可見,對存放到非系統表空間的表做同樣的INSERT操作,存放在USERS表空間的表只需要執行0秒20和141-120=21的CPU,而存放到SYSTEM表空間的表卻要執行0秒23和143-141=2的CPU, 為什么會這樣?請看下面兩個參數。
db_block_checking參數對block進行邏輯校驗,數據庫發生update,insert等涉及數據塊發生改變的操作后,db_block_checking參數驗證每個數據塊內部或相關幾個塊邏輯的完整性,該參數有六個值:OFF,LOW,MEDIUM,FULL,TRUE,FALSE,這些參數含義如下:
LOW:基本的數據塊header checks
MEDIUM:數據塊內部的全面檢測,(不包含index organized table blocks)
FULL:對數據庫中所有的塊進行全面檢測(包括index block)
OFF: 禁用DB_BLOCK_CHECKING功能(SYSTEM tablespace除外,詳見下文的隱含參數)
true,false是為了向后兼容保留的,true=FULL,false=OFF)
db_block_checksum參數對數據塊進行物理校驗,在block寫入磁盤和讀出磁盤時,oracle會對每個block生成一個校驗碼,並和block header中校驗碼進行比對,校驗數據塊的一致性.此外該參數也對log block執行同樣的檢測,此外11G中對log block的檢測有所細化,該參數有五個值:OFF,FULL,TYPICAL,TRUE,FALSE,這些參數含義如下:
OFF:禁用DB_BLOCK_CHECKSUM功能(SYSTEM tablespace除外,詳見下文隱含參數)
TYPICAL:數據塊讀出和寫入時對數據塊進行物理校驗(默認值)
FULL: 除了TYPEICAL的功能外,還可以對內存中每個BLOCK發生變化(insert,update)的前后進行校驗,但這個功能並不能代替DB_BLOCK_CHECKING參數的功能.
true,false是為了向后兼容保留的,true=FULL,false=OFF)
無論db_block_checking和db_block_checksum這兩個參數的值為何值,SYSTEM 表空間都會執行block checks.不受上述參數影響,跟隱含參數_db_always_check_system_ts有關,該參數默認為TRUE。