真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

oracle怎么用索引,oracle索引怎么建立

如何使用oracle中的索引

方法如下: Oracle中建立索引,會(huì)提高查詢速度: create index 索引名 on 表名(列名); 例如: create index index_userid on tbl_detail(userid); 如何找數(shù)據(jù)庫(kù)表的主鍵字段的名稱? SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' a...

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括巧家網(wǎng)站建設(shè)、巧家網(wǎng)站制作、巧家網(wǎng)頁(yè)制作以及巧家網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,巧家網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到巧家省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

oracle的索引是怎么使用的?

索引就像書的目錄一樣,是為了方便查詢的。一般在數(shù)據(jù)表記錄很多的時(shí)候建立索引,oracle的索引有哈希索引和聚簇索引

oracle怎么通過(guò)索引查詢數(shù)據(jù)語(yǔ)句

oracle對(duì)于數(shù)據(jù)庫(kù)中的表信息,存儲(chǔ)在系統(tǒng)表中。查詢已創(chuàng)建好的表索引,可通過(guò)相應(yīng)的sql語(yǔ)句到相應(yīng)的表中進(jìn)行快捷的查詢:\x0d\x0a1. 根據(jù)表名,查詢一張表的索引\x0d\x0a\x0d\x0aselect * from user_indexes where table_name=upper('表名');\x0d\x0a\x0d\x0a2. 根據(jù)索引號(hào),查詢表索引字段\x0d\x0a\x0d\x0aselect * from user_ind_columns where index_name=('索引名');\x0d\x0a\x0d\x0a3.根據(jù)索引名,查詢創(chuàng)建索引的語(yǔ)句\x0d\x0a\x0d\x0aselect dbms_metadata.get_ddl('INDEX','索引名', ['用戶名']) from dual ; --['用戶名']可省,默認(rèn)為登錄用戶\x0d\x0a\x0d\x0aPS:dbms_metadata.get_ddl還可以得到建表語(yǔ)句,如:\x0d\x0a\x0d\x0aSELECT DBMS_METADATA.GET_DDL('TABLE','表名', ['用戶名']) FROM DUAL ; //取單個(gè)表的建表語(yǔ)句,['用戶名']可不輸入,默認(rèn)為登錄用戶\x0d\x0aSELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u; //取用戶下所有表的建表語(yǔ)句\x0d\x0a\x0d\x0a當(dāng)然,也可以用pl/sql developer工具來(lái)查看相關(guān)的表的各種信息。

Oracle數(shù)據(jù)訪問(wèn)和索引的使用

· 通過(guò)全表掃描的方式訪問(wèn)數(shù)據(jù);

· 通過(guò)ROWID訪問(wèn)數(shù)據(jù);

· 通過(guò)索引的方式訪問(wèn)數(shù)據(jù);

· Oracle順序讀取表中所有的行,并逐條匹配WHERE限定條件。

· 采用多塊讀的方式進(jìn)行全表掃描,可以有效提高系統(tǒng)的吞吐量,降低I/O次數(shù)。

· 即使創(chuàng)建索引,Oracle也會(huì)根據(jù)CBO的計(jì)算結(jié)果,決定是否使用索引。

注意事項(xiàng):

· 只有全表掃描時(shí)才可以使用多塊讀。該方式下,單個(gè)數(shù)據(jù)塊僅訪問(wèn)一次。

· 對(duì)于數(shù)據(jù)量較大的表,不建議使用全表掃描進(jìn)行訪問(wèn)。

· 當(dāng)訪問(wèn)表中的數(shù)據(jù)量超過(guò)數(shù)據(jù)總量的5%—10%時(shí),通常Oracle會(huì)采用全表掃描的方式進(jìn)行訪問(wèn)。

· 并行查詢可能會(huì)導(dǎo)致優(yōu)化器選擇全表掃描的方式。1.2ROWID訪問(wèn)表

· Rowid是數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中的物理地址,能夠唯一標(biāo)識(shí)表中的一條數(shù)據(jù)。

· Rowid指出了一條記錄所在的數(shù)據(jù)文件、塊號(hào)以及行號(hào)的位置,因此通過(guò)ROWID定位單行數(shù)據(jù)是最快的方法。

注意事項(xiàng):

· Rowid作為一個(gè)偽列,其數(shù)值并不存儲(chǔ)在數(shù)據(jù)庫(kù)中,當(dāng)查詢時(shí)才進(jìn)行計(jì)算。

· Rowid除了在同一集簇中可能不唯一外,每條記錄的Rowid唯一。1.3 INDEX訪問(wèn)表

· 通過(guò)索引查找相應(yīng)數(shù)據(jù)行的Rowid,再根據(jù)Rowid查找表中實(shí)際數(shù)據(jù)的方式稱為“索引查找”或者“索引掃描”。

