create index 索引名 on tbl_name (A1,B1).
成都創新互聯公司是一家專注于成都網站制作、網站設計與策劃設計,石拐網站建設哪家好?成都創新互聯公司做網站,專注于網站建設十年,網設計領域的專業建站公司;建站業務涵蓋:石拐等地區。石拐做網站價格咨詢:13518219792
創建索引的目的是為了在某些字段上查詢更快,而添加的一些預地址。
1.服務器及工具
數據庫服務器:2013年最新版本Oracle 12C。
應用服務器:Oracle Application Server。
開發工具:OracleJDeveloper,Oracle Designer,Oracle Developer,等等。
2.企業應用軟件
企業資源計劃(ERP)軟件。已有10年以上的歷史。2005年,并購了開發企業軟件的仁科軟件公司(PeopleSoft)以增強在這方面的競爭力。
客戶關系管理(CRM)軟件。自1998年開始研發這種軟件。2005年,并購了開發客戶關系管理軟件的希柏軟件公司(Siebel)。
3. Oracle職業發展力計劃(Oracle WDP)
Oracle WDP 全稱為Oracle Workforce Development Program,是Oracle (甲骨文)公司專門面向學生、個人、在職人員等群體開設的職業發展力課程。Oracle的技術廣泛應用于各行各業,其中電信、電力、金融、政府及大量制造業都需要Oracle技術人才,Oracle公司針對職業教育市場在全球推廣的項目,其以低廉的成本給這部分人群提供Oracle技術培訓,經過系統化的實訓,讓這部分人群能夠迅速掌握Oracle最新的核心技術,并能勝任企業大型數據庫管理、維護、開發工作。
在Oracle數據庫中 創建索引雖然比較簡單 但是要合理的創建索引則比較困難了 筆者認為 在創建索引時要做到三個適當 即在適當的表上 適當的列上創建適當數量的索引 雖然這可以通過一句話來概括優化的索引的基本準則 但是要做到這一點的話 需要數據庫管理員做出很大的努力 具體的來說 要做到這個三個適當有如下幾個要求
一 根據表的大小來創建索引
雖然給表創建索引 可以提高查詢的效率 但是數據庫管理員需要注意的是 索引也需要一定的開銷的 為此并不是說給所有的表都創建索引 那么就可以提高數據庫的性能 這個認識是錯誤的 恰恰相反 如果不管三七二十一 給所有的表都創建了索引 那么其反而會給數據庫的性能造成負面的影響 因為此時濫用索引的開銷可能已經遠遠大于由此帶來的性能方面的收益 所以筆者認為 數據庫管理員首先需要做到 為合適的表來建立索引 而不是為所有的表建立索引
一般來說 不需要為比較小的表創建索引 如在一個ERP系統的數據庫中 department表用來存儲企業部門的信息 一般企業的部分也就十幾個 最多不會超過一百個 這 條記錄對于人來說 可能算是比較多了 但是對于計算機來說 這給他塞塞牙縫都還不夠 所以 對類似的小表沒有必要建立索引 因為即使建立了索引 其性能也不會得到很大的改善 相反索引建立的開銷 如維護成本等等 要比這個要大 也就是說 付出的要比得到的多 顯然違反常理
另外 就是對于超大的表 也不一定要建立索引 有些表雖然比較大 記錄數量非常的多 但是此時為這個表建立索引并一定的合適 如系統中有一張表 其主要用來保存數據庫中的一些變更信息 往往這些信息只給數據庫管理員使用 此時為這張表建立索引的話 反而不合適 因為這張表很少用到 只有在出問題的時候才需要查看 其次其即使查看 需要查詢的紀錄也不會很多 可能就是最近一周的更新記錄等等 對于對于一些超大的表 建立索引有時候往往不能夠達到預計的效果 而且在打表上建立索引 其索引的開銷要比普通的表大的多 那么到底是否給大表建立索引呢?筆者認為 主要是看兩個方面的內容 首先是需要關注一下 在這張大表中經常需要查詢的記錄數量 一般來說 如果經常需要查詢的數據不超過 %到 %的話 那就沒有必要為其建立索引的必要 因為此時建立索引的開銷可能要比性能的改善大的多 這個比例只是一個經驗的數據 如果數據庫管理員需要得出一個比較精確的結論 那么就需要進行測試分析 即數據庫管理員需要測試一下全表掃描的時間 看看其是否比建立索引后的查詢時間要長或者短 如果是長的話 則說明有建立索引的必要 但是如果沒有的話 則說明還是全表掃描速度來的快 此時也就沒有必要建立索引了
總之 在考慮是否該為表建立索引時 一般來說小表沒有建立索引的必要 而對于打表的話 則需要進行實際情況實際分析 簡單一點的 可以根據大致的比率來確定 如果要精確一點的 則可以進行全表掃描性能分析 以判斷建立索引后是否真的如預期那樣改善了數據庫性能
二 根據列的特征來創建索引
列的特點不同 索引創建的效果也不同 數據庫管理員需要了解為哪些列創建索引可以起到事倍功半的效果 同時也需要了解為哪些列創建索引反而起到的是事倍功半的效果 這有利于他們了解到底給為怎么樣的字段建立索引
根據筆者的經驗 往往為如下特征的列創建索引能夠起到比較明顯的效果 如對于一些重復內容比較少的列 特別是對于那些定義了唯一約束的列 在這些列上建立索引 往往可以起到非常不錯的效果 如對于一些null值的列與非Null值的列混合情況下 如果用戶需要經常查詢所有的非Null值記錄的列 則最好為其設置索引 如果經常需要多表連接查詢 在用與連接的列上設置索引可以達到事半功倍的效果
可見 索引設置的是否恰當 不僅跟數據庫設計架構有關 而且還跟企業的經濟業務相關 為此 對于一些套裝軟件 雖然一開始數據庫管理員已經做了索引的優化工作 但是隨著后來經濟數據的增加 這個索引的效果會越來越打折扣 這主要是因為記錄的表化影響到了索引優化的效果 所以筆者建議各位數據庫管理員 即使采用的是大牌軟件公司的套裝軟件 也需要隔一段時間 如一年 對數據庫的索引進行優化 該去掉的去掉 該調整的調整 以提高數據庫的性能
如在數據庫中有一張表是用來保存用戶信息的 其中有個字段身份證號碼 這是一個唯一的字段 在數據庫設計時 給這個字段創建了索引 但是當這個數據庫投入使用之后 用戶不怎么輸入用戶的身份證號碼 而且平時也基本不按這個號碼來進行查詢 當記錄月來月多時 這個身份證號碼上的索引字段不但不能夠改善數據庫的查詢性能 反而成了雞肋 對于這些有很多NULL值的列 而且不會經常查詢所有的非NULL值記錄的列 數據庫管理員要下決心 即使清除這些列上的索引
所以說索引的優化與調整是一個動態的過程 并不是說數據庫設計好之后就不需要經過調整 數據庫管理員往往需要根據記錄的變化情況 來進行適當的變更 以提高索引的效果
三 在一個表上創建多少索引合適?
雖然說 在表上創建索引的數量沒有限制 但是決不是越多越好 也就是說 在創建索引這項事情上 + 〉 往往不成立 有時候 創建索引越多 其可能會得到適得其反的效果 那么在一個表上 到底給創建多少索引合適呢?這個沒有一個明確的標準 而是需要數據庫管理員根據實際的用途以及數據庫中記錄的情況 來進行判斷
通常來說 表的索引越多 其查詢的速度也就越快 但是 表的更新速度則會降低 這主要是因為表的更新(如往表中插入一條記錄)速度 反而隨著索引的增加而增加 這主要是因為 在更新記錄的同時需要更新相關的索引信息 為此 到底在表中創建多少索引合適 就需要在這個更新速度與查詢速度之間取得一個均衡點 如對于一些數據倉庫或者決策型數據庫系統 其主要用來進行查詢 相關的記錄往往是在數據庫初始化的時候倒入 此時 設置的索引多一點 可以提高數據庫的查詢性能 同時因為記錄不怎么更新 所以索引比較多的情況下 也不會影響到更新的速度 即使在起初的時候需要導入大量的數據 此時也可以先將索引禁用掉 等到數據導入完畢后 再啟用索引 可以通過這種方式來減少索引對數據更新的影響 相反 如果那些表中經常需要更新記錄 如一些事務型的應用系統 數據更新操作是家常便飯的事情 此時如果在一張表中建立過多的索引 則會影響到更新的速度 由于更新操作比較頻繁 所以對其的負面影響 要比查詢效率提升要大的多 此時就需要限制索引的數量 只在一些必要的字段上建立索引
筆者在平時數據庫優化時 往往會根據這些表的用途來為列設置索引 可以查詢相關的動態視圖 看看對于這張表的操作 是更新操作(包括更新 刪除 插入等等)占的比例大 還是查詢操作占的比例大 當過多的索引已經影響到更新操作的速度時 則數據庫管理員就需要先禁用某些索引 以提高數據庫的性能
lishixinzhi/Article/program/Oracle/201311/18407
· 通過全表掃描的方式訪問數據;
· 通過ROWID訪問數據;
· 通過索引的方式訪問數據;
· Oracle順序讀取表中所有的行,并逐條匹配WHERE限定條件。
· 采用多塊讀的方式進行全表掃描,可以有效提高系統的吞吐量,降低I/O次數。
· 即使創建索引,Oracle也會根據CBO的計算結果,決定是否使用索引。
注意事項:
· 只有全表掃描時才可以使用多塊讀。該方式下,單個數據塊僅訪問一次。
· 對于數據量較大的表,不建議使用全表掃描進行訪問。
· 當訪問表中的數據量超過數據總量的5%—10%時,通常Oracle會采用全表掃描的方式進行訪問。
· 并行查詢可能會導致優化器選擇全表掃描的方式。1.2ROWID訪問表
· Rowid是數據存放在數據庫中的物理地址,能夠唯一標識表中的一條數據。
· Rowid指出了一條記錄所在的數據文件、塊號以及行號的位置,因此通過ROWID定位單行數據是最快的方法。
注意事項:
· Rowid作為一個偽列,其數值并不存儲在數據庫中,當查詢時才進行計算。
· Rowid除了在同一集簇中可能不唯一外,每條記錄的Rowid唯一。1.3 INDEX訪問表
· 通過索引查找相應數據行的Rowid,再根據Rowid查找表中實際數據的方式稱為“索引查找”或者“索引掃描”。
· 一個Rowid對應一條數據行(根據Rowid查找結果,僅需要對Rowid相應數據的數據塊進行一次I/O操作),因此該方式屬于“單塊讀”。
· 對于索引,除了存儲索引的數據外,還保存有該數據對應的Rowid信息。
· 索引掃描分為兩步:1)掃描索引確定相應的Rowid信息。 2)根據Rowid從表中獲得對應的數據。
注意事項:
· 對于選擇性高的數據行,索引的使用會提升查詢的性能。但對于DML操作,尤其是批量數據的操作,可能會導致性能的降低。
· 全表掃描的效率不一定比索引掃描差,關鍵看數據在數據塊上的具體分布。
索引是關系數據庫中用于存放每一條記錄的一種對象,主要目的是加快數據的讀取速度和完整性檢查。建立索引是一項技術性要求高的工作。一般在數據庫設計階段的與數據庫結構一道考慮。應用系統的性能直接與索引的合理直接有關。
(1) 單列索引
單列索引是基于單個列所建立的索引。
(2) 復合索引
復合索引是基于兩列或是多列的索引,在同一張表上可以有多個索引,但是要求列的組合必須不同。
(1) 重命名索引
(2) 合并索引
(表使用一段時間后在索引中會產生碎片,此時索引效率會降低,可以選擇重建索引或者合并索引,合并索引方式更好些,無需額外存儲空間,代價較低)
(3) 重建索引
方式一:刪除原來的索引,重新建立索引
當不需要時可以將索引刪除以釋放出硬盤空間。命令如下:
例如:
注:當表結構被刪除時,有其相關的所有索引也隨之被刪除。
方式二: Alter index 索引名稱 rebuild;
· 通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
· 索引可以大大加快數據的檢索速度,這是創建索引的最主要的原因。
· 可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
· 在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
· 通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
· 索引的層次不要超過4層。
· 創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加。
· 除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
· 當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
· 更新數據的時候,系統必須要有額外的時間來同時對索引進行更新,以維持數據和索引的一致性。
1) 不恰當的索引不但于事無補,反而會降低系統性能。因為大量的索引在進行插入、修改和刪除操作時比沒有索引花費更多的系統時間。
1) 應該建索引的列
· 在經常需要搜索的列上,可以加快搜索的速度;
· 在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;
· 在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
· 在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的;
· 在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
· 在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。
2) 不應該建索引的列
· 在大表上建立索引才有意義,小表無意義。
· 對于那些在查詢中很少使用或者參考的列不應該創建索引。
· 對于那些只有很少數據值的列也不應該增加索引。比如性別,在查詢的結果中,結果集的數據行占了表中數據行的很大比例,。增加索引,并不能明顯加快檢索速度。
· 對于那些定義為blob數據類型的列不應該增加索引。這是因為,這些列的數據量要么相當大,要么取值很少。
· 當修改性能遠遠大于檢索性能時,不應該創建索引。
一個表中有幾百萬條數據,對某個字段加了索引,但是查詢時性能并沒有什么提高,這主要可能是oracle的索引限制造成的。Oracle的索引有一些索引限制,在這些索引限制發生的情況下,即使已經加了索引,oracle還是會執行一次全表掃描,查詢的性能不會比不加索引有所提高,反而可能由于數據庫維護索引的系統開銷造成性能更差。
下面的查詢即使在djlx列有索引,查詢語句仍然執行一次全表掃描。
把上面的語句改成如下的查詢語句,這樣,在采用基于規則的優化器而不是基于代價的優化器(更智能)時,將會使用索引。
特別注意:通過把不等于操作符改成OR條件,就可以使用索引,避免全表掃描。
使用IS NULL或IS NOT NULL同樣會限制索引的使用。因此在建表時,把需要索引的列設成NOT NULL。如果被索引的列在某些行中存在NULL值,就不會使用這個索引(除非索引是一個位圖索引)。
如果不使用基于函數的索引,那么在SQL語句的WHERE子句中對存在索引的列使用函數時,會使優化器忽略掉這些索引。 下面的查詢不會使用索引(只要它不是基于函數的索引)
也是比較難于發現的性能問題之一。比如:bdcs_qlr_xz中的zjh是NVARCHAR2類型,在zjh字段上有索引。如果使用下面的語句將執行全表掃描。
因為Oracle會自動把查詢語句改為
特別注意:不匹配的數據類型之間比較會讓Oracle自動限制索引的使用,即便對這個查詢執行Explain Plan也不能讓您明白為什么做了一次“全表掃描”。
(1) 索引無效
(2) 索引有效
本文標題:oracle如何設置索引 oracle怎么建索引
網站URL:http://m.kartarina.com/article42/hgjghc.html
成都網站建設公司_創新互聯,為您提供網站改版、營銷型網站建設、定制網站、定制開發、靜態網站、微信小程序
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