开发者社区 问答 正文

如何排查存在前缀字段相同的多个复合索引?

如何排查存在前缀字段相同的多个复合索引?

展开
收起
花开富贵111 2024-07-24 18:33:04 57 分享 版权
1 条回答
写回答
取消 提交回答
  • 为了排查存在前缀字段相同的多个复合索引,可以使用以下SQL查询。这个查询会检查同一表上的索引,并确定哪些索引的键字段(indkey)是另一个索引键字段的子集。如果multi_index1是multi_index2的子集,则前者可能是冗余的。

    SELECT idx1.indrelid::regclass, idx1.indexrelid::regclass, string_to_array(idx1.indkey::text, ' ') AS multi_index1, 
    string_to_array(idx2.indkey::text, ' ') AS multi_index2, idx2.indexrelid::regclass 
    FROM pg_index idx1, pg_index idx2 
    WHERE idx1.indrelid = idx2.indrelid 
    AND idx1.indexrelid != idx2.indexrelid 
    AND idx1.indnatts > 1 
    AND string_to_array(idx1.indkey::text, ' ') <@ string_to_array(idx2.indkey::text, ' ');
    

    以下是排查例子user_t上复合问题的索引,如下:image.png
    以下是查询结果image.png
    以上例子结果解释:multi_index1是multi_index2的子集,前者的索引列已经在后者中做了索引,因此,multi_index1属于冗余索引。

    2024-07-24 20:05:36
    赞同 3 展开评论
问答分类:
问答地址: