Oracle數(shù)據(jù)庫索引查詢方式
一、索引基礎(chǔ)概念
??索引類型與適用場景??
??B樹索引??:最常用,適合高基數(shù)列(唯一值多)的等值或范圍查詢。
??位圖索引??:適用于低基數(shù)列(如性別、狀態(tài)),常用于數(shù)據(jù)倉庫。
??函數(shù)索引??:基于列的函數(shù)表達(dá)式創(chuàng)建(如UPPER(name)),優(yōu)化帶函數(shù)的查詢。
??復(fù)合索引??:多列組合,列順序至關(guān)重要(高選擇性列在前)。
??反向索引??:優(yōu)化模糊查詢(如LIKE ‘%abc’)。
?? 索引的優(yōu)缺點(diǎn)??
- 優(yōu)點(diǎn)??:加速數(shù)據(jù)檢索,減少磁盤I/O。
- 缺點(diǎn)??:占用存儲(chǔ)空間;降低DML操作(增刪改)效率;需定期維護(hù)。
二、索引查詢方法
1. ??查看索引元信息??
??表的所有索引??
SELECT index_name, index_type, uniqueness FROM dba_indexes WHERE table_name = 'EMPLOYEES';
??索引的列信息??
SELECT column_name, column_position FROM dba_ind_columns WHERE index_name = 'IDX_DEPT_FIRSTNAME';
索引所在的表信息分析
SELECT i.index_name, i.table_name, ic.column_name, ic.column_position FROM dba_indexes i JOIN dba_ind_columns ic ON i.index_name = ic.index_name WHERE i.index_name = 'IDX_NAME'; --按索引名稱條件查詢
2. ??分析索引使用情況??
??監(jiān)控索引使用頻率??
SELECT * FROM v$index_usage; -- 跟蹤索引是否被有效利用,需 12c 以上版本管理員權(quán)限
??檢查未使用索引??
SELECT index_name FROM dba_indexes WHERE index_name NOT IN (SELECT name FROM v$index_usage);
索引碎片與空間效率
-- 1.查詢當(dāng)前用戶創(chuàng)建的索引碎片率
SELECT index_name,
blevel,
leaf_blocks,
clustering_factor,
ROUND((leaf_blocks * 100) / NULLIF(clustering_factor, 0), 2) AS fragmentation_ratio
FROM (
SELECT di.index_name,
di.blevel,
di.leaf_blocks,
di.clustering_factor
FROM dba_indexes di
JOIN dba_tables dt ON di.table_name = dt.table_name
WHERE dt.owner = USER -- 只查詢當(dāng)前用戶創(chuàng)建的表
AND di.clustering_factor > 1
) t
WHERE (leaf_blocks * 100) / clustering_factor > 30; -- >30%表示需重建
-- 2.查詢 索引所在的表信息分析
SELECT i.index_name, i.table_name, ic.column_name, ic.column_position
FROM dba_indexes i
JOIN dba_ind_columns ic ON i.index_name = ic.index_name
WHERE i.index_name = 'IDX_NAME'; --按索引名稱條件查詢
--3.重建碎片化索引??
ALTER INDEX IDX_NAME REBUILD ONLINE; -- IDX_NAME 為索引名稱
3. ??執(zhí)行計(jì)劃分析??
EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 10; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
關(guān)鍵指標(biāo)??:
- INDEX RANGE SCAN:索引有效使用。
- FULL TABLE SCAN:可能缺失或未使用索引。
三、優(yōu)化索引空間的策略?
1. 創(chuàng)建索引
CREATE UNIQUE INDEX idx_user_name ON user_info(user_name) TABLESPACE idx_tbs COMPRESS NOLOGGING;
2. 重建碎片化索引??
ALTER INDEX IDX_OLD REBUILD ONLINE; -- 減少空間碎片,提升查詢效率
3. ??調(diào)整存儲(chǔ)參數(shù)??
ALTER INDEX IDX_LARGE PCTFREE 10; -- 降低空閑空間預(yù)留,壓縮索引體積
4. 刪除冗余索引??
DROP INDEX IDX_REDUNDANT; -- 通過監(jiān)控確認(rèn)使用率低的索引
5. ??啟用高級壓縮??(僅限企業(yè)版)
ALTER INDEX IDX_BIG COMPRESS ADVANCED LOW; -- 節(jié)省30-50%空間
四、關(guān)鍵監(jiān)控指標(biāo)??
| ?? | 指標(biāo)?? ?? | 查看方式?? ?? | 優(yōu)化閾值?? |
|---|---|---|---|
| ?? | 索引大小?? | dba_segments.bytes | >表空間的20%需優(yōu)化 |
| ?? | 碎片率?? | (leaf_blocks / clustering_factor) * 100 | >30%需重建 |
| ?? | 使用頻率?? | v$index_usage.user_reads | 近30天無讀操作可刪 |
| ?? | 分區(qū)均勻性?? | dba_index_partitions.bytes 的方差值 | 方差>50%需調(diào)整分區(qū) |
五、 查詢實(shí)踐案例
1. ??查詢 Oracle 表空間大小
-- 表空間使用率監(jiān)控(含自動(dòng)擴(kuò)展?fàn)顟B(tài))
SELECT
df.tablespace_name "Tablespace",
df.total_mb,
df.total_mb - fs.free_mb "Used_MB",
fs.free_mb "Free_MB",
ROUND((df.total_mb - fs.free_mb) / df.total_mb * 100, 2) Pct_Used, -- 使用率
autoext "AutoExt"
FROM
(SELECT tablespace_name,
SUM(bytes)/1024/1024 total_mb,
MAX(DECODE(autoextensible,'YES','Y','N')) autoext
FROM dba_data_files
GROUP BY tablespace_name) df
JOIN
(SELECT tablespace_name,
SUM(bytes)/1024/1024 free_mb
FROM dba_free_space
GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
WHERE ROUND((df.total_mb - fs.free_mb) / df.total_mb * 100, 2) > 80 -- 僅顯示>80%使用率的表空間
ORDER BY Pct_Used DESC;
結(jié)果示例:
| Tablespace | total_mb | Used_MB | Free_MB | Pct_Used | AutoExt |
|---|---|---|---|---|---|
| TBS_PICP | 3548 | 3309 | 239 | 93 | .26 |
| TBS_PICP_NEW | 4048 | 3523 | 525 | 87 | .03 |
2. 查詢 Oracle 索引使用情況
替換 PICP_FORMAL(表用戶) 和 T_USER_INFO(表名稱 需大寫)
-- 替換 PICP_FORMAL 和 T_USER_INFO(需大寫)
WITH table_info AS (
SELECT
t.owner,
t.table_name,
t.tablespace_name,
t.num_rows,
t.avg_row_len,
ROUND((t.num_rows * t.avg_row_len) / 1024 / 1024, 2) AS estimated_data_size_mb,
ROUND(SUM(s.bytes) / 1024 / 1024, 2) AS actual_table_size_mb
FROM dba_tables t
JOIN dba_segments s ON t.owner = s.owner AND t.table_name = s.segment_name
WHERE t.owner = 'PICP_FORMAL'
AND t.table_name = 'T_USER_INFO'
AND s.segment_type = 'TABLE'
GROUP BY t.owner, t.table_name, t.tablespace_name, t.num_rows, t.avg_row_len
),
index_info AS (
SELECT
i.index_name,
ROUND(s.bytes / 1024 / 1024, 2) AS index_size_mb,
i.uniqueness
FROM dba_indexes i
JOIN dba_segments s ON i.owner = s.owner AND i.index_name = s.segment_name
WHERE i.table_owner = 'PICP_FORMAL'
AND i.table_name = 'T_USER_INFO'
AND s.segment_type = 'INDEX'
)
SELECT
-- 表基本信息
ti.table_name,
ti.tablespace_name,
ti.num_rows,
ti.avg_row_len,
ti.estimated_data_size_mb,
ti.actual_table_size_mb,
-- 索引詳細(xì)信息
ii.index_name,
ii.index_size_mb,
ii.uniqueness,
-- 索引匯總信息
ROUND(SUM(ii.index_size_mb) OVER (), 2) AS total_index_size_mb,
ROUND((SUM(ii.index_size_mb) OVER () / ti.actual_table_size_mb) * 100, 2) AS index_to_table_ratio_percent
FROM table_info ti
LEFT JOIN index_info ii ON 1=1
ORDER BY ii.index_size_mb DESC NULLS LAST;
示例結(jié)果如下:
| TABLE_NAME | TABLESPACE_NAME | NUM_ROWS | AVG_ROW_LEN | ESTIMATED_DATA_SIZE_MB | ACTUAL_TABLE_SIZE_MB | INDEX_NAME | INDEX_SIZE_MB | UNIQUENESS | TOTAL_INDEX_SIZE_MB | INDEX_TO_TABLE_RATIO_PERCENT |
|---|---|---|---|---|---|---|---|---|---|---|
| T_USER_INFO | TBS_PICP_NEW | 636046 | 37 | 262.55 | 271 | PK_T_USER_ID | 45 | UNIQUE | 371 | 37.09 |
| T_USER_INFO | TBS_PICP_NEW | 636046 | 37 | 262.55 | 271 | IDX_USER_NAME | 28 | NONUNIQUE | 71 | 37.09 |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
navicat使用Oracle創(chuàng)建庫以及用戶超詳細(xì)教程
本文介紹如何使用Navicat連接Oracle數(shù)據(jù)庫,步驟包括準(zhǔn)備工作、新建連接、輸入用戶名和密碼、測試連接、建立庫和用戶、授權(quán)以及測試的相關(guān)資料,需要的朋友可以參考下2024-09-09
利用windows任務(wù)計(jì)劃實(shí)現(xiàn)oracle的定期備份
我們搞數(shù)據(jù)庫管理系統(tǒng)的經(jīng)常會(huì)遇到數(shù)據(jù)庫定期自動(dòng)備份的問題,有各種各樣的方法,這里介紹一種利用windows任務(wù)計(jì)劃實(shí)現(xiàn)oracle定期備份的方法供大家分享。2009-08-08
Oracle數(shù)據(jù)庫數(shù)據(jù)遷移完整解決步驟
我們常常需要對數(shù)據(jù)進(jìn)行遷移,遷移到更性能配置更高級的主機(jī)OS上、遷移到遠(yuǎn)程的機(jī)房、遷移到不同的平臺(tái)下,這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫數(shù)據(jù)遷移的相關(guān)資料,需要的朋友可以參考下2024-02-02
oracle數(shù)據(jù)庫中l(wèi)istagg函數(shù)使用詳解
listagg函數(shù)是Oracle數(shù)據(jù)庫中的一個(gè)聚合函數(shù),用于將一組值連接成一個(gè)以指定分隔符分隔的字符串,這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫中l(wèi)istagg函數(shù)使用的相關(guān)資料,需要的朋友可以參考下2024-06-06
Oracle RMAN三種不完全恢復(fù)方式的實(shí)戰(zhàn)指南
在Oracle數(shù)據(jù)庫的日常管理中,不完全恢復(fù)(Incomplete Recovery)是一項(xiàng)重要且實(shí)用的技能,尤其是在面對人為誤操作(如誤刪表)或邏輯故障(如表空間損壞)時(shí),本文將通過三個(gè)實(shí)際演示案例,逐一呈現(xiàn)三種不完全恢復(fù)方式的操作步驟,需要的朋友可以參考下2025-10-10

