oracle - 索引的重叠
问题描述
根据我的理解,索引的重叠如下:-
CREATE INDEX idx1 ON TabA ( Col1, Col2, Col3 );
CREATE INDEX idx2 ON TabA ( Col1, Col2 );
CREATE INDEX idx3 ON TabA ( Col1 DESC, Col2 DESC );
在上面的表结构中,索引 idx1 是索引 idx2 的超集(重叠),因此是冗余的。所以 index1 是 Index2 的重叠。删除此类重叠索引可以提高性能。
但是我们如何在 oracle 11gR2 的整个模式中找到所有重叠索引?有人可以指导我吗?在此先感谢。
解决方案
您可以查询user_ind_columns
排序和连接列column_position
,然后进行自连接以进行比较。
WITH indx AS ( SELECT table_name,index_name,LISTAGG(column_name,',') WITHIN GROUP(
ORDER BY column_position
) AS cols
FROM user_ind_columns a
GROUP BY table_name,index_name
)
SELECT a.table_name,a.index_name AS sup_index,b.index_name sub_indx,
a.cols as super_set,b.cols AS sub_set
FROM indx a
JOIN indx b ON a.table_name = b.table_name
AND a.index_name != b.index_name
where ','|| a.cols||',' like ',%'|| b.cols|| '%,';
结果
TABLE_NAME SUP_INDEX SUB_INDX SUPER_SET SUB_SET
TABA IDX1 IDX2 COL1,COL2,COL3 COL1,COL2
JOB_HISTORY JHIST_EMP_ID_ST_DATE_PK JHIST_EMPLOYEE_IX EMPLOYEE_ID,START_DATE EMPLOYEE_ID
2 rows selected.
注意:Oracle 数据库将降序索引视为基于函数的索引,因此无法通过此方法直接比较列名。
另请注意,您的这一说法是有争议的。
删除此类重叠索引(即 Index2)可以提高性能。
推荐阅读
- gitlab - Gitlab 代码质量未找到要写入的文件
- c# - 如何使用 EFCore 3.1 从 DbContext 中选择特定的 DbSet?
- elasticsearch-7 - elastic4s中的scriptScoreQuery实现
- reactjs - 反应路径不适用于谷歌分析
- ios - 将 Swift Pod 导入 ObjC Pod
- regex - 负向后看未按预期工作。如何防止第二组捕获字符串?
- python - 直接从流中使用 Azure 语音在 python 中翻译
- python - PyTest:如何确保测试仅在预测试通过 pytest 时运行
- r - 匹配R中两个数据框中的任何字符串
- python - 在二维 numpy 数组中获取邻居的有效方法