· 一個(gè)Rowid對(duì)應(yīng)一條數(shù)據(jù)行(根據(jù)Rowid查找結(jié)果,僅需要對(duì)Rowid相應(yīng)數(shù)據(jù)的數(shù)據(jù)塊進(jìn)行一次I/O操作),因此該方式屬于“單塊讀”。

· 對(duì)于索引,除了存儲(chǔ)索引的數(shù)據(jù)外,還保存有該數(shù)據(jù)對(duì)應(yīng)的Rowid信息。

· 索引掃描分為兩步:1)掃描索引確定相應(yīng)的Rowid信息。 2)根據(jù)Rowid從表中獲得對(duì)應(yīng)的數(shù)據(jù)。

注意事項(xiàng):

· 對(duì)于選擇性高的數(shù)據(jù)行,索引的使用會(huì)提升查詢的性能。但對(duì)于DML操作,尤其是批量數(shù)據(jù)的操作,可能會(huì)導(dǎo)致性能的降低。

· 全表掃描的效率不一定比索引掃描差,關(guān)鍵看數(shù)據(jù)在數(shù)據(jù)塊上的具體分布。

索引是關(guān)系數(shù)據(jù)庫(kù)中用于存放每一條記錄的一種對(duì)象,主要目的是加快數(shù)據(jù)的讀取速度和完整性檢查。建立索引是一項(xiàng)技術(shù)性要求高的工作。一般在數(shù)據(jù)庫(kù)設(shè)計(jì)階段的與數(shù)據(jù)庫(kù)結(jié)構(gòu)一道考慮。應(yīng)用系統(tǒng)的性能直接與索引的合理直接有關(guān)。

(1) 單列索引

單列索引是基于單個(gè)列所建立的索引。

(2) 復(fù)合索引

復(fù)合索引是基于兩列或是多列的索引,在同一張表上可以有多個(gè)索引,但是要求列的組合必須不同。

(1) 重命名索引

(2) 合并索引

(表使用一段時(shí)間后在索引中會(huì)產(chǎn)生碎片,此時(shí)索引效率會(huì)降低,可以選擇重建索引或者合并索引,合并索引方式更好些,無(wú)需額外存儲(chǔ)空間,代價(jià)較低)

(3) 重建索引

方式一:刪除原來(lái)的索引,重新建立索引

當(dāng)不需要時(shí)可以將索引刪除以釋放出硬盤空間。命令如下:

例如:

注:當(dāng)表結(jié)構(gòu)被刪除時(shí),有其相關(guān)的所有索引也隨之被刪除。

方式二: Alter index 索引名稱 rebuild;

· 通過(guò)創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。

· 索引可以大大加快數(shù)據(jù)的檢索速度,這是創(chuàng)建索引的最主要的原因。

· 可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。

· 在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間。

· 通過(guò)使用索引,可以在查詢的過(guò)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。

· 索引的層次不要超過(guò)4層。

· 創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。

· 除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)更大。

· 當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。

· 更新數(shù)據(jù)的時(shí)候,系統(tǒng)必須要有額外的時(shí)間來(lái)同時(shí)對(duì)索引進(jìn)行更新,以維持?jǐn)?shù)據(jù)和索引的一致性。

1) 不恰當(dāng)?shù)乃饕坏谑聼o(wú)補(bǔ),反而會(huì)降低系統(tǒng)性能。因?yàn)榇罅康乃饕谶M(jìn)行插入、修改和刪除操作時(shí)比沒有索引花費(fèi)更多的系統(tǒng)時(shí)間。

1) 應(yīng)該建索引的列

· 在經(jīng)常需要搜索的列上,可以加快搜索的速度;

· 在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);

· 在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;

· 在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的;

· 在經(jīng)常需要排序的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時(shí)間;

· 在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。

2) 不應(yīng)該建索引的列

· 在大表上建立索引才有意義,小表無(wú)意義。

· 對(duì)于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引。

· 對(duì)于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引。比如性別,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,。增加索引,并不能明顯加快檢索速度。

· 對(duì)于那些定義為blob數(shù)據(jù)類型的列不應(yīng)該增加索引。這是因?yàn)?,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少。

· 當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。

一個(gè)表中有幾百萬(wàn)條數(shù)據(jù),對(duì)某個(gè)字段加了索引,但是查詢時(shí)性能并沒有什么提高,這主要可能是oracle的索引限制造成的。Oracle的索引有一些索引限制,在這些索引限制發(fā)生的情況下,即使已經(jīng)加了索引,oracle還是會(huì)執(zhí)行一次全表掃描,查詢的性能不會(huì)比不加索引有所提高,反而可能由于數(shù)據(jù)庫(kù)維護(hù)索引的系統(tǒng)開銷造成性能更差。

下面的查詢即使在djlx列有索引,查詢語(yǔ)句仍然執(zhí)行一次全表掃描。

