基本資料庫對象管理

来源:http://www.cnblogs.com/jy627625/archive/2016/06/16/5591202.html
-Advertisement-
Play Games

無論是資料庫管理員,還是普通用戶,都需要經常對資料庫對象進行管理,如資料庫對象的創建、刪除、修改等。Oracle 中的資料庫對象包括表、索引、視圖、存儲程式、序列等,這些資料庫對象以一種邏輯關係組織在一起,這就是模式( schema )。模式是一個用戶所擁有的所有資料庫對象的集合。 每個資料庫對象都 ...


無論是資料庫管理員,還是普通用戶,都需要經常對資料庫對象進行管理,如資料庫對象的創建、刪除、修改等。
Oracle 中的資料庫對象包括表、索引、視圖、存儲程式、序列等,這些資料庫對象以一種邏輯關係組織在一起,這就是模式( schema )。
模式是一個用戶所擁有的所有資料庫對象的集合

每個資料庫對象都屬於某個用戶,一個用戶所擁有的資料庫對象就組成了一個模式,模式的名稱與用戶名相同
當創建用戶時,就同時產生了一個模式,在預設的情況下,用戶在自己的模式中有所有的許可權。
將站在資料庫管理員的角度,重新考慮這些資料庫對象在Oracle 中所涉及的特性,如存儲結構、數據的組織方式等

表的管理

表的管理涉及表的結構、表的創建、修改與刪除等操作,以及臨時表、分區表和索引組織表三種特殊類型的表

表的結構

在資料庫中,表是最基本的資料庫對象,用來存儲系統或用戶的數據

表中的數據是按照行和列的格式存放的
表中的各行數據一般以寫入的先後順序存放,而一行中的各列一般按照定義表時指定的順序存放的。
在邏輯結構上,一個表位於某個表空間。

當創建一個表時,將同時創建一個表段,用於存放表中的數據。
在物理結構上,表中的數據都存放在數據塊中,因而在數據塊中存放的是一行行的數據。
圖為數據塊中一行數據的結構。

其中行的頭部記錄了該行中列的個數、行間的全連接、加鎖信息等

列長度記錄-個列實際占用的位元組數,而列值則記錄了該列實際存放的數據。

表中的每一行數據都有一個行號,用於標識該行數據的物理位置

根據這個行號,可以直接定位該行數據。
行號可以通過偽列ROWID獲得

例如,以下查詢得到表DEPT中的數據及每行的行號。
SELECT rowid, emp.* FROM scott.emp;

行號是由資料庫伺服器自動生成的字元串包含18個字元

行號的組成如圖所示。

其中前六個字元表示資料庫對象的編號,用來指定該行數據屬於哪個資料庫對象。

在資料庫中每個資料庫對象都有一個唯一的編號。
從第七個到第九個共三個字元表示數據文件的相對編號,用來指定該行數據存儲在哪個數據文件中。
在資料庫中每個數據文件中有兩個編號,一個是絕對編號,它是數據文件在整個資料庫範圍內的編號,另一個是相對編號,它是數據文件在一個表空間範圍內的編號。
從第十到第十五共六個字元表示數據塊的編號,用來指定該行數據位於哪個數據塊中。
最後三個字元表示行號,用來指定該行數據在數據塊中位於第幾行。

為了使用戶對行號的進行解析, Oracle提供了一個DBMS_ROWID程式包,利用這個程式包中的函數可以對行號進行分析。
DBMS_ROWID 中各個函數的用法如表所示。

例如,以下查詢將得到dept表中每行數據所在的文件編號、資料庫對象的編號、數據塊編號和在數據塊中的行號:

SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) AS 相對文件號,
DBMS_ROWID.ROWID_OBJECT(rowid) AS 對象編號,
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) AS 數據塊編號,
DBMS_ROWID.ROWID_ROW_NUMBER(rowid) AS 行號
FROM scott.dept;

表的創建

在創建表時,可以同時為表指定一些重要的屬性,如存儲參數、所屬表空間等。

這些屬性都通過CREATE TABLE命令的子句指定。

1.PCTFREE和PCTUSED子句

這兩個參數的作用是用來控制數據塊的空間使用情況

