sql 索引 index之oracle篇

2021-10-01 03:22:45 字數 2689 閱讀 2349

今天嘗試一下,以面試官的視角來說說索引。

面試官:看你做過一段時間的資料庫維護,簡單介紹下索引吧?

你:索引是為表服務的一種資料結構,預設是b-tree(balance tree, 平衡樹)。它可以幫助提高查詢速度,但是會占用額外的磁碟空間。

面試官: 你剛剛說的那個b-tree介紹一下?

你: b-tree規定如果樹有m階,葉子節點可以有m個節點,至少有m/2個子節點,根節點除外,它至少得有兩個子節點。

面試官:那它和二叉樹相比是如何提高效率的?

你:一次查詢就相當於一次二分查詢,因為是m叉樹,而不是二叉樹,所以可以減少了同等資料量,查詢時經過的子節點數,而且規定必須至少有m/2個子節點,一定程度上保證了葉子節點的利用率。所以節省了訪問的時間。

面試官: 可以,你剛說索引占用了額外的磁碟空間,怎麼計算它占用了多少磁碟呢?

你: 哦,oracle把資料庫做了邏輯劃分,最大的是tablespace,它包含n個segment,segment包含n個extent,extent包含n個block,這個block就是磁碟上的資料塊,不過oracle會按自己的格式重新格式化磁碟的資料塊。在dba的表裡有一張dba_segments表。

-- 可以利用它來計算索引的大小。

select round(sum (bytes)/1024/1024/1024, 2) || ' gb' as index_size

from dba_segments

where segment_type= 'index' and segment_name = 'pm_project_pk';

-- 還可以計算表的大小。

select round(sum (bytes)/1024/1024/1024, 2) || ' gb' as table_size

from dba_segments

where segment_type= 'table' and segment_name = 'pm_project';

面試官:行,那要是索引占用的空間太大,想給它做分割槽,你會怎麼做?

你:索引是用來服務表的,所以索引分割槽應該是基於表的分割槽的來做,索引分割槽一般選擇做成本地索引,可以由資料庫自己維護,全域性索引不能和表的分割槽結構匹配,最多只能做個範圍分割槽。

分割槽的話先準備tablespace,然後建立表時按tablespace分割槽,索引也是一樣,按tablespace分割槽,就是表和索引要放在同乙個表空間裡。分割槽關鍵字就是partition。

create tablespace tbs_1 datafile '/path/tbs1.dat' size 10m

extent management local autoallocate;

-- 同上 tbs_2, tbs_3

create table pm_project (

id number(18),

name varchar2(256),

partition by range(id) (

partition d1 values less than (5300000) tablspace tbs_1,

partition d2 values less than (5600000) tablspace tbs_2,

partition d3 values less than (maxvalue) tablspace tbs_3

));create index pm_project_ind on pm_project (id)

local

( partition d1 tablspace tbs_1,

partition d2 tablspace tbs_2,

partition d3 tablspace tbs_3

);

最後通過檢視 dba_ind_partitions 檢視索引分割槽資訊。

面試官:可以可以,除了普通的索引,我們經常要用到函式,但是有時會導致索引失效,特別是在使用使用者自定義函式的時候。你會怎麼解決這個問題?

你:oracle提供基於函式的索引,所以直接為使用函式的列建立基於函式的索引就行了。

面試官:那如何檢視乙個表是否有基於函式的索引呢?

你: 首先我利用檢視dba_indexes去查下這個表的索引,並且配合index_type=function-based normal關鍵字找出。然後從檢視dba_ind_columns, dba_ind_expressions分別找出列和函式的表示式。

select * from dba_indexes

where table_name = 'pm_project' and index_type = 'function-based normal';

-- ix_pm_project_activity

select *

from dba_ind_columns

where index_name = 'ix_pm_project_activity';

-- sys_nc00031$

select *

from dba_ind_expressions

where index_name = 'ix_pm_project_activity';

-- column_expression upper(to_char("project_activity_date",'dd-mon-rrrr'))

面試官: 行,會去等通知吧。

Python Pandas之索引index相關函式

本文介紹對索引進行 重新排序reindex 以及 更換索引set index 時的用法,需要注意的是索引物件是無法進行修改的。重新索引 reindex 重新索引不是給索引重新命名,而是對索引重新排序,如果某個索引值不存在則引入缺失值。reindex函式引數型別 使用說明 index 用於索引的新序列...

Oracle筆記 之 索引 index

1.索引分類 a 唯一索引,作用是資料約束,保證資料唯一,還有就是資料索引,提高查詢效率 b 一般索引,只有資料索引的作用,2.唯一索引的建立 create unique index 索引名 on 表名 欄位名 ok,假設有乙個emploeyy表,裡面有乙個empname欄位,我們來為empname...

InfluxDB 倒排索引之Index檔案

本文主要講解influxdb中的倒排索引,influxdb和傳統的lsm tree hbase使用的模型 不一樣的地方是其內部中多了乙個倒排索引,這也是讓influxdb查詢較快的秘訣。在1.7的 版本中,influxdb提供了兩種型別的倒排索引,記憶體和磁碟的,之前只有記憶體版本的,但是隨著資料的...