把上面的語(yǔ)句改成如下的查詢語(yǔ)句,這樣,在采用基于規(guī)則的優(yōu)化器而不是基于代價(jià)的優(yōu)化器(更智能)時(shí),將會(huì)使用索引。

特別注意:通過(guò)把不等于操作符改成OR條件,就可以使用索引,避免全表掃描。

使用IS NULL或IS NOT NULL同樣會(huì)限制索引的使用。因此在建表時(shí),把需要索引的列設(shè)成NOT NULL。如果被索引的列在某些行中存在NULL值,就不會(huì)使用這個(gè)索引(除非索引是一個(gè)位圖索引)。

如果不使用基于函數(shù)的索引,那么在SQL語(yǔ)句的WHERE子句中對(duì)存在索引的列使用函數(shù)時(shí),會(huì)使優(yōu)化器忽略掉這些索引。 下面的查詢不會(huì)使用索引(只要它不是基于函數(shù)的索引)

也是比較難于發(fā)現(xiàn)的性能問(wèn)題之一。比如:bdcs_qlr_xz中的zjh是NVARCHAR2類型,在zjh字段上有索引。如果使用下面的語(yǔ)句將執(zhí)行全表掃描。

因?yàn)镺racle會(huì)自動(dòng)把查詢語(yǔ)句改為

特別注意:不匹配的數(shù)據(jù)類型之間比較會(huì)讓Oracle自動(dòng)限制索引的使用,即便對(duì)這個(gè)查詢執(zhí)行Explain Plan也不能讓您明白為什么做了一次“全表掃描”。

(1) 索引無(wú)效

(2) 索引有效

請(qǐng)教:oracle中索引應(yīng)用

一.索引介紹

1.1 索引的創(chuàng)建語(yǔ)法:

CREATE UNIUQE | BITMAP INDEX schema.index_name

ON schema.table_name

(column_name | expression ASC | DESC,

column_name | expression ASC | DESC,...)

TABLESPACE tablespace_name

STORAGE storage_settings

LOGGING | NOLOGGING

COMPUTE STATISTICS

NOCOMPRESS | COMPRESSnn

NOSORT | REVERSE

PARTITION | GLOBAL PARTITIONpartition_setting

相關(guān)說(shuō)明

1) UNIQUE | BITMAP:指定UNIQUE為唯一值索引,BITMAP為位圖索引,省略為B-Tree索引。

2)column_name | expression ASC | DESC:可以對(duì)多列進(jìn)行聯(lián)合索引,當(dāng)為expression時(shí)即“基于函數(shù)的索引”

3)TABLESPACE:指定存放索引的表空間(索引和原表不在一個(gè)表空間時(shí)效率更高)

4)STORAGE:可進(jìn)一步設(shè)置表空間的存儲(chǔ)參數(shù)

5)LOGGING | NOLOGGING:是否對(duì)索引產(chǎn)生重做日志(對(duì)大表盡量使用NOLOGGING來(lái)減少占用空間并提高效率)

6)COMPUTE STATISTICS:創(chuàng)建新索引時(shí)收集統(tǒng)計(jì)信息

7)NOCOMPRESS | COMPRESSnn:是否使用“鍵壓縮”(使用鍵壓縮可以刪除一個(gè)鍵列中出現(xiàn)的重復(fù)值)

8)NOSORT | REVERSE:NOSORT表示與表中相同的順序創(chuàng)建索引,REVERSE表示相反順序存儲(chǔ)索引值

9)PARTITION | NOPARTITION:可以在分區(qū)表和未分區(qū)表上對(duì)創(chuàng)建的索引進(jìn)行分區(qū)

1.2 索引特點(diǎn):

第一,通過(guò)創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。

第二,可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。

第三,可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。

第四,在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間。

第五,通過(guò)使用索引,可以在查詢的過(guò)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。

1.3 索引不足:

第一,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。

第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)更大。

第三,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。

1.4 應(yīng)該建索引列的特點(diǎn):

1)在經(jīng)常需要搜索的列上,可以加快搜索的速度;

2)在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);

3)在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;

4)在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的;

5)在經(jīng)常需要排序的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時(shí)間;

6)在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。

1.5 不應(yīng)該建索引列的特點(diǎn):

第一,對(duì)于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引。這是因?yàn)?,既然這些列很少使用到,因此有索引或者無(wú)索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統(tǒng)的維護(hù)速度和增大了空間需求。

第二,對(duì)于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引。這是因?yàn)?,由于這些列的取值很少,例如人事表的性別列,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索速度。

第三,對(duì)于那些定義為blob數(shù)據(jù)類型的列不應(yīng)該增加索引。這是因?yàn)?,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少。