為了減少數據塊間的遷移,在創建表時可以通過PCTFREE和PCTUSED子句指定數據塊空間的使用情況。
考慮以下創建表的語句:

CREATE TABLE Tl(
name varchar2 ( 10) )
PCTFREE 20
PCTUSED 40;

在表Tl 中,每個數據塊都有20o/o的保留空間。

當可用空間使用完後,新的數據將被寫入另外一個數據塊。
當從表中刪除數據時,數據塊中已用空間不斷減少,當減少到40%時,可再次向該數據塊中插入數據。
在使用PCTFREE和PCTUSED子句時,可以參考以下原則:
• PCTFREE和PCTFUSED的值必須小於或等於100% 。
·如果在一個表上很少執行UPDATE操作,可以將PCTFREE設置得儘量小。
• PCTFREE與PCTUSED之和越接近100o/o ,數據塊的空間利用率越高。

2.TABLESPACE子句

TABLESPACE子句用來指定將表創建在哪個表空間上。

如果不指定TABLESPACE子句,用戶將在自己的預設表空間上創建表。
為了能夠在指定的表空間上創建表,當前用戶必須在該表空間上有足夠的空間配額或在資料庫中具有UNLIMITED TABLESPACE許可權。

3.INITRANS和MAXTRANS子句

資料庫中的數據存儲在數據塊中,用戶的事務最終要修改數據塊中的數據。

Oracle允許多個併發的事務同時修改一個數據塊中的數據。
每當用戶的事務開始作用於一個數據塊時,資料庫伺服器將在該數據塊的頭部為該事務分配一個事務項,以記錄事務的相關信息。
事務結束時,對應的事務項將被刪除。
INITRANS和MAXTRANS參數用於控制一個數據塊上的併發事務數量,其中INITRANS 用於指定初始的事務數量
MAXTRANS 用於指定最大的併發事務數量
當創建一個表時,資料庫伺服器按照INITRANS的值為每個數據塊分配一定的事務項,這些事務項將一直保留到該表被刪除
當一個事務訪問數據塊時,將占用其中的一個事務項,事務結束時,將釋放事務項。
當這些預先創建的事務項全部被占用後,如果又有新的併發事務發生,資料庫伺服器將在數據塊的可用空間中為事務創建一個新的事務項。
在任一時刻,數據塊中的事務項不會超過MAXTRANS 參數值。
例如,在利用以下語句創建表時,指定初始的事務項為10 ,最大的併發事務數量為2000

CREATE TABLE T2(
name varchar2 ( 10) )
INITRANS 10
MAXTRANS 200;

INITRANS和MAXTRANS參數的值可以根據用戶對錶的訪問情況進行設置。

如果參數值過大,事務項將占用更多的數據塊空間,那麼數據可以利用的空間將喊少。
如果參數設置過小,有些事務將因為無法分配到事務項而等待,從而降低了資料庫的性能。
一般情況下,如果多個用戶同時訪問表的情況很少發生,可以為這兩個參數設置較小的參數值,反之要為這兩個參數指定較大的參數值。

4.CACHE子句

CACHE子句用於指定將表中的數據放在資料庫高速緩存中,並保留一段時間。

如果在創建表時指定了CACHE字句,那麼在用戶第一次訪問表中的數據時,這個表將整個被讀到資料庫高速緩存中,並保留較長的一段時間,這樣用戶以後再訪問該表時,可直接訪問資料庫高速緩存中的數據,從而提高訪問的效率。
在預設情況下創建表時使用NOCACHE子句

對於一些較小的、用戶訪問頻繁的表,在創建時可以考慮使用CACHE子句,以提高訪問效率。

CREATE TABLE T3(
name varchar2 ( 10) )
CACHE;

5.RAPALLEL子句

在一般情況下,通過INSERT命令向表中寫人數據時,一次寫入一行數據,這樣的寫操作是串列進行的。
如果在創建表時指定了PARALLEL子句,那麼在向表中以批量方式寫入大量數據時就是以併發方式進行的,這樣可以大大提高處理的速度。
例如,利用以下語句創建表時,將實現併發操作。

CREATE TABLE T4(
name varchar2 ( 10) )
PARALLEL;

