oracle查所有表的索引個數(shù)的示例代碼
1. 查看當前用戶所有表的索引數(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.查詢表及其索引的詳細信息–推薦使用,oracle國產(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.按索引類型統(tǒng)計
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.查詢沒有索引的表
-- 查找當前用戶下沒有索引的表
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;
-- 查找所有用戶下沒有索引的表(需要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)計
-- 統(tǒng)計每個索引的列數(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.實用的匯總查詢
-- 索引統(tǒng)計匯總
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)控大表無索引情況
-- 查找行數(shù)超過10000但索引數(shù)少于2個的表
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') -- 只對某些數(shù)據(jù)類型創(chuàng)建索引
)
WHERE ROWNUM <= 10; -- 限制生成的數(shù)量
到此這篇關(guān)于oracle查所有表的索引個數(shù)的示例代碼的文章就介紹到這了,更多相關(guān)oracle查所有表索引個數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle數(shù)據(jù)庫如何更改數(shù)據(jù)文件位置
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫如何更改數(shù)據(jù)文件位置的相關(guān)資料,Oracle數(shù)據(jù)庫的數(shù)據(jù)文件的位置和信息都被記錄在控制文件中,需要的朋友可以參考下2023-08-08
oracle數(shù)據(jù)排序后獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式)
項目中用到Oracle分組查詢?nèi)∶拷M排序后的前N條記錄,group?by?只能返回每個組的單條統(tǒng)計,下面這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)排序后獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式),需要的朋友可以參考下2022-12-12
windows本地安裝配置oracle客戶端完整流程(圖文版)
這篇文章主要介紹了windows本地安裝配置oracle客戶端完整流程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-09-09
Windows Sever 2012下Oracle 12c安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了Windows Sever 2012下Oracle 12c安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04