第四,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。這是因?yàn)椋薷男阅芎蜋z索性能是互相矛盾的。當(dāng)增加索引時(shí),會(huì)提高檢索性能,但是會(huì)降低修改性能。當(dāng)減少索引時(shí),會(huì)提高修改性能,降低檢索性能。因此,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。

1.6 限制索引

限制索引是一些沒有經(jīng)驗(yàn)的開發(fā)人員經(jīng)常犯的錯(cuò)誤之一。在SQL中有很多陷阱會(huì)使一些索引無(wú)法使用。下面討論一些常見的問(wèn)題:

1.6.1 使用不等于操作符(、!=)

下面的查詢即使在cust_rating列有一個(gè)索引,查詢語(yǔ)句仍然執(zhí)行一次全表掃描。

select cust_Id,cust_name from customers where cust_rating 'aa';

把上面的語(yǔ)句改成如下的查詢語(yǔ)句,這樣,在采用基于規(guī)則的優(yōu)化器而不是基于代價(jià)的優(yōu)化器(更智能)時(shí),將會(huì)使用索引。

select cust_Id,cust_name from customers where cust_rating 'aa' or cust_rating 'aa';

特別注意:通過(guò)把不等于操作符改成OR條件,就可以使用索引,以避免全表掃描。

1.6.2 使用IS NULL 或IS NOT NULL

使用IS NULL 或IS NOT NULL同樣會(huì)限制索引的使用。因?yàn)镹ULL值并沒有被定義。在SQL語(yǔ)句中使用NULL會(huì)有很多的麻煩。因此建議開發(fā)人員在建表時(shí),把需要索引的列設(shè)成 NOT NULL。如果被索引的列在某些行中存在NULL值,就不會(huì)使用這個(gè)索引(除非索引是一個(gè)位圖索引,關(guān)于位圖索引在稍后在詳細(xì)討論)。

1.6.3 使用函數(shù)

如果不使用基于函數(shù)的索引,那么在SQL語(yǔ)句的WHERE子句中對(duì)存在索引的列使用函數(shù)時(shí),會(huì)使優(yōu)化器忽略掉這些索引。 下面的查詢不會(huì)使用索引(只要它不是基于函數(shù)的索引)

select empno,ename,deptno from emp where trunc(hiredate)='01-MAY-81';

把上面的語(yǔ)句改成下面的語(yǔ)句,這樣就可以通過(guò)索引進(jìn)行查找。

select empno,ename,deptno from emp where hiredate(to_date('01-MAY-81')+0.9999);

1.6.4 比較不匹配的數(shù)據(jù)類型

也是比較難于發(fā)現(xiàn)的性能問(wèn)題之一。 注意下面查詢的例子,account_number是一個(gè)VARCHAR2類型,在account_number字段上有索引。

下面的語(yǔ)句將執(zhí)行全表掃描:

select bank_name,address,city,state,zip from banks where account_number = 990354;

Oracle可以自動(dòng)把where子句變成to_number(account_number)=990354,這樣就限制了索引的使用,改成下面的查詢就可以使用索引:

select bank_name,address,city,state,zip from banks where account_number ='990354';

特別注意:不匹配的數(shù)據(jù)類型之間比較會(huì)讓Oracle自動(dòng)限制索引的使用,即便對(duì)這個(gè)查詢執(zhí)行Explain Plan也不能讓您明白為什么做了一次“全表掃描”。

1.7 查詢索引

查詢DBA_INDEXES視圖可得到表中所有索引的列表,注意只能通過(guò)USER_INDEXES的方法來(lái)檢索模式(schema)的索引。訪問(wèn)USER_IND_COLUMNS視圖可得到一個(gè)給定表中被索引的特定列。

1.8 組合索引

當(dāng)某個(gè)索引包含有多個(gè)已索引的列時(shí),稱這個(gè)索引為組合(concatented)索引。在 Oracle9i引入跳躍式掃描的索引訪問(wèn)方法之前,查詢只能在有限條件下使用該索引。比如:表emp有一個(gè)組合索引鍵,該索引包含了empno、 ename和deptno。在Oracle9i之前除非在where之句中對(duì)第一列(empno)指定一個(gè)值,否則就不能使用這個(gè)索引鍵進(jìn)行一次范圍掃描。

特別注意:在Oracle9i之前,只有在使用到索引的前導(dǎo)索引時(shí)才可以使用組合索引!

1.9 ORACLE ROWID

通過(guò)每個(gè)行的ROWID,索引Oracle提供了訪問(wèn)單行數(shù)據(jù)的能力。ROWID其實(shí)就是直接指向單獨(dú)行的線路圖。如果想檢查重復(fù)值或是其他對(duì)ROWID本身的引用,可以在任何表中使用和指定rowid列。


文章名稱:oracle怎么用索引,oracle索引怎么建立
路徑分享:http://weahome.cn/article/phpdcc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部