日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle元数据存储在表空间,oracle db中数据和元数据的概念

發布時間:2024/9/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中数据和元数据的概念的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。