oracle查所有表的索引個(gè)數(shù)的示例代碼
1. 查看當(dāng)前用戶所有表的索引數(shù)量
SELECT
t.table_name,
COUNT(i.index_name) as index_count,
LISTAGG(i.index_name, ', ') WITHIN GROUP (ORDER BY i.index_name) as index_names
FROM user_tables t
LEFT JOIN user_indexes i ON t.table_name = i.table_name
GROUP BY t.table_name
ORDER BY COUNT(i.index_name) DESC, t.table_name;
2. 查看所有用戶所有表的索引數(shù)量(需要DBA權(quán)限)
SELECT
i.table_owner,
i.table_name,
COUNT(i.index_name) as index_count,
LISTAGG(i.index_name, ', ') WITHIN GROUP (ORDER BY i.index_name) as index_names
FROM dba_indexes i
WHERE i.table_owner NOT IN ('SYS', 'SYSTEM', 'XDB', 'CTXSYS', 'MDSYS', 'ORDSYS') -- 排除系統(tǒng)用戶
GROUP BY i.table_owner, i.table_name
ORDER BY i.table_owner, COUNT(i.index_name) DESC, i.table_name;
3.查詢表及其索引的詳細(xì)信息–推薦使用,oracle國(guó)產(chǎn)化轉(zhuǎn)換到tidb,最好明確知道所有需要遷移的生產(chǎn)表的條數(shù)等令牌
SELECT
t.owner,
t.table_name,
t.num_rows as table_rows,
COUNT(i.index_name) as total_indexes,
SUM(CASE WHEN i.uniqueness = 'UNIQUE' THEN 1 ELSE 0 END) as unique_indexes,
SUM(CASE WHEN i.uniqueness = 'NONUNIQUE' THEN 1 ELSE 0 END) as nonunique_indexes,
SUM(CASE WHEN i.index_type = 'FUNCTION-BASED NORMAL' THEN 1 ELSE 0 END) as function_based_indexes
FROM dba_tables t
LEFT JOIN dba_indexes i ON t.owner = i.table_owner AND t.table_name = i.table_name
WHERE t.owner = 'YOUR_SCHEMA_NAME' -- 替換為你的模式名
GROUP BY t.owner, t.table_name, t.num_rows
ORDER BY COUNT(i.index_name) DESC, t.table_name;
4.按索引類(lèi)型統(tǒng)計(jì)
SELECT
i.table_owner,
i.table_name,
i.index_type,
COUNT(*) as count_per_type,
LISTAGG(i.index_name, ', ') WITHIN GROUP (ORDER BY i.index_name) as index_list
FROM dba_indexes i
WHERE i.table_owner = 'YOUR_SCHEMA_NAME' -- 替換為你的模式名
GROUP BY i.table_owner, i.table_name, i.index_type
ORDER BY i.table_name, i.index_type;
5.查詢沒(méi)有索引的表
-- 查找當(dāng)前用戶下沒(méi)有索引的表
SELECT
t.table_name,
t.num_rows,
t.blocks
FROM user_tables t
WHERE NOT EXISTS (
SELECT 1
FROM user_indexes i
WHERE i.table_name = t.table_name
)
AND t.table_name NOT LIKE 'BIN$%' -- 排除回收站中的表
ORDER BY t.num_rows DESC NULLS LAST;
-- 查找所有用戶下沒(méi)有索引的表(需要DBA權(quán)限)
SELECT
t.owner,
t.table_name,
t.num_rows
FROM dba_tables t
WHERE NOT EXISTS (
SELECT 1
FROM dba_indexes i
WHERE i.table_owner = t.owner
AND i.table_name = t.table_name
)
AND t.owner NOT IN ('SYS', 'SYSTEM', 'XDB')
AND t.table_name NOT LIKE 'BIN$%'
ORDER BY t.owner, t.num_rows DESC NULLS LAST;
6.索引列數(shù)統(tǒng)計(jì)
-- 統(tǒng)計(jì)每個(gè)索引的列數(shù)
SELECT
i.table_name,
i.index_name,
i.uniqueness,
i.status,
COUNT(ic.column_position) as column_count,
LISTAGG(ic.column_name, ', ') WITHIN GROUP (ORDER BY ic.column_position) as columns
FROM user_indexes i
JOIN user_ind_columns ic ON i.index_name = ic.index_name
GROUP BY i.table_name, i.index_name, i.uniqueness, i.status
ORDER BY i.table_name, i.index_name;
7.實(shí)用的匯總查詢
-- 索引統(tǒng)計(jì)匯總
WITH index_stats AS (
SELECT
owner,
table_name,
COUNT(*) as total_indexes,
ROUND(AVG(blevel), 2) as avg_blevel,
ROUND(AVG(leaf_blocks), 2) as avg_leaf_blocks,
SUM(CASE WHEN status != 'VALID' THEN 1 ELSE 0 END) as invalid_indexes
FROM dba_indexes
WHERE owner = 'YOUR_SCHEMA_NAME'
GROUP BY owner, table_name
)
SELECT
owner,
COUNT(DISTINCT table_name) as tables_with_indexes,
SUM(total_indexes) as total_index_count,
ROUND(AVG(total_indexes), 2) as avg_indexes_per_table,
ROUND(MEDIAN(total_indexes), 2) as median_indexes_per_table,
MAX(total_indexes) as max_indexes_in_table,
SUM(invalid_indexes) as total_invalid_indexes
FROM index_stats
GROUP BY owner;
8.生產(chǎn)監(jiān)控大表無(wú)索引情況
-- 查找行數(shù)超過(guò)10000但索引數(shù)少于2個(gè)的表
SELECT
t.owner,
t.table_name,
t.num_rows,
COUNT(i.index_name) as index_count
FROM dba_tables t
LEFT JOIN dba_indexes i ON t.owner = i.table_owner AND t.table_name = i.table_name
WHERE t.num_rows > 10000
AND t.owner = 'YOUR_SCHEMA_NAME'
GROUP BY t.owner, t.table_name, t.num_rows
HAVING COUNT(i.index_name) < 2
ORDER BY t.num_rows DESC;
9.查看索引使用情況(需要Oracle 11g及以上)
SELECT
table_name,
index_name,
used
FROM v$object_usage
WHERE used = 'NO' -- 查看未使用的索引
ORDER BY table_name;
10.生成創(chuàng)建索引的腳本
SELECT
'CREATE INDEX idx_' || table_name || '_' || column_name ||
' ON ' || table_name || '(' || column_name || ');' as create_index_sql
FROM (
SELECT DISTINCT
t.table_name,
tc.column_name
FROM user_tables t
JOIN user_tab_columns tc ON t.table_name = tc.table_name
WHERE NOT EXISTS (
SELECT 1
FROM user_ind_columns ic
WHERE ic.table_name = t.table_name
AND ic.column_name = tc.column_name
)
AND t.table_name NOT LIKE 'BIN$%'
AND tc.column_name NOT LIKE '%ID' -- 排除ID列
AND tc.data_type IN ('VARCHAR2', 'CHAR', 'NUMBER', 'DATE') -- 只對(duì)某些數(shù)據(jù)類(lèi)型創(chuàng)建索引
)
WHERE ROWNUM <= 10; -- 限制生成的數(shù)量
到此這篇關(guān)于oracle查所有表的索引個(gè)數(shù)的示例代碼的文章就介紹到這了,更多相關(guān)oracle查所有表索引個(gè)數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Oracle數(shù)據(jù)庫(kù)索引查詢方式
- Oracle查詢表結(jié)構(gòu)建表語(yǔ)句索引等方式
- oracle中如何查詢所有用戶表的表名、主鍵名稱、索引及外鍵等
- Oracle表索引查看常見(jiàn)的方法總結(jié)
- Oracle如何查詢表索引和索引字段
- Oracle如何通過(guò)執(zhí)行計(jì)劃查看查詢語(yǔ)句是否使用索引
- ORACLE檢查找出損壞索引(Corrupt Indexes)的方法詳解
- Oracle中檢查外鍵是否有索引的SQL腳本分享
- oracle 索引的相關(guān)介紹(創(chuàng)建、簡(jiǎn)介、技巧、怎樣查看) .
- Oracle中檢查是否需要重構(gòu)索引的sql
相關(guān)文章
Oracle將查詢的結(jié)果放入一張自定義表中并再查詢數(shù)據(jù)
可以將查詢的結(jié)果放入到一張自定義表中,同時(shí)可以再?gòu)倪@個(gè)自定義的表中查詢數(shù)據(jù),詳細(xì)的sql如下,感興趣的朋友不要錯(cuò)過(guò)2014-08-08
Oracle 閃回 找回?cái)?shù)據(jù)的實(shí)現(xiàn)方法
閃回技術(shù)是Oracle強(qiáng)大數(shù)據(jù)庫(kù)備份恢復(fù)機(jī)制的一部分,在數(shù)據(jù)庫(kù)發(fā)生邏輯錯(cuò)誤的時(shí)候,閃回技術(shù)能提供快速且最小損失的恢復(fù)。這篇文章主要介紹了Oracle 閃回 找回?cái)?shù)據(jù)的實(shí)現(xiàn)方法,需要的朋友可以參考下2018-09-09
Oracle存儲(chǔ)過(guò)程和自定義函數(shù)詳解
本篇文章主要介紹了Oracle存儲(chǔ)過(guò)程和自定義函數(shù)詳解,有需要的可以了解一下。2016-11-11
Oracle復(fù)合索引與空值的索引使用問(wèn)題小結(jié)
最近小編在群里討論sql優(yōu)化的問(wèn)題,今天小編給大家?guī)?lái)了Oracle復(fù)合索引與空值的索引使用問(wèn)題小結(jié),需要的朋友參考下吧2018-02-02
Oracle給用戶授權(quán)truncatetable的實(shí)現(xiàn)方案
這篇文章主要介紹了Oracle給用戶授權(quán)truncatetable的實(shí)現(xiàn)方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
Oracle?function函數(shù)返回結(jié)果集的3種方法
工作中常需要經(jīng)過(guò)一段復(fù)雜邏輯處理后,得出的一個(gè)結(jié)果集,所以這篇文章主要給大家介紹了關(guān)于Oracle?function函數(shù)返回結(jié)果集的3種方法,需要的朋友可以參考下2023-07-07
ORACLE時(shí)間函數(shù)(SYSDATE)深入理解
有些朋友對(duì)ORACLE時(shí)間函數(shù)理解不是很透徹,接下來(lái)講詳細(xì)介紹,希望可以幫助到你們2012-12-12

