天天看點

我的Oracle 9i學習日志(13)-- 存儲結構和關系

<b>存儲結構和關系</b>

block大小還有些限制:如果作業系統塊大小小于32KB則不能指定DB_32K_CACHE_SIZE的值,如果作業系統塊大小的值小于2KB則不能指定DB_2K_CACHE_SIZE的值。

Segments類型:表、分區表、聚簇、索引、Index-Organized Table(IOT)、索引分區、還原segments、臨時segments、LOB segments、嵌套表、引導程式segments等。

存儲子句優先級:segment&gt;tablespace&gt;oracle default,除了MINIMUM EXTENT 和UNIFORM SIZE等參數之外,因為這些參數無法在segments這一級規定。如果在segment級别沒有明确指定參數值則按tablespace的預設設定,如果tablespace級别沒有明确指定參數值則按Oracle預設設定。

注意:

如果存儲參數改變了,那麼新的選項隻适用于還未被配置設定的segments。

一些參數無法再tablespace級别指定,必須在segments級别指定。

如果最小extent大小在tablespace級别指定,則這個大小會應用到所有這個表空間内extent配置設定的segments。

extent是表空間内某個段使用的一塊空間。在下列情況下被配置設定:

當segment被建立、擴充或改變;在下列情況下被釋放:當segment被删除、改變或Truncated。

在tablespace建立時Data files的第一塊block或頭幾塊blocks被稱為頭部。

資料庫block:

最小的I/O單元

由一個或多個作業系統block組成

在tablespace建立時設定

DB_BLOCK_SIZE訓示了預設的block大小

SQL&gt; show parameter db_block_size

NAME               TYPE VALUE

------------------------------------ -----------

db_block_size            integer 8192

Oracle 9i支援4個不同block size,2KB、4 KB、8 KB、16 KB、32 KB。其中有一個是預設大小,它的值取決于作業系統,并且無法改變。System表空間和所有的temp表空間所用的block大小都是db_block_size大小,被稱為标準塊大小其他的稱為非标準塊大小。是以Oracle總共可以支援4種非标準塊大小。

不同的block size用于在不同block size的資料庫之間轉移或傳輸資料;為了提高性能可在不同存儲位置用不同的block size。

每一個塊大小都對應一個DB CACHE SIZE參數,用來指定對應的緩存大小,以granule為機關配置設定。預設48MB。為了保持向後相容,參數DB_BLOCK_BUFFERS依然可以使用,但是是靜态參數。

Granule是虛拟記憶體配置設定的基本機關,大小取決于SGA_MAX_SIZE的值,SGA大小&lt;128M那麼granule就為4MB,其他則為16MB。

如果使用了非标準塊,如4KB,則必須指定相應的cache大小,這裡即DB_4K_CACHE_SIZE。DB_nK_CACHE_SIZE的值預設為0。但其中的标準塊大小對應的這個參數的值不要指定,由DB_CACHE_SIZE指定。作業系統平台相關的

SQL&gt; show parameter db_cache_size

db_cache_size            big integer 33554432

SQL&gt; show parameter db_2k

db_2k_cache_size         big integer 0

SQL&gt; show parameter db_4k   

db_4k_cache_size         big integer 0

SQL&gt; show parameter db_8k

db_8k_cache_size         big integer 0

SQL&gt; show parameter db_16k

db_16k_cache_size          big integer 0

SQL&gt; show parameter db_32k

db_32k_cache_size          big integer 0

SQL&gt; show parameter db_block_buff

db_block_buffers         integer 0

建立非标準塊大小表空間:

SQL&gt; alter system set db_4k_cache_size=16777216 scope=memory;

alter system set db_4k_cache_size=16777216 scope=memory

*

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00384: Insufficient memory to grow cache

SQL&gt; alter system set db_4k_cache_size=16777216 scope=spfile;

System altered.

SQL&gt; shutdown

SQL&gt; startup

SQL&gt; show parameter db_4k

db_4k_cache_size         big integer 16777216

SQL&gt; create tablespace b4k datafile

 2 '/u01/oradata/lty/ts/b4k.dbf'

 3   size 10m blocksize 4k;

