oracle元数据存储在表空间,oracle db中数据和元数据的概念
本帖最后由 warehouse 于 2014-8-10 11:58 編輯
02年研究dw相關的產品和業務時第一次聽說了元數據的概念,很多資料上是這樣描述元數據的概念的:元數據是定義或者描述數據的數據。言外之意是先有元數據再有數據。在構建數據倉庫前期建模的過程其實就是定義元數據的過程。如果說oltp的產生是源于業務驅動的,那么olap的產生完全是由數據驅動最終為業務服務的,他們其實最后是一個圓周,根本就沒有終點,所以搞信息化,db和dw是沒有盡頭的,我覺得是一個閉環
閑言少敘,下面看看oracle中數據和元數據的概念,oracle中其實把數據和元數據分的非常清楚,只是沒有明確的用這2個概念界定出來,在11.2版本中參數deferred_segment_creation的出現更是把元數據和數據分的非常清楚了。
--===============================
C:\>sqlplus test/test
SQL*Plus: Release 11.2.0.1.0 Production on 星期日 7月 29 19:08:15 2012
Copyright (c) 1982, 2010, Oracle.??All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning option
SQL> show parameter def
NAME? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?TYPE? ?? ???VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation? ?? ?? ?? ?boolean? ???TRUE
SQL> create table t(id int ,name varchar2(10)) tablespace users;
表已創建。
SQL> select object_id,data_object_id from dba_objects where owner='TEST' and object_name='T';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
21030? ?? ?? ? 21030
SQL> select count(*) from dba_segments where owner='TEST' and segment_name='T';
COUNT(*)
----------
0
--create table之后發現數據段并不存在,這就是deferred_segment_creation的作用,段被延遲創建了,正常都是在插入數據時創建的,這里發現move之后段也隨即被創建了,其實表里這時候還是沒有數據的,之所以move一下,主要是我觀查到dba_objects中段的id在創建表的時侯已經分配好了,而并沒有在創建段的時侯再分配,所以在段不存在的時侯move一下我是想驗證move之后data_object_id是否會發生變化,結果是move之后data_object_id確實和段存在的情況下move的結果一樣,發生了變化。
SQL> alter table t move;
表已更改。
SQL> select object_id,data_object_id from dba_objects where owner='TEST' and object_name='T';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
21030? ?? ?? ? 21031
SQL> select count(*) from dba_segments where owner='TEST' and segment_name='T';
COUNT(*)
----------
1
SQL>
--=================================
這里大家注意create table...定義的就是元數據,元數據是存放著system表空間里的,數據是保存在我們create table時指定的表空間users里,下面簡單舉個例子來幫助我們理解數據和元數據:
--=================================
SQL> insert into t values(1,'a');
已創建 1 行。
SQL> insert into t values(2,'b');
已創建 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
ID NAME
---------- ----------
1 a
2 b
SQL> alter tablespace users offline;
表空間已更改。
SQL> select * from t;
select * from t
*
第 1 行出現錯誤:
ORA-00376: 此時無法讀取文件 4
ORA-01110: 數據文件 4: 'E:\ORACLE\ORADATA\TEST\USERS01.DBF'
SQL> drop table t;
表已刪除。
SQL>
--================================
這里清楚的看到tablespace users被offline之后,不能查詢t表里面的數據,但是缺可以drop table t,原因就是drop table的時侯oracle只是刪除了t的元數據,而并不會去修改表里的數據。
--================================
有關鎖的情況也是一樣的,用戶在修改一條數據的時侯會在表上同時加上tx和tm鎖,其中tm鎖鎖定的就是元數據,tx鎖定的是數據,要想鎖定數據首先要鎖定元數據。防止在修改數據的時侯其它session把元數據修改了。可見在oracle里把數據和元數據的概念也是體現的淋漓盡致。E.F.CODE在提出RDBMS理論的時侯不知道是否已對這2個概念了然于胸,在他提出olap概念的時侯不知道他老人家是否對oracle熟悉,但是我們真的很敬佩這位2次獲得圖靈獎的關系型數據庫的鼻祖是根據什么理論能夠提出這么精髓的概念。我們也不知道oracle的設計者又是參照什么理論能在olap概念之前就把元數據和數據運用的如此之精妙。
真是讓人震撼。
--=================================
set unused column其實也是這個道理,首先把元數據刪除了(其實是重命名),然后空閑的時侯再刪除數據。
--=================================
external table的話更是做到了極致,把metadata放在db里,data直接在os上,有關external table doc上有清晰的描述:
An external table is a read-only table that is defined within the database but exists
outside of the database. In more technical terms, the external table’s metadata is
stored inside the database, and the data it contains is outside of the database.
總結
以上是生活随笔為你收集整理的oracle元数据存储在表空间,oracle db中数据和元数据的概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 账号与密码比对,Php - 将
- 下一篇: php yanzhengm,ThinkP