oracle 数据库模式对象,索引,序列,同义词,查看用户拥有的表,聚簇,数据库链接
數(shù)據(jù)庫模式對(duì)象:
Oracle數(shù)據(jù)庫的索引
索引(INDEX)是為了加快數(shù)據(jù)的查找而創(chuàng)建的數(shù)據(jù)庫對(duì)象,特別是對(duì)大表,索引可以有效地提高查找速度,也可以保證數(shù)據(jù)的惟一性。索引是由Oracle自動(dòng)使用和維護(hù)的,一旦創(chuàng)建成功,用戶不必對(duì)索引進(jìn)行直接的操作。索引是獨(dú)立于表的數(shù)據(jù)庫結(jié)構(gòu),即表和索引是分開存放的,當(dāng)刪除索引時(shí),對(duì)擁有索引的表的數(shù)據(jù)沒有影響。
在創(chuàng)建PRIMARY KEY和UNIQUE約束條件時(shí),系統(tǒng)將自動(dòng)為相應(yīng)的列創(chuàng)建惟一(UNIQUE)索引。索引的名字同約束的名字一致。
索引有兩種:B*樹索引和位圖(BITMAP)索引。
B*樹索引是通常使用的索引,也是默認(rèn)的索引類型。在這里主要討論B*樹索引。B*樹是一種平衡2叉樹,左右的查找路徑一樣。這種方法保證了對(duì)表的任何值的查找時(shí)間都相同。
B*樹索引可分為:惟一索引、非惟一索引、一列簡(jiǎn)單索引和多列復(fù)合索引。
創(chuàng)建索引一般要掌握以下原則:只有較大的表才有必要建立索引,表的記錄應(yīng)該大于50條,查詢數(shù)據(jù)小于總行數(shù)的2%~4%。雖然可以為表創(chuàng)建多個(gè)索引,但是無助于查詢的索引不但不會(huì)提高效率,還會(huì)增加系統(tǒng)開銷。因?yàn)楫?dāng)執(zhí)行DML操作時(shí),索引也要跟著更新,這時(shí)索引可能會(huì)降低系統(tǒng)的性能。一般在主鍵列或經(jīng)常出現(xiàn)在WHERE子句或連接條件中的列建立索引,該列稱為索引關(guān)鍵字。
索引的創(chuàng)建
創(chuàng)建索引不需要特定的系統(tǒng)權(quán)限。建立索引的語法如下:
CREATE [{UNIQUE|BITMAP}] INDEX 索引名 ON 表名(列名1[,列名2,...]);
其中:
UNIQUE代表創(chuàng)建惟一索引,不指明為創(chuàng)建非惟一索引。
BITMAP 代表創(chuàng)建位圖索引,如果不指明該參數(shù),則創(chuàng)建B*樹索引。
列名是創(chuàng)建索引的關(guān)鍵字列,可以是一列或多列。
刪除索引的語法是:
DROP INDEX 索引名;
刪除索引的人應(yīng)該是索引的創(chuàng)建者或擁有DROP ANY INDEX系統(tǒng)權(quán)限的用戶。索引的刪除對(duì)表沒有影響。
創(chuàng)建和刪除索引。
步驟1:創(chuàng)建索引:
執(zhí)行結(jié)果:
索引已創(chuàng)建。
步驟2:查詢中引用索引:
步驟3:刪除索引:
執(zhí)行結(jié)果:
索引已丟棄。
說明:本例創(chuàng)建的是B*樹非惟一簡(jiǎn)單索引。索引關(guān)鍵字列是ENAME。在步驟2中,因?yàn)閃HERE條件中出現(xiàn)了索引關(guān)鍵字,所以查詢中索引會(huì)被自動(dòng)引用,但是由于行數(shù)很少,因此不會(huì)感覺到查詢速度的差別。
創(chuàng)建復(fù)合索引。
步驟1:創(chuàng)建復(fù)合索引:
執(zhí)行結(jié)果:
索引已創(chuàng)建。
步驟2:查詢中引用索引:
說明:在本例中創(chuàng)建的是包含兩列的復(fù)合索引。JOB是主鍵,SAL是次鍵。WHERE條件中引用了JOB和SAL,而且是按照索引關(guān)鍵字出現(xiàn)的順序引用的,所以在查詢中,索引會(huì)被引用。
如下的查詢也會(huì)引用索引:
但以下查詢不會(huì)引用索引,因?yàn)闆]有先引用索引關(guān)鍵字的主鍵:
查看索引
通過查詢數(shù)據(jù)字典USER_INDEXES可以檢查創(chuàng)建的索引。
通過查詢數(shù)據(jù)字典USER_IND_COLUMNS可以檢查索引的列。
顯示emp表的索引:
執(zhí)行結(jié)果:
說明:由本訓(xùn)練可見,emp表共有兩個(gè)索引,其中EMP_JOBSAL是剛剛創(chuàng)建的,屬于非惟一索引。PK_EMP為生成主鍵時(shí)系統(tǒng)創(chuàng)建的索引,屬于惟一索引。
顯示索引的列。
執(zhí)行結(jié)果:
說明:該查詢顯示出索引“EMP_JOBSAL”擁有兩列:JOB和SAL。
序列的創(chuàng)建
序列(SEQUENCE)是序列號(hào)生成器,可以為表中的行自動(dòng)生成序列號(hào),產(chǎn)生一組等間隔的數(shù)值(類型為數(shù)字)。其主要的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當(dāng)前值,或使序列增至下一個(gè)值。
創(chuàng)建序列需要CREATE SEQUENCE系統(tǒng)權(quán)限。序列的創(chuàng)建語法如下:
CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n|NOMAXVALUE}]
[{MINVALUE n|NOMINVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHE n|NOCACHE}];
其中:
INCREMENT BY 用于定義序列的步長,如果省略,則默認(rèn)為1,如果出現(xiàn)負(fù)值,則代表序列的值是按照此步長遞減的。
START WITH 定義序列的初始值(即產(chǎn)生的第一個(gè)值),默認(rèn)為1。
MAXVALUE 定義序列生成器能產(chǎn)生的最大值。選項(xiàng)NOMAXVALUE是默認(rèn)選項(xiàng),代表沒有最大值定義,這時(shí)對(duì)于遞增序列,系統(tǒng)能夠產(chǎn)生的最大值是10的27次方;對(duì)于遞減序列,最大值是-1。
MINVALUE定義序列生成器能產(chǎn)生的最小值。選項(xiàng)NOMAXVALUE是默認(rèn)選項(xiàng),代表沒有最小值定義,這時(shí)對(duì)于遞減序列,系統(tǒng)能夠產(chǎn)生的最小值是?10的26次方;對(duì)于遞增序列,最小值是1。
CYCLE和NOCYCLE 表示當(dāng)序列生成器的值達(dá)到限制值后是否循環(huán)。CYCLE代表循環(huán),NOCYCLE代表不循環(huán)。如果循環(huán),則當(dāng)遞增序列達(dá)到最大值時(shí),循環(huán)到最小值;對(duì)于遞減序列達(dá)到最小值時(shí),循環(huán)到最大值。如果不循環(huán),達(dá)到限制值后,繼續(xù)產(chǎn)生新值就會(huì)發(fā)生錯(cuò)誤。
CACHE(緩沖)定義存放序列的內(nèi)存塊的大小,默認(rèn)為20。NOCACHE表示不對(duì)序列進(jìn)行內(nèi)存緩沖。對(duì)序列進(jìn)行內(nèi)存緩沖,可以改善序列的性能。
刪除序列的語法是:
DROP SEQUENCE 序列名;
刪除序列的人應(yīng)該是序列的創(chuàng)建者或擁有DROP ANY SEQUENCE系統(tǒng)權(quán)限的用戶。序列一旦刪除就不能被引用了。
序列的某些部分也可以在使用中進(jìn)行修改,但不能修改SATRT WITH選項(xiàng)。對(duì)序列的修改只影響隨后產(chǎn)生的序號(hào),已經(jīng)產(chǎn)生的序號(hào)不變。修改序列的語法如下:
ALTER SEQUENCE 序列名
[INCREMENT BY n]
[{MAXVALUE n|NOMAXVALUE}]
[{MINVALUE n|NOMINVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHE n|NOCACHE}];
創(chuàng)建和刪除序列。
步驟1:創(chuàng)建序列:
執(zhí)行結(jié)果:
序列已創(chuàng)建。
步驟2:刪除序列:
執(zhí)行結(jié)果:
序列已丟棄。
說明:以上創(chuàng)建的序列名為ABC,是遞增序列,增量為1,初始值為10。該序列不循環(huán),不使用內(nèi)存。沒有定義最小值,默認(rèn)最小值為1,最大值為9 999 999。
序列的使用
如果已經(jīng)創(chuàng)建了序列,怎樣才能引用序列呢?方法是使用CURRVAL和NEXTVAL來引用序列的值。
調(diào)用NEXTVAL將生成序列中的下一個(gè)序列號(hào),調(diào)用時(shí)要指出序列名,即用以下方式調(diào)用:
序列名.NEXTVAL
CURRVAL用于產(chǎn)生序列的當(dāng)前值,無論調(diào)用多少次都不會(huì)產(chǎn)生序列的下一個(gè)值。如果序列還沒有通過調(diào)用NEXTVAL產(chǎn)生過序列的下一個(gè)值,先引用CURRVAL沒有意義。調(diào)用CURRVAL的方法同上,要指出序列名,即用以下方式調(diào)用:
序列名.CURRVAL.
產(chǎn)生序列的值。
步驟1:產(chǎn)生序列的第一個(gè)值:
執(zhí)行結(jié)果:
?
步驟2:產(chǎn)生序列的下一個(gè)值:
執(zhí)行結(jié)果:
?
步驟3:產(chǎn)生序列的當(dāng)前值:
執(zhí)行結(jié)果:
?
說明:第一次調(diào)用NEXTVAL產(chǎn)生序列的初始值,根據(jù)定義知道初始值為10。第二次調(diào)用產(chǎn)生11,因?yàn)樾蛄械牟介L為1。調(diào)用CURRVAL,顯示當(dāng)前值11,不產(chǎn)生新值。
序列的應(yīng)用:產(chǎn)生圖書序列號(hào)。
步驟1:創(chuàng)建序列:
執(zhí)行結(jié)果:
序列已創(chuàng)建。
步驟2:使用序列生成新的圖書編號(hào):
執(zhí)行結(jié)果:
Sql代碼
A0001 計(jì)算機(jī)原理?????? 01 劉勇???? 5?????? 25.3
A0002? C語言程序設(shè)計(jì)? 02 馬麗??? 1????? 18.75
A0003 匯編語言程序設(shè)計(jì)? 02 黃海明??? 15????? 20.18
A0005 軟件工程?????? 01 馮娟?????? 5????? 27.3
A0010 多媒體制作??? 01 高建????? 3????? 28
A0011 網(wǎng)頁制作精選? 01 劉瑩???? 4????? 26.5
說明:根據(jù)序列定義可知,序列產(chǎn)生的初始值為10,函數(shù)TO_CHAR將數(shù)字10轉(zhuǎn)換為字符。格式字符串“fm0000”表示轉(zhuǎn)換為4位的字符串,空位用0填充。fm表示去掉轉(zhuǎn)換結(jié)果的空格。故10將被轉(zhuǎn)換成為字符串“0010”。連接運(yùn)算后的圖書編號(hào)為“A0010”。第二次調(diào)用則產(chǎn)生“A0011”,以此類推。
注意:通過查詢看到插入的序號(hào)是連續(xù)的,但如果在插入的過程中使用了回退或發(fā)生了系統(tǒng)崩潰等情況,可能會(huì)產(chǎn)生序號(hào)的間隔。
查看序列
同過數(shù)據(jù)字典USER_OBJECTS可以查看用戶擁有的序列。
通過數(shù)據(jù)字典USER_SEQUENCES可以查看序列的設(shè)置。
【訓(xùn)練1】? 查看用戶的序列:
SELECT SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY,LAST_NUMBER FROM
USER_SEQUENCES;
執(zhí)行結(jié)果:
? 說明:當(dāng)前用戶擁有兩個(gè)序列:ABC和BOOKID。
同義詞:
模式對(duì)象的同義詞
?? 同義詞(SYNONYM)是為模式對(duì)象起的別名,可以為表、視圖、序列、過程、函數(shù)和包等數(shù)據(jù)庫模式對(duì)象創(chuàng)建同義詞。同義詞有兩種:公有同義詞和私有同義詞。公有同義詞是對(duì)所有用戶都可用的。創(chuàng)建公有同義詞必須擁有系統(tǒng)權(quán)限CREATE PUBLIC SYNONYM;創(chuàng)建私有同義詞需要CREATE SYNONYM系統(tǒng)權(quán)限。私有同義詞只對(duì)擁有同義詞的賬戶有效,但私有同義詞也可以通過授權(quán),使其對(duì)其他用戶有效。同義詞通過給本地或遠(yuǎn)程對(duì)象分配一個(gè)通用或簡(jiǎn)單的名稱,隱藏了對(duì)象的擁有者和對(duì)象的真實(shí)名稱,也簡(jiǎn)化了SQL語句。
如果同義詞同對(duì)象名稱重名,私有同義詞又同公有同義詞重名,那么,識(shí)別的順序是怎樣的呢?如果存在對(duì)象名,則優(yōu)先識(shí)別,其次識(shí)別私有同義詞,最后識(shí)別公有同義詞。比如,執(zhí)行以下的SELECT語句:
SELECT * FROM ABC;
如果存在表ABC,就對(duì)表ABC執(zhí)行查詢語句;如果不存在表ABC,就去查看是否有私有同義詞ABC,如果有就對(duì)ABC執(zhí)行查詢(此時(shí)ABC是另外一個(gè)表的同義詞);如果沒有私有同義詞ABC,則去查找公有同義詞;如果找不到,則查詢失敗。
同義詞的創(chuàng)建和使用
同義詞的創(chuàng)建語法如下:
CREATE [PUBLIC] SYNONYM 同義詞名
FOR [模式名.]對(duì)象名[@數(shù)據(jù)庫鏈路名];
其中:
PUBLIC代表創(chuàng)建公有同義詞,若省略則代表創(chuàng)建私有同義詞。
模式名代表擁有對(duì)象的模式賬戶名。
數(shù)據(jù)庫鏈路名是指向遠(yuǎn)程對(duì)象的數(shù)據(jù)庫鏈接。
刪除同義詞的語法如下
DROP SYNONYM 同義詞名;
刪除同義詞的人必須是同義詞的擁有者或有DROP ANY SYNONYM權(quán)限的人。刪除同義詞不會(huì)刪除對(duì)應(yīng)的對(duì)象。
創(chuàng)建同義詞
步驟1:創(chuàng)建私有同義詞:
執(zhí)行結(jié)果:
同義詞已創(chuàng)建。
步驟2:創(chuàng)建公有同義詞(先要獲得創(chuàng)建公有同義詞的權(quán)限):
執(zhí)行結(jié)果:
同義詞已創(chuàng)建。
步驟3:使用同義詞:
執(zhí)行結(jié)果:
? 說明:對(duì)“BOOK”的查詢等效于對(duì)“圖書”的查詢。如果同義詞只是用戶自己使用,則對(duì)象名前的模式名可以省略,如步驟1。如果是為其他用戶使用,則必須添加模式名,如步驟2。
同義詞的查看
通過查詢數(shù)據(jù)字典USER_OBJECTS和USER_SYNONYMS,可以查看同義詞信息。?
查看用戶擁有的同義詞:
執(zhí)行結(jié)果:
系統(tǒng)定義同義詞
系統(tǒng)為常用的對(duì)象預(yù)定義了一些同義詞,利用它們可以方便地訪問用戶的常用對(duì)象。這些同義詞如下所示。
查看用戶擁有的表:
聚簇
所謂聚簇(CLUSTER),形象地說,就是生長在一起的表。聚簇包含一張或多張表,表的公共列被稱為聚簇關(guān)鍵字,在公共列上具有同一值的列物理上存儲(chǔ)在一起。那么在什么情況下需要?jiǎng)?chuàng)建聚簇呢?通常在多個(gè)表有共同的列時(shí),應(yīng)使用聚簇。比如有一張學(xué)生基本情況表,其中包含學(xué)生的學(xué)號(hào)、姓名、性別、住址等信息。另外,還設(shè)計(jì)了一張學(xué)生成績表,其中除了包含學(xué)生成績,也包含學(xué)生的學(xué)號(hào)、姓名、性別。那么這兩張表共同的列就可以創(chuàng)建成聚簇。這樣兩張表的共同的學(xué)號(hào)、姓名和性別,就存放在了一起,相同的值只存放一次。如果兩個(gè)表通過聚簇列進(jìn)行聯(lián)合,則會(huì)大大提高查詢的速度,但對(duì)于插入等操作則會(huì)降低效率。
創(chuàng)建聚簇后,要?jiǎng)?chuàng)建使用聚簇的表,對(duì)聚簇還應(yīng)該建立索引。如果不對(duì)聚簇建立索引,則不能對(duì)聚簇表進(jìn)行插入、修改和刪除操作。
創(chuàng)建聚簇需要CREATE CLUSTER系統(tǒng)權(quán)限。創(chuàng)建聚簇的語法如下:
CREATE CLUSTER 聚簇名(列名1 [,列名2]...)
SIZE n
TABLESPACE 表空間名;
列名是構(gòu)成聚簇關(guān)鍵字的列集合。
SIZE 指明存儲(chǔ)所有含有相同聚簇關(guān)鍵字的行的平均存儲(chǔ)空間數(shù)(聚簇邏輯塊的大小)。
TABLESPACE定義聚簇使用的表空間。
刪除聚簇使用如下語法:
DROP CLUSTER 聚簇名 [INCLUDING TABLES [CASCADE CONSTRAINTS]];
其中:
INCLUDING TABLES表示一同刪除聚簇表。如果不指明此選項(xiàng),則必須手工刪除聚簇表后才能刪除聚簇本身。
CASCADE CONSTRAINTS表示刪除聚簇表時(shí),一起刪除同其他表之間的約束關(guān)系。
創(chuàng)建和使用聚簇。
步驟1:創(chuàng)建聚簇:
執(zhí)行結(jié)果:
已創(chuàng)建數(shù)據(jù)簇。
步驟2:創(chuàng)建第一張聚簇表:
執(zhí)行結(jié)果:
表已創(chuàng)建。
步驟3:創(chuàng)建第二張聚簇表:
執(zhí)行結(jié)果:
表已創(chuàng)建。
步驟4:為聚簇創(chuàng)建索引:
步驟5:向表中插入數(shù)據(jù):
執(zhí)行結(jié)果:略。
步驟6:刪除聚簇及聚簇表:
執(zhí)行結(jié)果:
數(shù)據(jù)簇已丟棄。
說明:在本例的兩個(gè)表中,為其三個(gè)共同列STUNO、STUNAME和SEX創(chuàng)建了聚簇,在創(chuàng)建表時(shí)說明了使用的聚簇,創(chuàng)建聚簇后為其創(chuàng)建了索引,然后插入了一些數(shù)據(jù)。
數(shù)據(jù)庫鏈接
數(shù)據(jù)庫鏈接(DATABASE LINK)是在分布式環(huán)境下,為了訪問遠(yuǎn)程數(shù)據(jù)庫而創(chuàng)建的數(shù)據(jù)通信鏈路。數(shù)據(jù)庫鏈接隱藏了對(duì)遠(yuǎn)程數(shù)據(jù)庫訪問的復(fù)雜性。通常,我們把正在登錄的數(shù)據(jù)庫稱為本地?cái)?shù)據(jù)庫,另外的一個(gè)數(shù)據(jù)庫稱為遠(yuǎn)程數(shù)據(jù)庫。有了數(shù)據(jù)庫鏈接,可以直接通過數(shù)據(jù)庫鏈接來訪問遠(yuǎn)程數(shù)據(jù)庫的表。常見的形式是訪問遠(yuǎn)程數(shù)據(jù)庫固定用戶的鏈接,即鏈接到指定的用戶,創(chuàng)建這種形式的數(shù)據(jù)庫鏈接的語句如下:
CREATE DATABASE LINK 鏈接名 CONNECT TO 賬戶 IDENTIFIED BY 口令
USING 服務(wù)名;
創(chuàng)建數(shù)據(jù)庫鏈接,需要CREATE DATABASE LINK系統(tǒng)權(quán)限。
數(shù)據(jù)庫鏈接一旦建立并測(cè)試成功,就可以使用以下形式來訪問遠(yuǎn)程用戶的表。
表名@數(shù)據(jù)庫鏈接名
在局域網(wǎng)上創(chuàng)建和使用數(shù)據(jù)庫鏈接。
步驟1:創(chuàng)建遠(yuǎn)程數(shù)據(jù)庫的服務(wù)名,假定局域網(wǎng)上另一個(gè)數(shù)據(jù)庫服務(wù)名為MYDB_REMOTE。
步驟2:登錄本地?cái)?shù)據(jù)庫SCOTT賬戶,創(chuàng)建數(shù)據(jù)庫鏈接:
執(zhí)行結(jié)果為:
數(shù)據(jù)庫鏈接已創(chuàng)建。
步驟3:查詢遠(yuǎn)程數(shù)據(jù)庫的數(shù)據(jù):
結(jié)果略。
步驟4:一個(gè)分布查詢:
結(jié)果略。
說明:在本例中,遠(yuǎn)程數(shù)據(jù)庫服務(wù)名是MYDB_REMOTE,創(chuàng)建的數(shù)據(jù)庫鏈接名稱是abc.emp@abc表示遠(yuǎn)程數(shù)據(jù)庫的emp表。步驟4是一個(gè)聯(lián)合查詢,數(shù)據(jù)來自本地服務(wù)器的dept表和遠(yuǎn)程服務(wù)器的emp表。
總結(jié)
以上是生活随笔為你收集整理的oracle 数据库模式对象,索引,序列,同义词,查看用户拥有的表,聚簇,数据库链接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电话拨号器的实现
- 下一篇: 一个leader,要有角色认知