主頁 > 前端設計 > oracle索引簡單介紹及使用注意

oracle索引簡單介紹及使用注意

2020-10-06 03:20:18 前端設計

簡介

1.說明

  1)索引是資料庫物件之一,用于加快資料的檢索,類似于書籍的索引,在資料庫中索引可以減少資料庫程式查詢結果時需要讀取的資料量,類似于在書籍中我們利用索引可以不用翻閱整本書即可找到想要的資訊,

  2)索引是建立在表上的可選物件;索引的關鍵在于通過一組排序后的索引鍵來取代默認的全表掃描檢索方式,從而提高檢索效率

  3)索引在邏輯上和物理上都與相關的表和資料無關,當創建或者洗掉一個索引時,不會影響基本的表;

  4)索引一旦建立,在表上進行DML操作時(例如在執行插入、修改或者洗掉相關操作時),oracle會自動管理索引,索引洗掉,不會對表產生影響

  5)索引對用戶是透明的,無論表上是否有索引,sql陳述句的用法不變

  6)oracle創建主鍵時會自動在該列上創建索引

索引原理

1. 若沒有索引,搜索某個記錄時(例如查找name='wish')需要搜索所有的記錄,因為不能保證只有一個wish,必須全部搜索一遍

2. 若在name上建立索引,oracle會對全表進行一次搜索,將每條記錄的name值哪找升序排列,然后構建索引條目(name和rowid),存盤到索引段中,查詢name為wish時即可直接查找對應地方

3.創建了索引并不一定就會使用,oracle自動統計表的資訊后,決定是否使用索引,表中資料很少時使用全表掃描速度已經很快,沒有必要使用索引

索引使用(創建、修改、洗掉、查看)

1.創建索引語法

CREATE [UNIQUE] | [BITMAP] INDEX index_name  --unique表示唯一索引
ON table_name([column1 [ASC|DESC],column2    --bitmap,創建位圖索引
[ASC|DESC],…] | [express])
[TABLESPACE tablespace_name]
[PCTFREE n1]                                 --指定索引在資料塊中空閑空間
[STORAGE (INITIAL n2)]
[NOLOGGING]                                  --表示創建和重建索引時允許對表做DML操作,默認情況下不應該使用
[NOLINE]
[NOSORT];                                    --表示創建索引時不進行排序,默認不適用,如果資料已經是按照該索引順序排列的可以使用

2.修改索引

1)重命名索引

alter index index_sno rename to bitmap_index;

2) 合并索引(表使用一段時間后在索引中會產生碎片,此時索引效率會降低,可以選擇重建索引或者合并索引,合并索引方式更好些,無需額外存盤空間,代價較低)

alter index index_sno coalesce;

3)重建索引

  方式一:洗掉原來的索引,重新建立索引

  方式二:

alter index index_sno rebuild;

3.洗掉索引

drop index index_sno;

4.查看索引

select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';

 -- eg:    
create index index_sno on student('name');
select * from all_indexes where table_name='student';

索引分類

1. B樹索引(默認索引,保存講過排序過的索引列和對應的rowid值)

1)說明:

  1.oracle中最常用的索引;B樹索引就是一顆二叉樹;葉子節點(雙向鏈表)包含索引列和指向表中每個匹配行的ROWID值

  2.所有葉子節點具有相同的深度,因而不管查詢條件怎樣,查詢速度基本相同

  3.能夠適應精確查詢、模糊查詢和比較查詢

2)分類:

   UNIQUE,NON-UNIQUE(默認),REVERSE KEY(資料列中的資料是反向存盤的)

3)創建例子

craete index index_sno on student('sno');

4)適合使用場景:

  列基數(列不重復值的個數)大時適合使用B數索引

  

2. 位圖索引

1)說明:

  1.創建位圖索引時,oracle會掃描整張表,并為索引列的每個取值建立一個位圖(位圖中,對表中每一行使用一位(bit,0或者1)來標識該行是否包含該位圖的索引列的取值,如果為1,表示對應的rowid所在的記錄包含該位圖索引列值),最后通過位圖索引中的映射函式完成位到行的ROWID的轉換

2)創建例子

create bitmap index index_sno on student(sno);

3) 適合場景:

對于基數小的列適合簡歷位圖索引(例如性別等)

3.單列索引和復合索引(基于多個列創建)

