oracle 索引个数限制,oracle索引详解
索引對于Oracle學習來說,非常重要,在數據量巨大的狀況下,使用恰到好處的索引,將會使得數據查詢時間大大減少。
1、索引的創建語法:
CREATE UNIUQE | BITMAP INDEX .
ON .
( | ASC | DESC,
| ASC | DESC,...)
TABLESPACE
STORAGE
LOGGING | NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS | COMPRESS
NOSORT | REVERSE
PARTITION | GLOBAL PARTITION
相關說明
1)UNIQUE | BITMAP:指定UNIQUE為唯一值索引。BITMAP為位圖索引,省略為B-Tree索引。
2) | ASC | DESC:能夠對多列進行聯合索引,當為expression時即“基于函數的索引”
3)TABLESPACE:指定存放索引的表空間(索引和原表不在一個表空間時效率更高)
4)STORAGE:可進一步設置表空間的存儲參數
5)LOGGING | NOLOGGING:是否對索引產生重做日志(對大表盡量使用NOLOGGING來降低占用空間并提高效率)
6)COMPUTE STATISTICS:創建新索引時收集統計信息
7)NOCOMPRESS | COMPRESS:是否使用“鍵壓縮”(使用鍵壓縮能夠刪除一個鍵列中出現的反復值)
8)NOSORT | REVERSE:NOSORT表示與表中同樣的順序創建索引。REVERSE表示相反順序存儲索引值
9)PARTITION | NOPARTITION:能夠在分區表和未分區表上對創建的索引進行分區
2、索引特點:
第一,通過創建唯一性索引,能夠保證數據庫表中每一行數據的唯一性。
第二。能夠大大加快數據的檢索速度。這也是創建索引的最基本的原因。
第三。能夠加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
第四。在使用分組和排序子句進行數據檢索時。相同能夠顯著降低查詢中分組和排序的時間。
第五,通過使用索引。能夠在查詢的過程中,使用優化隱藏器。提高系統的性能。
3、索引不足:
第一,創建索引和維護索引要耗費時間,這樣的時間隨著數據量的添加而添加。
第二,索引須要占物理空間。除了數據表占數據空間之外,每個索引還要占一定的物理空間,假設要建立聚簇索引。那么須要的空間就會更大。
第三。當對表中的數據進行添加、刪除和改動的時候。索引也要動態的維護。這樣就減少了數據的維護速度。
4.限制索引
限制索引是一些沒有經驗的開發者常常犯的錯誤之中的一個。在SQL中有非常多陷阱會使一些索引無法使用。以下討論一些常見的問題:
4.1? 使用不等于操作符(<>、!=)
以下的查詢即使在cust_rating列有一個索引,查詢語句仍然運行一次全表掃描。
select cust_Id,cust_name from customers where? cust_rating <> 'aa';
把上面的語句改成例如以下的查詢語句,這樣。在採用基于規則的優化器而不是基于代價的優化器(更智能)時,將會使用索引。
select cust_Id,cust_name from customers where cust_rating < 'aa' or cust_rating > 'aa';
特別注意:通過把不等于操作符改成OR條件,就能夠使用索引。以避免全表掃描。
4.2 使用IS NULL 或IS NOT NULL
使用IS NULL 或IS NOT NULL相同會限制索引的使用。由于NULL值并沒有被定義。
在SQL語句中使用NULL會有非常多的麻煩。
因此建議開發者在建表時,把須要索引的列設成NOT NULL。
假設被索引的列在某些行中存在NULL值。就不會使用這個索引
(除非索引是一個位圖索引。關于位圖索引在稍后在具體討論)。
4.3 使用函數
假設不使用基于函數的索引,那么在SQL語句的WHERE子句中對存在索引的列使用函數時。會使優化器忽略掉這些索引。
以下的查詢不會使用索引(僅僅要它不是基于函數的索引)
select empno,ename,deptno from emp? where? trunc(hiredate)='01-MAY-81';
把上面的語句改成以下的語句,這樣就能夠通過索引進行查找。
select empno,ename,deptno from emp where? hiredate
4.4 比較不匹配的數據類型
也是比較難于發現的性能問題之中的一個。 注意以下查詢的樣例,account_number是一個VARCHAR2類型,在account_number字段上有索引。
以下的語句將運行全表掃描:
select bank_name,address,city,state,zip from banks where account_number = 990354;
Oracle能夠自己主動把where子句變成to_number(account_number)=990354,這樣就限制了索引的使用,改成以下的查詢就能夠使用索引:
select bank_name,address,city,state,zip from banks where account_number ='990354';
特別注意:不匹配的數據類型之間比較會讓Oracle自己主動限制索引的使用,即便對這個查詢運行Explain Plan也不能讓您明確為什么做了一次“全表掃描”
5、查詢索引
查詢DBA_INDEXES視圖可得到表中全部索引的列表。注意僅僅能通過USER_INDEXES的方法來檢索模式(schema)的索引。
訪問USER_IND_COLUMNS視圖可得到一個給定表中被索引的特定列。
6、組合索引
當某個索引包括有多個已索引的列時,稱這個索引為組合(concatented)索引
7、索引的類型
B-樹索引、位圖索引、HASH索引、索引編排表 、反轉鍵索引、基于函數的索引、分區索引、本地和全局索引
7.1? B樹索引(默認類型)
B-tree 特點:
適合與大量的增、刪、改(OLTP)
不能用包括OR操作符的查詢。
適合高基數的列(唯一值多)
典型的樹狀結構;
每一個結點都是數據塊;
大多都是物理上一層、兩層或三層不定,邏輯上三層。
葉子塊數據是排序的,從左向右遞增。
在分支塊和根塊中放的是索引的范圍。
注:B*Tree索引在檢索高基數數據列(高基數數據列是指該列有非常多不同的值)時提供了最好的性能。
當取出的行數占總行數比例較小時B-Tree索引比全表檢索提供了更有效的方法。
但當檢查的范圍超過表的10%時就不能提高取回數據的性能。
7.2? 位圖索引
Bitmap 特點:
適合與決策支持系統;
做UPDATE代價很高。
很適合OR操作符的查詢;
基數比較少的時候才干建位圖索引;
注:位圖索引最好用于低cardinality列(即列的唯一值除以行數為一個非常小的值。接近零),
比如又一個“性別”列,列值有“Male”,“Female”,“Null”等3種。但一共同擁有300萬條記錄,那么3/3000000約等于0,這樣的情況下最適合用位圖索引
7.3? 函數索引
能夠在表中創建基于函數的索引。假設沒有基于函數的索引,不論什么在列上運行了函數的查詢都不能使用這個列的索引。
必須設置下面兩個系統參數:
QUERY_REWRITE_ENABLED=TRUE
QUERY_REWRITE_INTEGRITY=TRUSTED
總結
以上是生活随笔為你收集整理的oracle 索引个数限制,oracle索引详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pdfjs 字体新增_JSPDF支持中文
- 下一篇: ISO 22301 业务连续性管理(BC