GaussDB(DWS)如何统计无效索引

举报
Arrow0lf 发表于 2023/12/26 21:19:02 2023/12/26
【摘要】 本文提供了一种手段来识别行存表的无用索引。

1. 背景介绍

在实时查询场景中,使用行存表+btree索引是常见的优化手段。单由于索引本身也需要占用一定的空间,且当表数据量较大,表比较宽,且索引数量也较多的情况下,业务侧需要统计出哪些索引未被使用过,从而删除这些无效的索引。本文提供了一种手段来识别无用索引。注:该方法只支持行存表索引,不支持列存表(列存表上除主键外,不建议使用索引)。

2. 查询方法

可以通过如下sql识别无用索引:

-- Schemaname:模式名
-- Tablename:表名
-- Indexname:索引名
-- Isprimary:是否是主键
-- Isunique:是否是唯一索引
-- Isvisible:索引是否可见
-- Ctime:索引创建时间
-- Mtime:索引上一次修改时间
-- Idxscan:使用该索引返回的索引行数目(非使用次数),为0表示该索引未被访问过

SELECT 
    schemaname, tablename, indexname,
    isprimary, isunique, isvisible, isvisible,
    ctime, mtime,
    sum(idx_scan) AS idxscan_num
FROM pgxc_parallel_query('dn', 
'SELECT
    n.nspname AS schemaname,
    c.relname AS tablename,
    i.relname AS indexname,
    o.ctime::timestamptz(0),
    o.mtime::timestamptz(0),
    indisprimary | indisunique  AS is_pk_or_uniq,
    indisprimary AS isprimary,
    indisunique AS isunique,
    CASE WHEN i.reloptions IS NOT NULL AND i.reloptions::text like ''%invisible=%'' THEN false ELSE true END AS isvisible, 
    pg_stat_get_numscans(i.oid) AS idx_scan 
FROM pg_class c
INNER JOIN pg_index x ON c.oid = x.indrelid
INNER JOIN pg_class i ON i.oid = x.indexrelid AND c.relnamespace = i.relnamespace
INNER JOIN pg_object o ON o.object_oid = i.oid AND object_type = ''i''
INNER JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE 1 = 1
AND c.relname NOT LIKE ''pg_toast_%''
AND c.relname NOT LIKE ''_pg_cudesc_%''
AND i.relname NOT LIKE ''pg_toast_%''
AND i.relname NOT LIKE ''_pg_cudesc_%''
AND c.relkind = ANY (ARRAY[''r'', ''t'', ''m''])
--AND idx_scan = 0 加上这个条件可以刷选出scan次数为0的索引
AND n.oid NOT IN (99,100,3989,11,3987)')
AS (schemaname name, tablename name, indexname name, ctime timestamptz, mtime timestamptz,is_pk_or_uniq bigint, isprimary bool, isunique bool, isvisible bool, idx_scan bigint)
GROUP BY schemaname, tablename, indexname, isprimary, isunique, isvisible, ctime, mtime
ORDER BY 1, 2, 3

3. 参考链接

https://bbs.huaweicloud.com/blogs/249248

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。