当前位置: 首页 > news >正文

pgsql索引冗余分析

查询重复索引

`
SELECT
tablename,
indexname,
indexdef
FROM
pg_indexes
WHERE
schemaname = 'public' -- 通常默认schema为public,可根据实际修改
AND
(tablename, substring(indexdef FROM 'USING .? (.)')) -- 提取索引类型+字段作为去重键
IN (
SELECT
tablename,
substring(indexdef FROM 'USING .? (.)')
FROM
pg_indexes
WHERE
schemaname = 'public'
GROUP BY
tablename, substring(indexdef FROM 'USING .? (.)')
HAVING
COUNT() > 1 -- 筛选出现次数>1的重复组合
)
ORDER BY
tablename, substring(indexdef FROM 'USING .
? (.*)');

`
image

前缀重复索引

`
-- 精确的索引冗余分析
WITH index_analysis AS (
SELECT
n.nspname AS schema_name,
t.relname AS table_name,
idx.relname AS index_name,
ix.indexrelid AS index_oid,
-- 只获取列名(不包含顺序)
(
SELECT array_agg(attname ORDER BY pos)
FROM unnest(ix.indkey) WITH ORDINALITY AS k(attnum, pos)
JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = k.attnum
WHERE k.attnum > 0
) AS index_columns,
-- 获取列名和顺序的组合
(
SELECT array_agg(
attname ||
CASE
WHEN (ix.indoption[k.pos-1] & 1) = 1 THEN ' DESC'
ELSE ' ASC'
END
ORDER BY k.pos
)
FROM unnest(ix.indkey) WITH ORDINALITY AS k(attnum, pos)
JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = k.attnum
WHERE k.attnum > 0
) AS index_columns_with_order,
ix.indisunique AS is_unique,
pg_relation_size(ix.indexrelid) AS index_size,
pg_get_indexdef(ix.indexrelid) AS index_def
FROM
pg_index ix
JOIN pg_class t ON t.oid = ix.indrelid
JOIN pg_class idx ON idx.oid = ix.indexrelid
JOIN pg_namespace n ON n.oid = t.relnamespace
WHERE
n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
AND t.relkind = 'r'
)

-- 一次性识别所有类型
SELECT
CASE
-- 类型1:列和顺序都完全相同
WHEN ia1.index_columns_with_order = ia2.index_columns_with_order
AND ia1.is_unique = ia2.is_unique
THEN '类型1: 完全重复'

-- 类型2:列相同但顺序不同
WHEN ia1.index_columns = ia2.index_columns AND ia1.index_columns_with_order <> ia2.index_columns_with_order
THEN '类型2: 列相同但顺序不同'-- 类型3:前缀重复
WHEN ia1.index_columns[1:array_length(ia2.index_columns, 1)] = ia2.index_columnsAND array_length(ia1.index_columns, 1) > array_length(ia2.index_columns, 1)
THEN '类型3: 前缀重复'WHEN ia2.index_columns[1:array_length(ia1.index_columns, 1)] = ia1.index_columnsAND array_length(ia2.index_columns, 1) > array_length(ia1.index_columns, 1)
THEN '类型3: 前缀重复'ELSE '其他'

END AS issue_type,

ia1.schema_name,
ia1.table_name,
ARRAY[ia1.index_name, ia2.index_name] AS affected_indexes,
ia1.index_columns AS index1_columns,
ia2.index_columns AS index2_columns,
array_to_string(ia1.index_columns_with_order, ', ') AS index1_order,
array_to_string(ia2.index_columns_with_order, ', ') AS index2_order,
ARRAY[pg_size_pretty(ia1.index_size), pg_size_pretty(ia2.index_size)] AS sizes,

CASE
WHEN ia1.index_columns_with_order = ia2.index_columns_with_order THEN
'完全重复,删除其中一个索引'
WHEN ia1.index_columns = ia2.index_columns THEN
'列相同但顺序不同,分析排序查询需求'
ELSE
'前缀重复,考虑删除较短的索引'
END AS recommendation

FROM index_analysis ia1
JOIN index_analysis ia2 ON (
ia1.schema_name = ia2.schema_name
AND ia1.table_name = ia2.table_name
AND ia1.index_oid < ia2.index_oid
)
WHERE ia1.index_columns IS NOT NULL
AND ia2.index_columns IS NOT NULL
AND (
-- 类型1条件
(ia1.index_columns_with_order = ia2.index_columns_with_order AND ia1.is_unique = ia2.is_unique)
OR
-- 类型2条件
(ia1.index_columns = ia2.index_columns AND ia1.index_columns_with_order <> ia2.index_columns_with_order)
OR
-- 类型3条件
(ia1.index_columns[1:array_length(ia2.index_columns, 1)] = ia2.index_columns
AND array_length(ia1.index_columns, 1) > array_length(ia2.index_columns, 1))
OR
(ia2.index_columns[1:array_length(ia1.index_columns, 1)] = ia1.index_columns
AND array_length(ia2.index_columns, 1) > array_length(ia1.index_columns, 1))
)
ORDER BY issue_type, schema_name, table_name;
`
image

http://www.gsyq.cn/news/35141.html

相关文章:

  • 详细介绍:Leetcode 3700. Number of ZigZag Arrays II
  • 老旧环境torch版本(0.4.1)环境配置总结
  • 代码大全阅读笔记3
  • 通过中国信通院SQL质量管理最高等级评测,天翼云TeleDB引领数据库管理新标准!
  • 代码大阅读笔记
  • 第二次软件基础作业
  • 实用指南:从0死磕全栈之Next.js Server Actions 入门实战:在服务端安全执行逻辑,告别 API 路由!
  • 重塑生产力:天翼云全球首发RaaS,开启“机器人即服务”商业时代!
  • Sequence2Sequence - -一叶知秋
  • 第177天:信息收集篇自动项目本机导出外部打点域内通讯PillagerBloodHound
  • 如何在Linux中,为Flatpak版本的Edge浏览器导入证书
  • Java 集合 “Map(1)”面试清单(含超通俗生活案例与深度理解) - 教程
  • 2025 年铸铁井盖生产厂家最新推荐榜,技术实力与市场口碑深度解析防沉降球墨/防沉降/电力/双层铸铁井盖公司推荐
  • Bilidown Setup 1.2.7下载
  • 0291-Nand-实现基础逻辑门(一)
  • NASM下载和安装教程(附安装包)
  • 0292-Nand-实现基础逻辑门(二)
  • 单点登录SSO是怎么实现的?
  • 2025年上海房产继承律师权威推荐榜单:继承律师/离婚律师/婚姻律师事务所精选
  • autotiny下载_v3.0.0.2
  • Python嵌套_多条件判断 _ 对象今天会生气吗 II
  • 解析视频融合平台EasyCVR的分析平台技术如何成为“全域视频管理中台”
  • 2025年10月logo/VI设计专业公司权威推荐排行榜:探索年最佳设计服务
  • 深入解析:GitPuk入门教程:安装及使用指南,一文轻松上手
  • 完整教程:Linux启动流程与字符设备驱动详解 - 从bootloader到驱动开发
  • 学术会议会议合集 | 电子信息工程、计算机技术、文学、人文发展、数字经济等EI会议合集
  • 2025 年弯管机生产厂家最新推荐榜,技术实力与市场口碑深度解析且高性能与可靠性兼具四轴/双轴/双层膜弯管机公司推荐
  • 2025年智慧厕所厂家权威推荐榜单:智慧厕所智能水表/智慧公厕系统/智慧厕所源头厂家精选
  • 用Circom和Snarkjs实践零知识证明技术
  • ubuntu24 输入法优化