TABLESPACE_NAME        BLOCK_SIZE

------------------------------ ----------

B4K                4096

規則:

• 分區對象的所有分區必須位于具有相同塊大小的表空間中。

• 所有臨時表空間必須采用标準塊大小,包括用作預設臨時表空間的永久表空間。

• 按索引組織的表溢出(overflow)和外部LOB 段可以存儲在塊大小與基表不同的表空間中。

塊頭:包含塊位址,表目錄,行目錄和事務槽。塊頭增長方向是從上往下。

資料:資料增長方向為從下往上。

空閑空間:開始時連續的,在存資料後經過删除等操作可能變成不連續,在需要的時候可以讓Oracle server進行合并。

幾個主要參數:

Initrans與maxtrans:指定能同時對資料塊進行更改的事務的最小數和最大數,initrans預設值為1(對資料)或2(對索引)。Maxtrans預設為255.

Pctfree與pctuserd:參見後面内容。

<b>資料塊管理方式:</b>自動管理和手動管理兩種方式,預設為手動管理。

<b>自動段空間管理</b>

• 一種在資料庫段内管理空閑空間的方法。

• 對段内空閑和已用空間的跟蹤是使用位圖完成的(與使用空閑清單相對)。

• 此方法提供了:

– 更友善的管理:PCTUSED、FREELISTS、FREELIST GROUPS 均是自動管理的。

– 更高的空間使用率,所有對象都可以更有效地使用空間,尤其是行大小變化很大的對象。

–改進了對并發通路變化的運作時調整,改進的并發INSERT 操作性能。

• 限制:不能用于包含LOB 的表空間。

• 位圖段包含一個位圖,它描述了與段中的可用空間相關的每個塊的狀态。

• 該映射包含在單獨的一組塊中,這些塊稱為“位圖塊”(BMB)。

• 插入新行時,伺服器就會在該映射中搜尋具有足夠空間的塊。

• 當塊中的可用空間數量發生變化時,位圖中就會反映出它的新狀态。

配置自動段空間管理

• 自動段空間管理僅能在表空間級别啟用,用于在本地管理的表空間。

• 建立表空間後,這些規格将應用于在該表空間中建立的所有段。

CREATE TABLESPACE data02

DATAFILE ‘/u01/oradata/data02.dbf’ SIZE 5M

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K

SEGMENT SPACE MANAGEMENT AUTO;

位圖段是通過CREATE TABLESPACE 指令的SEGMENT SPACE MANGEMENT AUTO

子句指定的,此後不能更改這些段。如果定義了PCTUSED、FREELIST 和FREELIST GROUPS,則将其全部忽略。

可以用位圖管理的段為:規則表、索引、按索引組織的表(IOT) 以及LOB。

圖四 

開始時塊是空的會存在freelist裡,當有資料要插入時,Oracle會搜尋freelist找到合适的塊将資料插入。當塊的空閑空間&lt;pctfree%(預設值為10)時就會脫離freelist,剩餘空間僅用于自身資料的更新。當塊内資料由于删除等原因,被使用的空間會縮小,當被使用的空間&lt;ptuserd%(預設值為40)時,塊又會從新回到freelist上。

對于MSSM(Manual segment-space management)有一個高水位:

<a target="_blank" href="http://blog.51cto.com/attachment/201003/104731551.png"></a>

圖5 

1、     連續的塊組成的空間。

2、     存儲了資料後,高水位線随之移動。

3、     後又删除了一些資料,但高水位線不會回移。

4、當有新資料插入時,首先搜尋灰色的那部分空間,如果沒有合适的塊可供資料插入,則會使用黃色的那部分,如果黃色的那部分不夠則會使用白色的那部分,同時高水位線相應後移。

對于ASSM(Automatic segment-space management)還有個低水位線

<a target="_blank" href="http://blog.51cto.com/attachment/201003/104759929.png"></a>

圖6

 實驗:驗證手動管理方式的高水位線。

設定AUTOTRACE:AUTOTRACE 是SQL*Plus 中一個工具,可以顯示所執行查詢的解釋計劃(explain plan)以及所用的資源。

在sysdba權限下執行:

SQL&gt; @ORACLE_HOME/rdbms/admin/utlxplan

Table created.

SQL&gt; create public synonym plan_table for plan_table;

Synonym created.

SQL&gt; grant all on plan_table to public;

Grant succeeded.

SQL&gt; @/u01/oracle/sqlplus/admin/plustrce

SQL&gt; grant plustrace to dba with admin option;

以luo使用者登入,使用者表空間為luo:

SQL&gt; select tablespace_name, segment_space_management from user_tablespaces;

TABLESPACE_NAME                SEGMEN

------------------------------ ------

LUO                            MANUAL

17 rows selected.

SQL&gt; select * from user_objects;

no rows selected

SQL&gt; select segment_name from user_segments;

#表空間裡很幹淨。

建立表:

SQL&gt; create table test(id integer, name char(10));

SQL&gt; select count(*) from test;

 COUNT(*)

----------

開啟autotrace:

SQL&gt; set autotrace on stat

查詢:

Statistics

-----------------------------------------------------

          0 recursive calls

          0 db block gets

          3 consistent gets

          0 physical reads

          0 redo size

        378 bytes sent via SQL*Net to client

        503 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

1    rows processed

插入10萬條記錄:

SQL&gt; begin

 2 for i in 1 .. 1000000

 3 loop

 4     insert into test values(i, 'luo');

 5 end loop

 6 ;

 7 commit;

 8 end;

 9 /

PL/SQL procedure successfully completed.

   1000000

          2 recursive calls

       5785 consistent gets

       2880 physical reads

     173340 redo size

        379 bytes sent via SQL*Net to client

删除表裡的記錄:

SQL&gt; delete from test;

1000000 rows deleted.

        552 recursive calls

    1033970 db block gets

       3172 consistent gets

       2631 physical reads

 249849916 redo size

        625 bytes sent via SQL*Net to client

        516 bytes received via SQL*Net from client

          3 SQL*Net roundtrips to/from client

          1 sorts (memory)

1000000 rows processed

       2896 consistent gets

       2851 physical reads

#删除記錄後還是會掃描塊。

SQL&gt; commit;

Commit complete.

SQL&gt; truncate table test;

Table truncated.

          1 db block gets

          5 consistent gets

         40 redo size

          1 rows processed

#truncate可以使高水位線歸零。

<b>獲得資訊:</b>

• DBA_EXTENTS

• DBA_SEGMENTS

• DBA_TABLESPACES

• DBA_DATA_FILES

• DBA_FREE_SPACE

練習:

<b>1</b>As user SYSTEM, run the lab09_01.sqlscript to create tables and indexes.

在以上網站可以下載下傳到lab09_01.

<b>2 </b>Identify the different types of segments in the database.

解析:select distinct segment_type from dba_segments;

<b>3 </b>Write a query to check which segments are within five extents short of the maximum extents. Ignore the bootstrap segment. This query is useful in identifying any segments that are likely to generate errors during future data load.

<b>Hints</b>

- Select from DBA_segments

- Use the segment_name, segment_type, max_extents, extents keywords.

解析:select segment_name, segment_type, max_extents, extents from dba_segments where extents+5 &gt; max_extents and segment_type &lt;&gt;’cache’;

<b>4 </b>Which files have space allocated for the EMP table?

解析:可根據dba_segments和dba_data_files

<b>5 </b>Run the lab09_05.sql script.

同1題

<b>6 </b>List the free space available by tablespace. The query should display the number of fragments, the total free space, and the largest free extent in each tablespace.

解析:select tablespace_name,count(*) as fragments,sum(bytes) as total,max(bytes) as t from dba_free_space group by tablespace_name;

<b>7 </b>List segments that will generate errors because of lack of space when they try to allocate an additional extent.

解析:select s.segment_name,s.segment_type,s.tablespace_name,s.next_extent from dba_segments s where not exists (select 1 from dba_free_space f where s.tablespace_name = f.tablespace_name having max(f.bytes) &gt; s.next_extent)

本文轉自 d185740815 51CTO部落格,原文連結:http://blog.51cto.com/luotaoyang/288992,如需轉載請自行聯系原作者