1) 注意:

  即如果索引建立在多個列上,只有它的第一個列被where子句參考時,優化器才會使用該索引,即至少要包含組合索引的第一列,

在大多數情況下、復合索引比單欄位索引好,很多系統就是靠新建一些合適的復合索引、使效率大幅度提高
復合索引比單欄位索引復雜、有兩個原則需把握:前綴性和可選性,

2)前綴性、可選性

㈠ 前綴性(Prefixing)

在謂詞條件中、只有將復合索引的第一個欄位作為約束條件、該復合索引才會被用上
當然、存在一種例外:Index Skip Scan

這個原理強調使用

比如:

① 假如c1的選擇性比c2高很多、且如果有大量如下查詢:
select * from t where c1= :x and c2= :y;
select * from t where c2= :y;
這個時候(c2,c1)比(c1,c2)好

② 有ID和CREATE_TIME這兩個欄位、一個是主鍵、一個是創建時間
按一般情況、創建復合索引時、需要將ID放在前面、
不過、如果以CREATE_TIME為查詢條件的SQL比較多、而ID的使用比較少
那么、我們在設計時、應該把CREATE_TIME前綴


㈡ 可選性(Selectivity)

概念可見

Selectivity介紹

這個原理強調成本

比如:

① 選擇性強的欄位放在前面、可以減少 Index Range Scan 的掃描成本
② 有個稅務系統、原先的復合索引是(月份,稅務機關代號,納稅人識別號,發票代號,收費類別)
對于這個索引、優化器并沒有選擇走索引、而是全表掃、原因如下:
● 同一月份的記錄太多了、超過1/3、全表掃成本低
● 欄位順序沒有考慮可選性
新的復合索引是(納稅人識別號,月份,收費類別,稅務機關代號,發票代號)


㈢ 復合索引好處

① 盡可能讓一個索引為更多的SQL服務
② 復合索引是排序的、ORDER BY涉及索引欄位時、可減少排序成本


我認為呢、在為復合索引欄位排序時、應該綜合考慮權衡前綴性和可選性、絕不可偏袒任何一方

4. 函式索引

1)說明:

  1. 當經常要訪問一些函式或者運算式時,可以將其存盤在索引中,這樣下次訪問時,該值已經計算出來了,可以加快查詢速度

  2. 函式索引既可以使用B數索引,也可以使用位圖索引;當函式結果不確定時采用B樹索引,結果是固定的某幾個值時使用位圖索引

  3. 函式索引中可以水泥用len、trim、substr、upper(每行回傳獨立結果),不能使用如sum、max、min、avg等

2)例子:

create index fbi  on student (upper(name));
select * from student where upper(name) ='WISH';

索引建立原則總結

  1. 如果有兩個或者以上的索引,其中有一個唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引

  2. 至少要包含組合索引的第一列(即如果索引建立在多個列上,只有它的第一個列被where子句參考時,優化器才會使用該索引)

  3. 小表不要簡歷索引

  4. 對于基數大的列適合建立B樹索引,對于基數小的列適合簡歷位圖索引

  5. 列中有很多空值,但經常查詢該列上非空記錄時應該建立索引

  6. 經常進行連接查詢的列應該創建索引

  7. 使用create index時要將最常查詢的列放在最前面

  8. LONG(可變長字串資料,最長2G)和LONG RAW(可變長二進制資料,最長2G)列不能創建索引

  9.限制表中索引的數量(創建索引耗費時間,并且隨資料量的增大而增大;索引會占用物理空間;當對表中的資料進行增加、洗掉和修改的時候,索引也要動態的維護,降低了資料的維護速度)

注意事項

1. 通配符在搜索詞首出現時,oracle不能使用索引,eg:

--我們在name上創建索引;

create index index_name on student('name');

--下面的方式oracle不適用name索引

select * from student where name like '%wish%';

--如果通配符出現在字串的其他位置時,優化器能夠利用索引;如下:

select * from student where name like 'wish%';

2. 不要在索引列上使用not,可以采用其他方式代替如下:(oracle碰到not會停止使用索引,而采用全表掃描)

select * from student where not (score=100);

select * from student where score <> 100;

--替換為

select * from student where score>100 or score <100

3. 索引上使用空值比較將停止使用索引, eg:

select * from student where score is not null;

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/158586.html

標籤:其他

上一篇:LeetCode--620.有趣的電影

下一篇:資料庫_增刪改查復制表的簡單操作

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more