表空間是數據庫邏輯結構的一個重要組件,可以存放各種應用對象,如表、索引。每一個表空間由一個或多個數據文件組成。
表空間分類:
| 類別 |
說明 |
| 永久性表空間 |
一般保存表、視圖、過程和索引等的數據。SYSTEM、SYSAUX、USERS、EXAMPLE表空間是默認安裝的 |
| 臨時性表空間 |
只用於保存系統中短期活動的數據,如排序數據等 |
| 撤銷表空間 |
用來幫助回表未提交的事務數據,已提交了的數據在這里是不可以恢復的。一般不需要建臨時和撤銷表空間,除非把它們轉移到其他磁盤中以提高性能 |
表空間的目的:
(1)對不同用戶分配不同的表空間,對不同的模式對象分配不同的表空間,方便對用戶數據的操作,對模式對象管理
(2)可以將不同數據文件創建到不同的磁盤中,有利於管理磁盤空間,有利於提高I/O性能。
創建表空間:
create tablespace tablespace_name
datafile ‘filename’ [ size integer [K|M]]
[autoextend [off|on]];
--datafile指定組成表空間的一個或多個數據文件,當有多個數據文件時使用逗號分隔。
--filename是數據文件的路徑和名稱。
--size指定文件的大小,用K指定千字節大小,用M指定兆字節大小。
--autoextend子句用來啟用或禁用數據文件的自動擴展,設置為on則空間使用完畢會自動擴展,設置為off則很容
易出現表空間剩余容量為0的情況,使數據不能存儲到數據庫中。
例: create tablespace worktbs--表空間名
datafile ‘d:\orcle\worktbs.dbf’
size 10M autoextend on;
刪除表空間:drop tablespace tablespace_name;
修改表空間:
alter database --修改表空間文件大小
datafile ‘F:\oracle\product\10.1.0\oradata\orcl\hello.dbf’
resize 10M;
alter tablespace hello --為表空間hello添加一個數據文件
add datafile 'F:\oracle\product\10.1.0\oradata\orcl\helloAdd.dbf'
size 10M
自定義用戶管理
當創建一個新數據庫時,系統默認創建一些數據庫用戶,如Sys、System和Scott等。Sys和System都是Oracle的系統用戶,Scott是Oracle數據庫的一個示范賬戶,里面有一些測試樣例表。
1.Sys,是Oracle中的一個超級用戶。數據庫中的所有數據字典和視圖都存儲在SYS模式中。數據存儲了用來管理數據庫對象的所有信息。主要用來維護系統信息和管理實例。Sys只能以SYSOPER或SYSDBA角色登錄系統。
2.System,是Oracle中默認的系統管理員,它擁有DBA權限。該用戶擁有Oracle管理工具使用的內部表和視圖。管理Oracel數據庫的用戶、權限和存儲等。不建議在System模式中創建用戶表。System不能以SYSOPER或SYSDBA角色登錄系統,只能以默認方式登錄。
3.Scott,用戶是一個示范用戶包含4個示范表,其中一個是Emp表。使用USERS表空間存儲模式對象。每個用戶都有一個默認表空間和一個臨時表空間。Oracle將USERS設為默認表空間,將TEMP設為臨時表空間。
創建用戶:
create user user_name
identified by password
[default tablespace tablespace_name]
[temporary tablespace tablespace_name]
--user_name是用戶名,用戶名必須是一個標識符。
--password是用戶口令,必須是一個標識符,且不區分大小寫。
--default或temporary tablespace 為用戶確定默認表空間或臨時表空間。如果沒有確定default表空間,則系
統默認把users表空間當作默認表空間。
例: create user martin--用戶名
identified by martinpwd--口令
default tablespace worktbs--默認表空間
temporary tablespace temp;--臨時表空間
修改口令(密碼):
alter user martin --要修改的用戶martin
identified by mpwd;--新口令
刪除用戶,drop user命令可以用於刪除用戶,但當用戶擁有模式對象時則無法刪除用戶,而必須使用cascade選項刪除用戶和用戶模式對象。
drop user martin;--沒有模式對象的情況
drop user martin cascade;--用模式對象的情況
數據庫權限管理
1.系統權限,是指被授權用戶是否可以連接到數據庫上及在數據庫中可以進行哪些系統操作;系統權限是在數據庫中執行某種系統級別的操作,或者針對某一類的對象執行某種操作的權利。
常用的系統權限:
create session :連接到數據庫。
create table :創建表。
create view :創建視圖。
create sequence:創建序列。
create public synonym:創建公有同義詞
2.對象權限,是指用戶對數據庫中具體對象所擁有的權限。對象權限是針對某個特定的模式對象執行操作的權利。只能針對樣式對象來設置和管理對象權限,如數據庫中的表、視圖、序列、存儲對程、存儲函數等。
Oracle數據庫用戶有兩種途徑獲得權限:
1)管理員直接向用戶授予權限。
2)管理員將權限授予角色,然后再將角色授予給一個用戶。通常使用角色向用戶授予權限。
Oracle中常用的系統預定義角色如下:
connect :需要連接上數據庫的用戶,特別是那些不需要創建表的用戶,通常授予該角色。
resource :更為可靠和正式的庫用戶可以授予該角色,可以創建表、觸發器、過程等。
dba :數據庫管理員角色,擁有管理數據庫的最高權限。一個具有DBA角色的用戶可以給其他用戶、角色授權,可以撤銷任何別的用戶甚至別的dba權限。所以不要輕易授予該權限。
(1)授予權限語法:grant 權限|角色 to 用戶名;
(2)撤銷權限語法:revoke 權限|角色 from 用戶名;
例: grant connect,resource to martin;--授予connnect和resource兩個角色
revoke connect,resource from martin;--撤銷connect和resource兩個角色
grant select on scott.emp to martin; --允許用戶查看scott模式下emp表的記錄
授予表的訪問權限:
例:grant select on dept to public; --授予所有連接數據庫的用戶都可以訪問這個表的權限
數據庫用戶安全設計原則:
1)數據庫用戶權限授權按照最小分配原則。
2)數據庫用戶要分為管理、應用、維護、備份四類用戶。
3)不允許使用Sys和System用戶建立數據庫應用對象。
4)禁止grant dba to user;--授予dba角色
序列(sequence)是用來生成唯一、連續的速遞的數據庫對象。序列通常用來自動生成主鍵或唯一鍵的值,可以是升序,也可以是降序。
創建序列:
create sequence sequence_name
[start with integer]
[increment by integer]
[maxvalue integer|nomaxvalue]
[minvalue integer|nominvalue]
[cycle|nocycle]
[cache integer|nocache];
--start with :指定要生成的第一個序列號。對於升序,其默認值為序列最小值。對於降序,其默認值為序列最大值
--increment by :用於指定序列號之間的間隔,默認值為1。如果n為正值,則是升序序列。如果n為負值,則是降
序序列。
--maxvalue :指定序列可以生成的最大值。
--nomaxvalue :Oracle將升序序列的最大值設為10的27次冪,將降序序列的最大值設為-1。 這是默認選項。
--minvalue :指定序列的最小值。必須小於或等於start with的值,並且必須小於maxvalue。
--nominvalue :Oracle將升序序列的最小值設為1,將降序序列的最小值設為-10的26次冪。這是默認選項。
--cycle :指定序列在達到最大值或最小值后,將繼續從頭開始生成值。
--nocycle :指定序列在達到最大值或最小值后,將不能再繼續生成值。這是默認值。
--cache :使用cache選項可以預先分配一組序列號,並將其保存在內存。當用完緩存中的所有序列號時,Oracle將
生成另一組數值,並將其保留在緩存中。
--nocache :使用nocache選項,則不會為加快訪問速度而預先分配序列號。如果在創建序列時忽略了cache和
nocache選項,Oracle將默認緩存20個序列號。
例: create sequence myseq
start with 10 --從10開始
increment by 1 --間隔1
maxvalue 2000 --最大值2000
nocycle
cache 30; --緩存30個序列號
訪問序列:
nextval:創建序列后第一次使用nextval時,將返回該序列的初始值。以后將使用incrememt by 子句來增加序
列值,並返回這個新值。
currval:返回序列的當前值,即最后一次用nextval時返回的值。當序列是新建的,沒有用過。則查詢會報錯
例: insert into toys(toyid,toyname,toyprice)
values (myseq.nextval,’TWENTY’,25);
select myseq.currval from dual;
更改序列:
alter sequence 命令用於修改序列的定義。如果執行下列操作,則會修改序列:
設置或刪除minvalue或maxvalue;
修改增量值;
修緩存中序列號的數目;
語法:
alter sequence [schema.]sequence_name
[increment by integer]
[maxvalue integer|nomaxvalue]
[minvalu integer|nominvalue]
[cycle|nocycle]
[cache integer|nocache];
-- 不能修改序列的start with參數。注意最小值應小於最大值。
刪除序列:
drop sequence [schema.]sequence_name;
如:drop sequence myseq;
sys_guid函數生成32位的唯一編碼,可以用來作為主鍵值。它源自不需要對數據庫進行訪問的時間戳和機器標識符。
select sys_guid() from dual;//每次都是不一樣的
--在一個並行的環境里或者希望避免使用序列的情況下,才選擇sys_guid來設置主鍵值。
同義詞
用途:
(1)簡化SQL語句。
(2)隱藏對象的名稱和所有者。
(3)為分布式數據庫的遠程對象提供了位置透明性。
(4)提供對對象的公共訪問。
分類:
1)私有同義詞,只能被當前模式的用戶訪問。私有同義詞名稱不可與當前模式的對象名稱相同,要在當前模式下創建私有同義詞,用戶必須擁有create synonym系統權限。如果在其他用戶模式下創建私有同義詞,必須擁有
create any synonym系統權限。
語法: create [or replace] synonym [schema.]synonym_name
for [schema.]object_name;
--or replace: 表示在同義詞存在的情況下替換該同義詞。
--object_name: 指定要為之創建同義詞的對象名稱。
例: create sysnonym sy_emp for a_hr.employee;--創建同義詞
select * from sy_emp; --訪問同義詞
2)公有同義詞,可被所有的數據庫用戶訪問。公有同義詞可以隱藏數據庫對象的所有者和名稱,並降低SQL語句的復雜性。創建它用戶必須有create public synonym系統權限。
語法: create [or replace] public synonym synonym_name
for [schema.]object_name;
例: --在A_hr模式下創建公有同義詞public_sy_emp作為A_hr用戶employee表的別名
create public synonym public_sy_emp for employee;
--在A_oe模式下訪問公有同義詞
select * form public_sy_emp;
注:使用同義詞前,要獲得同義詞對應對象的訪問權限。
對與私有同義詞不能同名; 對象和公有同義詞同名時,數據庫優先選擇對象作為目標,私有同義詞和公有同義詞同
名時,數據庫優先選擇私有同義詞作為目標。
刪除同義詞:要刪除同義詞,用戶必須擁有相應的權限。
drop [public] synonym [schema.]synonym_name;
例:drop synonym A_oe.sy_emp;--刪除私有同義詞
drop public synonym A_hr.public_sy_emp;--刪除公有同義詞
此命令只會刪除同義詞,不會刪除對應的對象。
索引
索引是與表關聯的可選結構,是一種快速訪問數據的途徑,可提高數據庫性能。當索引鍵作為查詢條件時,該索引將直接
指向包含這些值的得的位置。
一個列只能創建一種索引。
索引分類表
| 物理分類 |
邏輯分類 |
| 分區或非分區索引 |
單列或組合索引 |
| B樹索引(標准索引) |
唯一或非唯一索引 |
| 政常或反向鍵索引 |
基於函數索引 |
| 位圖索引 |
|
1.B樹索引,通常也稱為標准索引。索引的頂部為根,其中包含揭向索引其中包含指向索引中下一級的項。
語法: create [unique] index index_name on table_name(column_list)
[tablespace tablespace_name];
--unique: 用於指定唯一索引,默認情況下為非唯一索引。
--index_name: 索引名稱
--table_name: 表示為之創建索引的表名。
--column_list: 在其上創建索引的列名的列表,可以基於多列創建索引,列之間用逗號分割。
--tablespace_naem: 為索引指定表空間。
2.唯一索引和非唯一索引
唯一索引:定義索引的列中任何兩行者沒有重復值。唯一索引中的索引關鍵字只能指向表中的一行。在創建主鍵統束和創建唯一約束時者會創建一個與之對應的唯一索引。
非唯一索引:單個關鍵字可以有多個與其關聯的行。
例:create unique index index_unique_grade on salgrade(grade);
3.反向鍵索引,與常規B樹索引相反,反向鍵索引在保存列順序的同時反轉索引列的字節。反向鍵索引通過反轉索引鍵的數據值來實現。優點:對於連續增長的索引列,反轉索引列,可以將索引數據分散在多個索引塊間,減少I/O瓶頸的發生。
反向鍵索引通常建立在一此值連續增長的列上,如系統生成的員工編號,但不能執行范圍搜索。
例:create index index_reverse_empno on employee(empno) reverse;
4.位圖索引,優點在於它最適合低基數列(即該列的值是有限的,理論上不會是無窮大)。
優點:
1)對於大批即時查詢,可以減少響應時間。
2)相比其他索引技術,點用空間明顯減少。
3)即使在配置很低的終端硬件上,也能獲得顯著的性能。
例:create bitmap index index_bit_job on employee(job);
5.其他索引
組合索引:在表內多列上創建。索引中的列不必與表的中碰釘子順序一致,也不必相互鄰接,最多包含32列。
創建組合索引時,應將唯一性高的列放在第一位。
基於函數的索引:若使用的函數或表達式涉及正在建立索引的表中的一列或多列,則創建基於函數的索引。可以將基於函數的索引列創建為B樹或位圖索引。
例:--在員工employee表中,為員工名稱ename列創建大寫函數索引
create index index_ename on employee(upper(ename));
創建索引原則:
1)頻繁搜索的列可以作為索引。
2)經常排序、分組的列。
3)經常用作連接的列(主鍵/外鍵)。
4)將索引放在一個單獨的表空間中,不要放在有回退段、臨時段和表的表空間中。
5)對大型索引而言,考慮使用nologging子句創建大型索引。
6)根據業務發生的頻率,定期重新生成或重新組織索引,並進行碎片整理。
7)僅包含幾個不同值的列不可以創建為B樹索引,根據需要創建位圖索引。
8)不要在僅包含幾行的表中創建索引。
刪除索引
1)使用drop index語句用於刪除索引
drop index index_bit_job;--在Oracle中索引名在用戶賬戶中是唯一的,刪除時不需要指定表名。
2)何時應刪除索引:
(1)應用程序不再需要索引。
(2)執行批量加載前刪除索引。大量加載數據前刪除索引,加載后再重建索引有以下好處:①提高加載性能;
②更有效地使用索引空間。
(3)索引國損壞。
重建索引
1.alter index....rebuild 語句用於重建索引
alter index index_reverse_empno rebuild noreverse;
2.何時應重建索引
(1)用戶表被移動到新的表空間后,表上的索引不是自動轉移,需將索引移到揭定表空間。
alter index index_name rebuild tablespace tablespace_name;
(2)索引中包含很多已刪除的項。對表進行頻繁刪除,造成索引空間浪費,可以重建索引。
(3)需將現有正常索引轉換成反向鍵索引。
表分區
Oracle允許用戶把一個表中的所有行分為幾個部分,並將這些部分存儲在不同的位置。被分區的表稱為分區表,分成的每一個部分稱為一個分區。
優點:
1)改善表的查詢性能,在對表進行分區后,用戶執行SQL查詢時可以只訪問表中的特定分區而非整個表。
2)表更容易管理,因為分區表的數據存儲在多個部分中,按分區加載和刪除數據比在表中加載和刪除更容易。
3)便於備份和恢復,可以獨立地備份和恢復每個分區。
4)提高數據安全性,將不同的分區分布在不同的磁盤,可以減小民有分區的數據同時損壞的可能性。
分區條件:
1)數據量大於2GB。
2)已有的和新添加的數據有明顯的界限划分。
3)要分區的表不能具有long和long raw數據類型的列。
分區表的分類:范圍分區、列表分區、散列分區、復合分區、間隔分區和、虛擬列分區等。
1.范圍分區(range)是應用范圍比較廣的表分區方式,它以列的值的范圍來做為分區的划分條件,將記錄存放到列值所在的range分區中。
可以在分區后加上(tablespace tablespace_name)來指定該分區在哪個表空間中。這樣可以提高查詢性能和安全性。
一般創建范圍分區時,都會將最后一個分區設置為maxvalue,使其他落入此分區。一旦需要某一數據時,可以利用拆分分區的技術將需要的從最后一個分區分離出去,單獨形成一個分區,如果沒有創建足夠大的分區,插入
的數據超出范圍就會報錯。如果插入的數據就是分區鍵上的值,則該數據落入下一分區。在按時間分區時,如果某些記錄暫時無法預測范圍,則可以創建maxvalue分區,所有不在指定范內的記錄都會被存儲到maxvalue所在的分區中。
例:
create table sales1 ( sales_id number, product_id varchar2(5), sales_date date not null, .... ) partition by range (sales_date) ( partition p1 values less than (to_date(‘2013-04-1’,’yyyy-mm-dd’)), partition p2 values less than (to_date(‘2013-07-1’,’yyyy-mm-dd’)), partition p3 values less than (to_date(‘2013-10-1’,’yyyy-mm-dd’)), partition p4 values less than (to_date(‘2014-01-1’,’yyyy-mm-dd’)), partition p5 values less than (maxvalue) );
--查看第三季度的數據:select * from sales1 partition(p3);
--刪除第三季度的數據:delete from sales1 partition(p3);
2.間隔分區(Interval)是Oracle 11g版本新引入的分區方法,是范圍分區的一種增強功能,可以實現范圍分區的自
動化。優點為,在不需要創建表時就將所有分區划分清楚。間隔分區隨着數據的增加合划分更多的分區,並自動自
動創建新的分區。
例: --創建間隔分區表
create table sales2 ( sales_id number, product_id varchar2(5), sales_date date not null, .... ) partition by range(sales_date) interval(numtoyminterval(3,’MONTH’)) (partition p1 values less than (to_date(‘2013-05-1’,’yyyy/mm/dd’)));
--插入數據
insert into sales2 values (1,’a’,to_date(‘2013-08-1’),’1’);
--獲得分區情況
select table_name,parttion_name
from user_tab_partitions
where table_name=uppper(‘sales2’);
--查詢輸出結果,系統自動根據輸入數據情況創建新分區“SYS_P82”
TABLE_NAME PARTITION_NAME
------------------------------
SALES2 P1
SALES2 SYS_P82
--查詢分區數據
select * from sales2 partition(sys_p82);
1)只需創建第一個開始分區。
2)interval(numtoyminterval(3,’MONTH’))語句中,interval代表“間隔”,即按照后面括號中的定義間隔添加分區。
3)numtoyminterval(3,’MONTH’)表示每3個月為一個分區。
numtoyminterval(n, ‘interval_unit’)函數用於將n轉換成interval_unit所指定的值。
interval_unit的值可以為YEAR或MONTH。
與該類型相關的函數還有numtodsinterval(n, ‘interval_unit’),用於將n轉換成interval_unit所指
定的值。這里的interval_unit的值可以設為DAY,HOUR,MINUTE,SECOND。但不支持YEAR和MONTH
4)系統會根據自動創建分區。
經驗:可以利用間隔分區將開始創建時沒有分區的表創建為新的間隔分區表。代碼如下:
create table sales3 partition by range(sales_date) interval(numtoyminterval(3,’MONTH’)) partition p1 values less than (to_date(‘2013-04-1’,’yyyy/mm/dd’))) as select * from sales; --sales表為已經創建的表
3.列表分區 列的值可以枚舉的
如:
create table sales( sid number, sarea varchar2(10), total number ) partition by list (sarea)( partition part1 values('北京') tablespace space1, partition part2 values('上海') tablespace space2, partition part3 values('廣東') tablespace space3 );
4.散列分區,服務器自動給每一行給一個hash值,然后自動分區。只需要指定有哪些分區就可以了
create table employee( empno number, ename varchar2(10) ) partition by hash(ename)( artition part1 tablespace space1, partition part2 tablespace space2, partition part3 tablespace space3 ); select * from employee partition (part1); select * from employee partition (part2); select * from employee partition (part3);