如果不希望在表上以併發方式寫入數據,在創建表時需要指定NOPARALLEL 。

6.LOGGING子句

在預設情況下,用戶在表上執行DDL和DML命令時,伺服器進程都會產生重做日誌。
如果不希望產生重做日誌,在創建表時需要指定NOLOGGING子句

使用NO LOGGING子句有以下好處:
·由於不寫重做日誌,因而節約了重做日誌文件的存儲空間。
.減少了處理時間。
·在以並行方式向表中寫入大量數據時提高了效率。
當然在使用NOLOGGING子句時也有不好的一面。

因為沒有重做日誌,當表被破壞時,將無法進行恢復,所以在表創建後應該及時對其進行備份。

CREATE TABLE T5(
name varchar2 ( 10) )
NOLOGGING;

7.COMPRESS子句

如果在創建表時使用了COMPRESS子句,那麼一個數據塊中兩行完全相同的數據將被壓縮為一行,並存儲在數據塊的開始,在數據塊中本應存儲這兩行數據的地方只存儲該行數據的引用。

使用表的壓縮功能可以減少表所占用的存儲空間和資料庫高速續存空間,並且可以提高查詢速度。
表的壓縮功能一般用在向表中批量插入數據的情況(例如基於查詢創建表)。

一個表中可以包含壓縮的和未壓縮的數據,所有DML操作均可應用於這些壓縮的數據
例如,下麵的語句用於創建表T6,這個表具有壓縮功能,支持併發的數據寫入,對DDL和DML命令不產生重做日誌。

CREATE TABLE T6(
name varchar2 ( 10) )
COMPRESS PARALLEL NOLOGGING;

臨時表是一種特殊類型的表,表中的數據並不永久保存,而是一些臨時數據。

這些臨時數據只在當前事務當前會話中有效,當事務或會話結束時,這些臨時數據將被全部刪除。
創建臨時表的命令是CREATE GLOBAL TEMPORARY TABLE

在創建臨時表時還需要通過ON COMMIT子句指定臨時數據的有效範圍。
如果指定了ON COMMIT DELETE ROWS 子句,那麼臨時表是事務級的,當事務提交或回滾時,臨時表中的數據即被刪除。
如果指定了ONCOMMIT PRESERVE ROWS子句,那麼臨時表是會話級的,表中的數據將一直保留,直到當前會話結束時才被刪除。
以下語句用於創建一個事務級的臨時表:

CREATE GLOBAL TEMPORARY TABLE T7(
name varchar2(10)
ON COMMIT DELETE ROWS;

表的修改

資料庫伺服器的運行過程中,如果發現表的設計不合理,可以對其進行修改。

一般來說,對錶的修改涉及以下內容:
·表的結構的修改,如增加列、刪除列、修改某個列的定義。
·約束的修改,如添加約束、刪除約束、激活約束與禁止約束。
·修改表的物理屬性,如PCTFREE參數、PCTUSED參數。
·表的移動,如移動到一個新的數據段或表空間。
·表的存儲空間的手工分配和回收
修改表的命令是ALTER TABLE ,普通用戶只能修改自己的表。

如果要修改其他用戶的表,必須具有ALTER ANY TABLE系統許可權。

1.修改表的物理屬性

在創建表時可以指定PCTFREE 、PCTUSED 、INITRANS 、CACHE等參數,這些參數對於表中存儲空間的利用有直接的影響。
表在創建以後,用戶也可以對這些參數進行修改。

例如,下麵的語句對錶的參數進行了修改:

ALTER TABLE T6 NOLOGGING;

2.表的移動

表的移動意味著把表中的數據移動到一新的表段中,同時可以把表段移動到另外一個表空間中。
表的移動在以下場合非常有用:
·消除表中的存儲碎片。
·消除表中數據塊間的鏈接。
·把表移動到另外-個表空間中。
.修改表所使用的數據塊大小。
在對錶進行移動時,表中的數據將被重新排列,這樣就可以消除表中的存儲碎片和數據塊的鏈接。
如果兩個表空間所使用的數據塊大小不同,那麼表在兩個表空間中移動時,也將使用不同大小的數據塊。
移動表所使用的命令是ALTER TABLE

在移動表時,先為表創建一個新的表段,然後把表中的數據移動到這個新段中,最後刪除原來的表段。
例如:
ALTER TABLE T2 MOVE;
又如, 下麵的ALTER語句用於把表T2移動到表空間USERS中:
ALTER TABLE T2 MOVE TABLESPACE USERS;
需要註意的是,表被移動後,表的行號將發生變化,所以表上原來的索引將不可用

在表移動後應該刪除原來的索引並重新創建

存儲空間的手工分配和回收

表在創建後,隨著數據的增加, Oracle將按照存儲參數的設置不斷為表分配新的區。

這一過程是自動進行的,不需要用戶的干預。
在布些情況下,用戶希望為表分配一個指定大小的區,這時需要利用ALTER TABLE命令及其ALLOCATE EXTENTS子句為表手工分配一個區。
在手工為表分配區時,可以為其指定大小。

如果沒有指定大小,資料庫伺服器將按照該表所在表空間的區大小,為表分配一個區。
例如,以下語句為表T2手工分配了一個512KB 的區:

 ALTER TABLE T2 ALLOCATE EXTENT(SIZE 521K);

實際上,手工指定的區大小與該表所在表空間的區大小可能不一致。

假設表空間的區大小是64KB ,那麼上述命令的執行結果是為表T2分配了8個64KB 的區。
在表段的HWM以下,可能有一些尚未使用的數據塊。

為了節省磁碟空間,可以通過命令把這些存儲空間回收。

例如:

ALTER TABLE T2 DEALLOCATE UNUSED;

表的刪除

當一個表不需要時,可以將其刪除。

刪除表時,將產生以下結果:
·表的結構信息從數據字典中被刪除,表中的數據不可訪問。
·表上的所有索引和觸發器被一起刪除。
·所有建立在該表上的同義詞、視圖和存儲程式變為無效。
·所有分配給表的區被標記為空閑,可被分配給其的對資料庫對象。
一般情況下,普通用戶只能刪除自己的表。

若希望刪除其他用戶的表,則必須具有DROP ANY TABLE系統許可權。
為了防止用戶對錶進行誤刪除,在資料庫中提供了一個回收站

當表被刪除時,表所占用的存儲空間並不是立即被釋放,而是被放進了回收站。
回收站實際上是一個數據字典表,用於記錄被刪除的表、索引等資料庫對象的信息

當一個資料庫對象被刪除時,它所占用的存儲空間並不立即釋放,而是被重命名後放進了回收站。
如果後來用戶發現某個對象是被誤刪除的,可以從回收站中將其恢復。
當用戶刪除一個表空間時,表空間中的資料庫對象並不被放入回收站,而且回收站中原來屬於該表空間的資料庫對象也將被清除。
當一個用戶被刪除時,屬於這個用戶的資料庫對象也不被放入回收站,而且回收站中原來屬於該用戶的資料庫對象也將被清除。
用戶可以在回收站中查看屬於自己的、被刪除的資料庫對象,資料庫管理員可以查看所有被刪除的資料庫對象。
用戶可以通過以下的語句查看回收站中的內容:
SELECT * FROM RECYCLEBIN;
資料庫對象被刪除後,它將被重命名並放入回收站。

重命名的目的是為了防止被刪除對象的名稱相互衝突。
重命名的規則為:
BIN$id$ 版本
其中id是由oracle產生的包含26個字元的字元串,是被刪除資料庫對象的唯一標識。

版本是由資料庫伺服器自動指定的版本號。
為了查看回收站的方便, Oracle資料庫提供了兩個數據字典視圖:

USER_RECYCLEBIN :包含當前用戶的被刪除的資料庫對象, RECYCLEBIN是它的同義詞。
DBA_RECYCLEBIN :包含所有被刪除的資料庫對象,僅資料庫管理員可以訪問。

例如,以下語句用於查詢SCOTT用戶被刪除的資料庫對象:

SELECT OBJECT_NAME, ORIGINAL_NAME FROM DBA_RECYCLEBIN WHERE OWNER='SCOTT';

用戶也可以通過執行SQL*Plus命令show recyclebin來查看回收站

儘管表已經被放入回收站,用戶還是可以訪問表中的數據,只是表名必須使用它在回收站中的名稱。
例如:

SELECT * FROM "BIN$dyeDMxzWSkqrFCX6+dTO2A==$0";

當用戶確信一個資料庫對象不再需要時,可以執行PURGE命令將其從回收站中清除,該對象及其相關對象所占用的存儲空間將一起被釋放
清除資料庫對象時,可以使用回收站中的名稱,也可以使用被刪除前的名稱。
例如,以下兩條語句的作用都是從回收站中清除表T2:

PURGE TABLE "BIN$dyeDMxzWSkqrFCX6+dTO2A==$0";

PURGE TABLE TEST;

如果希望在刪除表的同時釋放存儲空間,可以在DROP TABLE命令中使用PURGE子句,這個表就直接被刪除了,而不是被放到回收站中。
例如:

 DROP TABLE TEST PURGE;

用戶還可以選擇清除回收站中原來屬於某個表空間的所有資料庫對象,或者清除某個用戶的原來屬於某個表空間的所有資料庫對象,還可以清除屬於自己的資料庫對象。
這三種操作對應的命令格式分別為:

PURGE TABLESPACE USERS;

PURGE TABLESPACE USERS USER SCOTT;

PURGE RECYCLEBIN;

對於第三種用法,資料庫管理員可用來清除回收站中的所有內容,只是要將RECYCLEBIN替換為DBA_RECYCLEBIN
如果一個資料庫對象被刪除了,那麼在被從回收站中清除之前,可以通過執行FLASHBACK命令將其恢復,並可通過RENAME子句為其指定一個新的名稱。
例如:

FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST_BAK;

如果沒有通過RENAME子句為它指定名稱,·它將使用原來的名稱。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • IOS最好要設置系統預設啟動頁面,不然進入應用就會突然閃現黑色畫面 下圖是我們要實現的效果: 總體思路:設置一個系統預設啟動頁面,在進入didFinishLaunchingWithOptions時, 給Window添加自定義啟動頁,其初始畫面和系統啟動頁一樣。 可在自定義啟動頁實現一些動畫,動畫結束 ...
  • 1. 安裝配置git 安裝:需要從網上下載一個,然後進行預設安裝即可。安裝完成後,找到 “Git Bash”,點擊: 配置: 註意:name和email 只是用來標識身份,但是一定要配置好 2. Studio集成git git路徑: 3.通過git上傳github 輸入github用戶名和密碼,點擊 ...
  • 公司的介面一般會兩種協議的,一種HTTP,一種HTTPS的,HTTP 只要請求,伺服器就會響應,如果我們不對請求和響應做出加密處理,所有信息都是會被檢測劫持到的,是很不安全的,客戶端加密可以使用本文這套工具類進行處理。 導言 公司的介面一般會兩種協議的,一種HTTP,一種HTTPS的,HTTP 只要 ...
  • PostgreSQL添加新的伺服器連接時,報錯: 解決方法: 第一步:修改配置文件中連接的伺服器列表,添加伺服器IP地址(圖pg002.png) 配置文件地址:資料庫右擊屬性,打開資料庫的安裝路徑在data文件中找到配置文件pg_hba.conf。 如:D:\Program Files\Postgr ...
  • 命令 #查看版本 mysql --version #進入mysql 命令 mysql -u root -p mysql -u root@localhost (沒有密碼的情況) ...
  • 【MongoDB】2014-07-25T11:00:48.634+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:10061 由於目標電腦積極拒絕,無法連接。 ...
  • 索引是什麼大家都知道是加快查詢用的,是的,沒錯,索引的根本作用是縮小掃描範圍,而不是直接定位記錄,直接定位記錄只是索引的一種特殊情況,縮小範圍之後最終都是線性掃描得到結果。 就是按照某個值排序,這是最最基本的索引了,RDBMS里的聚集索引,別小看這種簡陋的東西,它是大數據里常用甚至是唯一可用的索引。 ...
  • 開始事物:begin transaction 提交事物:commit transaction 回滾事物:rollback transaction http://wenku.baidu.com/link?url=sOj3AnJPBbeWg6gu2NYcMSfTK4gj8BobB-URG2rCiH8_2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...