Oracle 段区块 分配 (1)
生活随笔
收集整理的這篇文章主要介紹了
Oracle 段区块 分配 (1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師的教學視頻
??????????? http://v.youku.com/v_show/id_XNDAwMzYzODI0.html
??????????? 所做的學習筆記
???????????? 關于段區塊的定義以前都將過幾次了.
???????????? 視頻中介紹了兩個知識點:
???????????? 1. 區(extends)的分配
???????????????????????? 1個段(segment) 被建立后, oracle 如何為其分配新的extends
??????????? 2. 段空間管理方式.
???????????????????????? 1個新的extend 被分配到1個segment后, segment就相當于擁有一些空閑空間了, oracle怎么管理這些空間.
? ? ? ? ? ? ??
一. 利用em(Enterprise Manager) 演示如何建立1個新的表空間(table space)
???????????
???????????? step 1,? 用sys登錄em后, 在服務器那個tab見到有表空間的那個item, 點擊入去:
?
??????????
??????????? step 2,? 進去后, 這個頁面其實是1個管理表空間的頁面,可以見到數據庫當前表空間的各種信息, 我們要新建1個表空間, 就點擊右邊的創建按鈕.
???????????
???????? step 3, 下一個頁面, 就可以寫入新表空間的名字和選擇extends的管理方式了,? extends 的管理方式有兩種: 本地管理 和 字典管理,? 這里老相老師強烈建議選擇默認的本地管理方式.
?????????
?
????????? 其實這個區的管理類型會形象下面的區分配方式選項的。
????????? 如上圖, 旁邊還有類型 和 狀態的選項, 按照默認就看可以了.
????????? 一般來講, 我們知道表空間是用來存放數據文件的虛擬概念. 所以新建1個表空間的同時就必須為其新建1個新的數據文件. 在右下角, 我們點擊添加數據文件的按鈕.
????????? step 4.? 如下圖, 在添加數據文件的頁面, 我們必須制定數據文件的文件名和位置。
?????????
????????????? 上面有個 重用現有文件的選項, 這個代表如果服務器對應位置已經有當前文件名的文件,就覆蓋它, 強烈建議不選。
????????????? 自動擴展選項, 這里建議選上, 因為1個數據文件被占滿后, 如果我們再執行1個 insert sql語句的話,就很可能會報錯,如果選上該選項, 就會自動增加數據文件的大小, 增量的意思就是每次增加多少。
????????????? 不過作為dba, 不建議依賴這個功能來自動為dbf文件擴容, 因為每一次擴容,都發生大量的物理IO,就會大大影響對應sql語句的執行速度。而且通常自動擴展后,很快后容易又滿了,然后又擴展..所以應該經常關注dbf文件的容量, 快滿人手去為其增加一段合理的空間。 這個自動擴展只是用來防止報錯啦。
????????????? 選上必要選項后, 就可以按右下的繼續按鈕返回了。
????????????? step 5, 返回到先前的頁面, 這里點擊存儲的tab頁,就會見到區的分配方式 和段的管理方式選項
????????????
?
????????? 當我們選擇了區是本地管理方式后, 這里區的分配方式有自動和統一大小的選項, 老相老師說兩個選項都可以。
????????? 但是segment的管理強烈建議自動, 不要手動。
?????????? step 5, 這是我們點擊確定。就會執行這個改動, 但是我們強烈建議點擊旁邊的顯示sql按鈕。
?????????? 通過查看sql語句。 才能真正了解oracle究竟會為你執行什么操作, 避免你的失誤操作被執行。???????????
????????
??????????? 不過, 強烈建議點擊顯示SQL按鈕, 看看sql語句的內容,到底em會為我們執行什么操作, 可以避免你的在em的操作失誤被執行。
???????????? step 6, 得到sql語句后, 手動在sqlplus 或 sql developer里執行這段sql就會建立1個新的表空間了。
??????????
??????????? ?執行:
???????????????
老相老師在最后強調:
區管理, 毫無疑問選本地管理...?
段管理, 毫無疑問選自動
更深的知識老相老師表示在優化那里講.
?????????
二, 一些用于查看段區塊信息的sql語句
2.1 查看某張table對應的段信息
select owner,segment_name,blocks,extents,bytes,segment_type,tablespace_name from dba_segments where segment_name='EMP';
?
注意到 這個表有1個區, 8個 blocks, 占 65536個字節? 但是這些數據不一定是實事的.
要得到準確的數據, 就必須執行表分析 如下面的語句:
analyze table tablename compute statistics; --注意tablename前面的模式名 analyze table tablename compute statistics for all indexes;
在執行上面的查看段信息語句. 就相對準確了.
這個命令更加常用, 功能跟上面的例子差不多的.都是分析有用的
exec dbms_stats.gather_table_stats(SCOTT','EMP');
而利用dba_tables這個視圖也可以查看表的存儲信息:
select blocks,empty_blocks from dba_tables where table_name = 'EMP';
2.2 查看表的具體存儲信息.
包含表行數,使用的塊數,空的塊數,塊的使用率,行遷移和鏈接的數量,pctfree,pctused的數據,行的平均大小:
?
命令如下:
SELECT table_name,NUM_ROWS, --表中的記錄數 BLOCKS, --表中數據所占的數據塊數 //高水位線 EMPTY_BLOCKS, --表中的空塊數 AVG_SPACE, --數據塊中平均的使用空間 CHAIN_CNT, --表中行連接和行遷移的數量 AVG_ROW_LEN --每條記錄的平均長度 FROM DBA_TABLES where table_name='EMP'
2.3 查看一張表的所有extents信息:
???? 呢個好簡單,就是檢索dba_extents視圖了.
???? 例如我選一張數量比較大的表:
????? select * from dba_extents where segment_name = 'SOURCE$' order by extent_id;
?
如上圖.
其中 Partition_name 的意思分區名, 如果是非分區表. 這里的值都是Null
extent_id 就是 這張表的段編號了, 1個編號代表1個段.
block_id 就是這個extent 起始block 編號
blocks 就是block數量了, 注意是連續的block啊
file_id 就是代表這個extent所在的數據文件編號.
也可以看出一些規律, 在oracle 在extents 本地管理,自動大小模式下, 一般對于一張表. 前16個extents 都是8個block的, 當16個extents用完時, oracle就會認為這張表是一張有一定數據量的表, 第17個開始就以128個blocks為單位分配給1個新的 extent了.
當然如果選的是統一大小管理, 就不會出現這個請跨國你.
三, segment的高水位線(high water mark)
???????
?????? 3.1 廣義的高水位線
??????????? 所謂高水位線就是1個水庫和河流, 水位歷史到達的最高位. 即使水位降下來, 高水位線的值不變, 除非水位沖破高水位線.
????????
???????? 3.2 Oralce的高水位線????????
???????????????? 我們知道對于一張表來講, 數據是存放在都應的segment中的, 由于update 和 delete操作的存在, 1個segment里面的數據量可以增加, 也能會減少,? 而這個段曾經用過的最后1個編號的block的編號, 就是高水位線.
????????????????? 舉個例子,? 假如某1一張表T1, 那么對應的段就是T1段了,? 加入這個段有4個extents, 共32個block, 有1日, 有人插入一段數據到表T1, 32個blocks中的31個被占用了, 而第32個bLock是從沒有人用過的, 那么這個段的高水線就是第31個block.
?????????????????? 這時分配了2個新的extents到這個段中,? 這個段就多了 16個空的block, 共有48個block了, 這時高水位線仍然是第31個block.
?????????????????? 有人又插入一段數據, 這段數據占7個block, 那么這個段被占用紅了 38個block, 高水位線就被調整至第38個block!
?????????????????? 然后他把這段數據刪除, 這個段之占用了31個block, 上次的7個block數據被清空. 但是高水位線仍然是第38個block, 并不會降下來.
???????? 3.3 高水位線的意義
?????????????? 高水位線的意義在哪里呢? 其實高水位線是oracle執行全表掃描時會掃描到的位置.? 例如上面那個例子,? T1段有48個block, 但是只占用了31個block, 而高水位線在第38個block, 那么全表掃描時就會掃到38個block. 即使其中7個是空的.
?????????????????? 所以我們知道高水位其實越低越好(越接近當前值), 否則會出現performance問題.
?????? 如下圖,? select count(*) from table就是1個全表 掃描動作.
????? 而高水線會影響邏輯讀 和物理讀的數量.
???????????
?
?????????
???????? 3.4 降低高水位線
????????????? 那么高水位線是否只能增大不能減少呢. 不是的, oracle提供降低高水位線的功能,? 這個涉及段空間的釋放. 老相老師說以后講優化時再講.
????????????????? 其中1個方法就是先備份這張的表數據到另1個張表. 然后truncate這張表, 就會把高水位先將到0(同時清空數據), 然后把數據insert 回來.
四, oracle的塊(blocks)
???????? 我們知道oracle blocks的默認大小是8kb.
?????????? 下面分析下1個block的結構.
???????????4.1 Data Block 的結構。 ?
??????????????????????
?????????????? 4.1.1 數據塊頭(含標準內容和可變內容)
?????????????????????????? 數據塊頭包含基本的Data Block信息,
??????????????????????????? a.Block的地址
? ? ? ? ? ? ? ? ? ? ? ? ??? b. 屬于哪個表空間/段/區? (所屬表的信息)
??????????????????????????? c.所屬段的類型.(例如,數據段\索引段)
??????????????????????????? d.事務槽 //老相老師說以后講
??????????????????????????? e. 行目錄? //記錄行數據區每一行的起始位置.
??????????????????????????? 如上圖, 可以見到頭部信息是存放在1個block的頭部的, 而數據行數據是放在尾部的. 空閑的空間會出現在中間.
???????????????????????????? 4.1.2 行數據區???
???????????????? 行數據區當然就是用存放表的數據行數據啦
??????????????????? 對于每1條數據行,? 都包括
??????????????????? a. 行的頭部.? 記錄一些行的鎖信息 很段
??????????????????? b. 列1的長度,列1的值,列2的長度, 列2的值.........你懂的
??????????????????? 而每兩個鄰近的行, 頭部和尾部是連接在一起的, 所以在block里, 是沒有物理上的行的概念了, 因為所有的行都鏈接在一起嘛.?那么怎么區分數據是哪一行呢, 就是依靠上面頭部信息的行目錄區, 他記錄了具體每1個行的起始位置.
??????????????????? 假如server Process要訪問的1個張表的第8行第4列,?
???????????????????? 1) 那么它首先會根據執行計劃這個行在哪1個block.
???????????????????? 2) 將這個block整個讀入data buffer
???????????????????? 3) 訪問buffer的頭部信息, 知道這一行在這個block的起始位置.
???????????????????? 4) 得到位置后, 他會首先獲得列1的長度.? 然后根據長度就可以直接跳過列1的數據區,接下來它獲得列2的長度,然后又跳過列2的數據, 知道它獲得列4的長度, 然后就根據當前位置和長度獲得列4的數據(值)了.
???????????????????? 所以理論上, 如果我們要訪問第10個列, 理論上可以要訪問前9個列的長度信息。所以最好把最經常訪問的列放在前面。 不過這個時間差忽略不不計了, 優化的價值很少。
五,文件系統(linux)的塊
?????????????????? 可以用如下命令去 查看文件系統塊的信息:
????????????????????? dumpe2fs /dev/sda1?????????? //當然sdax就根據實際情況了.
如下圖:
??????????????
可以加到操作系統級別的block size是4kb
當我們手動設置oracle 的blocksize時間,一定要將其設置成操作系統基本blocksize 的整數倍。 否則會訪問了額外的操作系統block, 導致性能問題, 老相老師說這個問題在優化時會詳細講
貌似空間不夠了 接:
??????????? http://v.youku.com/v_show/id_XNDAwMzYzODI0.html
??????????? 所做的學習筆記
???????????? 關于段區塊的定義以前都將過幾次了.
???????????? 視頻中介紹了兩個知識點:
???????????? 1. 區(extends)的分配
???????????????????????? 1個段(segment) 被建立后, oracle 如何為其分配新的extends
??????????? 2. 段空間管理方式.
???????????????????????? 1個新的extend 被分配到1個segment后, segment就相當于擁有一些空閑空間了, oracle怎么管理這些空間.
? ? ? ? ? ? ??
一. 利用em(Enterprise Manager) 演示如何建立1個新的表空間(table space)
???????????
???????????? step 1,? 用sys登錄em后, 在服務器那個tab見到有表空間的那個item, 點擊入去:
?
??????????
??????????? step 2,? 進去后, 這個頁面其實是1個管理表空間的頁面,可以見到數據庫當前表空間的各種信息, 我們要新建1個表空間, 就點擊右邊的創建按鈕.
???????????
???????? step 3, 下一個頁面, 就可以寫入新表空間的名字和選擇extends的管理方式了,? extends 的管理方式有兩種: 本地管理 和 字典管理,? 這里老相老師強烈建議選擇默認的本地管理方式.
?????????
?
????????? 其實這個區的管理類型會形象下面的區分配方式選項的。
????????? 如上圖, 旁邊還有類型 和 狀態的選項, 按照默認就看可以了.
????????? 一般來講, 我們知道表空間是用來存放數據文件的虛擬概念. 所以新建1個表空間的同時就必須為其新建1個新的數據文件. 在右下角, 我們點擊添加數據文件的按鈕.
????????? step 4.? 如下圖, 在添加數據文件的頁面, 我們必須制定數據文件的文件名和位置。
?????????
????????????? 上面有個 重用現有文件的選項, 這個代表如果服務器對應位置已經有當前文件名的文件,就覆蓋它, 強烈建議不選。
????????????? 自動擴展選項, 這里建議選上, 因為1個數據文件被占滿后, 如果我們再執行1個 insert sql語句的話,就很可能會報錯,如果選上該選項, 就會自動增加數據文件的大小, 增量的意思就是每次增加多少。
????????????? 不過作為dba, 不建議依賴這個功能來自動為dbf文件擴容, 因為每一次擴容,都發生大量的物理IO,就會大大影響對應sql語句的執行速度。而且通常自動擴展后,很快后容易又滿了,然后又擴展..所以應該經常關注dbf文件的容量, 快滿人手去為其增加一段合理的空間。 這個自動擴展只是用來防止報錯啦。
????????????? 選上必要選項后, 就可以按右下的繼續按鈕返回了。
????????????? step 5, 返回到先前的頁面, 這里點擊存儲的tab頁,就會見到區的分配方式 和段的管理方式選項
????????????
?
????????? 當我們選擇了區是本地管理方式后, 這里區的分配方式有自動和統一大小的選項, 老相老師說兩個選項都可以。
????????? 但是segment的管理強烈建議自動, 不要手動。
?????????? step 5, 這是我們點擊確定。就會執行這個改動, 但是我們強烈建議點擊旁邊的顯示sql按鈕。
?????????? 通過查看sql語句。 才能真正了解oracle究竟會為你執行什么操作, 避免你的失誤操作被執行。???????????
????????
??????????? 不過, 強烈建議點擊顯示SQL按鈕, 看看sql語句的內容,到底em會為我們執行什么操作, 可以避免你的在em的操作失誤被執行。
???????????? step 6, 得到sql語句后, 手動在sqlplus 或 sql developer里執行這段sql就會建立1個新的表空間了。
??????????
??????????? ?執行:
???????????????
老相老師在最后強調:
區管理, 毫無疑問選本地管理...?
段管理, 毫無疑問選自動
更深的知識老相老師表示在優化那里講.
?????????
二, 一些用于查看段區塊信息的sql語句
2.1 查看某張table對應的段信息
select owner,segment_name,blocks,extents,bytes,segment_type,tablespace_name from dba_segments where segment_name='EMP';
?
注意到 這個表有1個區, 8個 blocks, 占 65536個字節? 但是這些數據不一定是實事的.
要得到準確的數據, 就必須執行表分析 如下面的語句:
analyze table tablename compute statistics; --注意tablename前面的模式名 analyze table tablename compute statistics for all indexes;
在執行上面的查看段信息語句. 就相對準確了.
這個命令更加常用, 功能跟上面的例子差不多的.都是分析有用的
exec dbms_stats.gather_table_stats(SCOTT','EMP');
而利用dba_tables這個視圖也可以查看表的存儲信息:
select blocks,empty_blocks from dba_tables where table_name = 'EMP';
2.2 查看表的具體存儲信息.
包含表行數,使用的塊數,空的塊數,塊的使用率,行遷移和鏈接的數量,pctfree,pctused的數據,行的平均大小:
?
命令如下:
SELECT table_name,NUM_ROWS, --表中的記錄數 BLOCKS, --表中數據所占的數據塊數 //高水位線 EMPTY_BLOCKS, --表中的空塊數 AVG_SPACE, --數據塊中平均的使用空間 CHAIN_CNT, --表中行連接和行遷移的數量 AVG_ROW_LEN --每條記錄的平均長度 FROM DBA_TABLES where table_name='EMP'
2.3 查看一張表的所有extents信息:
???? 呢個好簡單,就是檢索dba_extents視圖了.
???? 例如我選一張數量比較大的表:
????? select * from dba_extents where segment_name = 'SOURCE$' order by extent_id;
?
如上圖.
其中 Partition_name 的意思分區名, 如果是非分區表. 這里的值都是Null
extent_id 就是 這張表的段編號了, 1個編號代表1個段.
block_id 就是這個extent 起始block 編號
blocks 就是block數量了, 注意是連續的block啊
file_id 就是代表這個extent所在的數據文件編號.
也可以看出一些規律, 在oracle 在extents 本地管理,自動大小模式下, 一般對于一張表. 前16個extents 都是8個block的, 當16個extents用完時, oracle就會認為這張表是一張有一定數據量的表, 第17個開始就以128個blocks為單位分配給1個新的 extent了.
當然如果選的是統一大小管理, 就不會出現這個請跨國你.
三, segment的高水位線(high water mark)
???????
?????? 3.1 廣義的高水位線
??????????? 所謂高水位線就是1個水庫和河流, 水位歷史到達的最高位. 即使水位降下來, 高水位線的值不變, 除非水位沖破高水位線.
????????
???????? 3.2 Oralce的高水位線????????
???????????????? 我們知道對于一張表來講, 數據是存放在都應的segment中的, 由于update 和 delete操作的存在, 1個segment里面的數據量可以增加, 也能會減少,? 而這個段曾經用過的最后1個編號的block的編號, 就是高水位線.
????????????????? 舉個例子,? 假如某1一張表T1, 那么對應的段就是T1段了,? 加入這個段有4個extents, 共32個block, 有1日, 有人插入一段數據到表T1, 32個blocks中的31個被占用了, 而第32個bLock是從沒有人用過的, 那么這個段的高水線就是第31個block.
?????????????????? 這時分配了2個新的extents到這個段中,? 這個段就多了 16個空的block, 共有48個block了, 這時高水位線仍然是第31個block.
?????????????????? 有人又插入一段數據, 這段數據占7個block, 那么這個段被占用紅了 38個block, 高水位線就被調整至第38個block!
?????????????????? 然后他把這段數據刪除, 這個段之占用了31個block, 上次的7個block數據被清空. 但是高水位線仍然是第38個block, 并不會降下來.
???????? 3.3 高水位線的意義
?????????????? 高水位線的意義在哪里呢? 其實高水位線是oracle執行全表掃描時會掃描到的位置.? 例如上面那個例子,? T1段有48個block, 但是只占用了31個block, 而高水位線在第38個block, 那么全表掃描時就會掃到38個block. 即使其中7個是空的.
?????????????????? 所以我們知道高水位其實越低越好(越接近當前值), 否則會出現performance問題.
?????? 如下圖,? select count(*) from table就是1個全表 掃描動作.
????? 而高水線會影響邏輯讀 和物理讀的數量.
???????????
?
?????????
???????? 3.4 降低高水位線
????????????? 那么高水位線是否只能增大不能減少呢. 不是的, oracle提供降低高水位線的功能,? 這個涉及段空間的釋放. 老相老師說以后講優化時再講.
????????????????? 其中1個方法就是先備份這張的表數據到另1個張表. 然后truncate這張表, 就會把高水位先將到0(同時清空數據), 然后把數據insert 回來.
四, oracle的塊(blocks)
???????? 我們知道oracle blocks的默認大小是8kb.
?????????? 下面分析下1個block的結構.
???????????4.1 Data Block 的結構。 ?
??????????????????????
?????????????? 4.1.1 數據塊頭(含標準內容和可變內容)
?????????????????????????? 數據塊頭包含基本的Data Block信息,
??????????????????????????? a.Block的地址
? ? ? ? ? ? ? ? ? ? ? ? ??? b. 屬于哪個表空間/段/區? (所屬表的信息)
??????????????????????????? c.所屬段的類型.(例如,數據段\索引段)
??????????????????????????? d.事務槽 //老相老師說以后講
??????????????????????????? e. 行目錄? //記錄行數據區每一行的起始位置.
??????????????????????????? 如上圖, 可以見到頭部信息是存放在1個block的頭部的, 而數據行數據是放在尾部的. 空閑的空間會出現在中間.
???????????????????????????? 4.1.2 行數據區???
???????????????? 行數據區當然就是用存放表的數據行數據啦
??????????????????? 對于每1條數據行,? 都包括
??????????????????? a. 行的頭部.? 記錄一些行的鎖信息 很段
??????????????????? b. 列1的長度,列1的值,列2的長度, 列2的值.........你懂的
??????????????????? 而每兩個鄰近的行, 頭部和尾部是連接在一起的, 所以在block里, 是沒有物理上的行的概念了, 因為所有的行都鏈接在一起嘛.?那么怎么區分數據是哪一行呢, 就是依靠上面頭部信息的行目錄區, 他記錄了具體每1個行的起始位置.
??????????????????? 假如server Process要訪問的1個張表的第8行第4列,?
???????????????????? 1) 那么它首先會根據執行計劃這個行在哪1個block.
???????????????????? 2) 將這個block整個讀入data buffer
???????????????????? 3) 訪問buffer的頭部信息, 知道這一行在這個block的起始位置.
???????????????????? 4) 得到位置后, 他會首先獲得列1的長度.? 然后根據長度就可以直接跳過列1的數據區,接下來它獲得列2的長度,然后又跳過列2的數據, 知道它獲得列4的長度, 然后就根據當前位置和長度獲得列4的數據(值)了.
???????????????????? 所以理論上, 如果我們要訪問第10個列, 理論上可以要訪問前9個列的長度信息。所以最好把最經常訪問的列放在前面。 不過這個時間差忽略不不計了, 優化的價值很少。
五,文件系統(linux)的塊
?????????????????? 可以用如下命令去 查看文件系統塊的信息:
????????????????????? dumpe2fs /dev/sda1?????????? //當然sdax就根據實際情況了.
如下圖:
??????????????
可以加到操作系統級別的block size是4kb
當我們手動設置oracle 的blocksize時間,一定要將其設置成操作系統基本blocksize 的整數倍。 否則會訪問了額外的操作系統block, 導致性能問題, 老相老師說這個問題在優化時會詳細講
貌似空間不夠了 接:
Oracle 段區塊 分配(2)
總結
以上是生活随笔為你收集整理的Oracle 段区块 分配 (1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: int 类型的取值范围
- 下一篇: Oracle 段区块 分配 (2)