前言

KingbaseES具有丰富的索引功能,对于运行一段时间的数据库,经常需要查看索引的使用大小,使用状态等。

尤其重复索引的存在,有时会因为索引过多而造成维护成本加大和减慢数据库的运行速度。

下面是经常使用的查看索引的sql。

1.查看表上索引个数,是否唯一,表与索引大小。

SELECT CONCAT(n.nspname,'.', c.relname) AS table,
i.relname AS index_name
,indisunique is_unique
,sys_size_pretty(sys_relation_size(x.indrelid)) AS table_size,
sys_size_pretty(sys_relation_size(x.indexrelid)) AS index_size,
sys_size_pretty(sys_total_relation_size(x.indrelid)) AS total_size
FROM sys_class c
JOIN sys_index x ON c.oid = x.indrelid
JOIN sys_class i ON i.oid = x.indexrelid
LEFT JOIN sys_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = ANY (ARRAY['r', 't']) AND c.relname like 'test1'; table | index_name | is_unique | table_size | index_size | total_size
--------------+------------+-----------+------------+------------+------------
public.test1 | idx_id1 | f | 8192 bytes | 16 kB | 40 kB
public.test1 | idx_id2 | f | 8192 bytes | 16 kB | 40 kB
(2 行记录)

2.索引的创建语句。

SELECT sys_get_indexdef(indexrelid) AS index_query
FROM sys_index
WHERE indrelid = 'test1'::regclass;
index_query
-------------------------------------------------------
CREATE INDEX idx_id1 ON public.test1 USING btree (id)
CREATE INDEX idx_id2 ON public.test1 USING btree (id)
(2 行记录)

3.获取支持的索引方法。

KingbaseES有许多索引方法,如BTree,Hash,GIST和GIN等。

TEST=# select distinct amname from sys_am;
amname
--------
bitmap
btree
brin
heap
spgist
gist
gin
hash
(8 rows)

4.查询未使用的索引。

如果index_scans始终为0 或接近0,可以理解为该索引未使用unsed。

如果有些索引长期未被使用,这些索引不会发挥任何作用,而且会占用不必要的空间,让数据增删改的成本变大,增加备份的时间开销。考虑将其删除。

SELECT s.relname AS table_name,
indexrelname AS index_name,
i.indisunique,
idx_scan AS index_scans
FROM sys_catalog.pg_stat_user_indexes s,
sys_index i
WHERE i.indexrelid = s.indexrelid and idx_scan=0; table_name | index_name | indisunique | index_scans
------------+--------------+-------------+-------------
company | company_pkey | t | 0
brand | brand_pkey | t | 0
t | t_pkey | t | 0
test1 | idx_id1 | f | 0
test1 | idx_id2 | f | 0

4.1查询没有使用过的大于1MB的索引 top 10 (注意, PK、UK如果只是用于约束, 可能不会被统计计数,但不能删掉)。

select sys_size_pretty(sys_relation_size(indexrelid)),* from sys_stat_all_indexes where sys_relation_size(indexrelid)>=1024000 and (idx_scan=0 or idx_tup_read=0 or idx_tup_fetch=0)
and schemaname not in ('sys_toast','sys_catalog') order by sys_relation_size(indexrelid) desc limit 10;

5.查询重复的索引。

在KingbaseES中同一列可以重复创建索引,然而没有必要在表上有多个具有不同名称的相同索引,同样浪费空间。

SELECT   indrelid::regclass table_name,
att.attname column_name,
amname index_method,
indkey
FROM sys_index i,
sys_class c,
sys_opclass o,
sys_am a,
sys_attribute att
WHERE o.oid = ALL (indclass)
AND att.attnum = ANY(i.indkey)
AND a.oid = o.opcmethod
AND att.attrelid = c.oid
AND c.oid = i.indrelid
GROUP BY table_name,
att.attname,
indclass,
amname, indkey
HAVING count(*) > 1;
table_name | column_name | index_method | indkey
------------+-------------+--------------+--------
tmp | a | btree | 1
(1 row)
SELECT relname,(array_agg(idx))[1] idx1,
sys_get_indexdef((array_agg(idx))[1]) idx1_def,
(array_agg(idx))[2] idx2,
sys_get_indexdef((array_agg(idx))[2]) idx2_def,
(array_agg(idx))[3] idx3,
sys_get_indexdef((array_agg(idx))[3]) idx3_def
FROM (
SELECT indrelid::regclass AS relname,
indexrelid::regclass AS idx,
(indrelid::text || indclass::text || indkey::text || COALESCE(indexprs::text,'') || COALESCE(indpred::text,'')) AS KEY
FROM sys_index) sub
GROUP BY relname, KEY
HAVING count(*) > 1 \gx
-[ RECORD 1 ]-----------------------------------------------
relname | tmp
idx1 | ind_01
idx1_def | CREATE INDEX ind_01 ON public.tmp USING btree (a)
idx2 | ind_02
idx2_def | CREATE INDEX ind_02 ON public.tmp USING btree (a)
idx3 |
idx3_def |

6.查看无效的索引。

如果 create concurrently index创建索引失败, 索引将处于invalid状态, 需要drop索引重建。

select indisvalid, indexrelid::regclass, indrelid::regclass, sys_get_indexdef(indexrelid) from sys_index where not indisvalid;

7.占用空间top 10的索引。

select schemaname,tablename,indexname,sys_size_pretty(sys_relation_size((quote_ident(schemaname)||'.'||quote_ident(indexname))::regclass)) from sys_indexes
order by sys_relation_size((quote_ident(schemaname)||'.'||quote_ident(indexname))::regclass) desc limit 10;

KingbaseESV8R6中查看索引常用sql的更多相关文章

  1. SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题

    SQL优化 MySQL版  - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 索引分类 单值索引 单的意思就是单列的值,比如说有 ...

  2. SqlServer中查看索引的使用情况

    --查看数据库索引的使用情况 select db_name(database_id) as N'TOPK_TO_DEV', --库名 object_name(a.object_id) as N'Top ...

  3. Entity Framework中查看生成的SQL语句

    Entity Framework 4.0 中是这样的,高版本的跟这个有些差异,不太一样,貌似已经到7了 using (Entities entities = new Entities()) { var ...

  4. DBA常用SQL之DDL生成语句

    获取对象定义的包为:dbms_metadata,其中的get_ddl函数是获取对象的函数 GET_DDL函数返回创建对象的原数据的DDL语句,参数说明 .object_type ---需要返回原数据的 ...

  5. 转载: SQL Server中的索引

    http://www.blogjava.net/wangdetian168/archive/2011/03/07/347192.html 1 SQL Server中的索引 索引是与表或视图关联的磁盘上 ...

  6. SQL Server中的索引结构与疑惑

    说实话我从没有在实际项目中使用过索引,仅知道索引是一个相当重要的技术点,因此我也看了不少文章知道了索引的区别.分类.优缺点以及如何使用索引.但关于索引它最本质的是什么笔者一直没明白,本文是笔者带着这些 ...

  7. SQL Server中的索引

    1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Serve ...

  8. SQL Server查看索引重建、重组索引进度

    相信很多SQL Server DBA或开发人员在重建或重组大表索引时,都会相当郁闷,不知道索引重建的进度,这个对于DBA完全是一个黑盒子,对于系统负载非常大的系统或维护窗口较短的系统,你会遇到一些挑战 ...

  9. MySQL查看 InnoDB表中每个索引的高度

    我们都知道MySQL里,索引通常用B+树来实现的.B+树的叶子结点才具体保存数据(聚簇索引保存的是行数据:普通索引是主键,如有需要得回表),非叶子结点都是用来索引叶子结点的.假设索引高度为h,那么每次 ...

  10. (转)SQL Server中的索引结构与疑惑

    说实话我从没有在实际项目中使用过索引,仅知道索引是一个相当重要的技术点,因此我也看了不少文章知道了索引的区别.分类.优缺点以及如何使用索引.但关于索引它最本质的是什么笔者一直没明白,本文是笔者带着这些 ...

随机推荐

  1. Java String类的replaceAll方法

    代码勇士真题: 给定一个字符串由a-z字母组成的字符串s,长度任意字母可任意组合. 要求编写函数找出s中不在a-m范围内的字母个数n,要求函数返回字符串格式为:n/s的长度 例如: s="a ...

  2. Mysql一张表可以存储多少数据

    Mysql一张表可以存储多少数据 在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4KB.同样的在MySQL中为了提高吞吐率,数据也是分页的,不过MySQL的数据页大小是16KB.(确切 ...

  3. CDN 加速原理

    => CDN 加速原理 HTTP 请求流程说明: 用户在浏览器输入要访问的网站域名,向本地 DNS 发起域名解析请求. 域名解析的请求被发往网站授权 DNS 服务器. 网站 DNS 服务器解析发 ...

  4. win32--GetFileAttributes

    DWORD d = GetFileAttributes(path.c_str()); 根据返回的十进制,对比文件属性,来检索指定文件或目录的文件系统属性. 也可以使用 if ((d & FIL ...

  5. golang常用库包:redis操作库go-redis使用(03)-高级数据结构和其它特性

    Redis 高级数据结构操作和其它特性 第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis https://www.cnblogs.com/j ...

  6. TCP/IP的确认号,序列号和超时重传的学习笔记

    一:确认应答和序列号 在tcp中,发送端的数据到达主机时,接收端会返回一个已收到的通知.这个消息叫做确认应答(ACK). 当发送端发送数据后,会等待对端的确认应答.如果有确认应答,说明数据已经成功到达 ...

  7. 记录问题:goland无法识别sdk的问题

    goland版本:2020 go版本:1.20.3最新版 在goland中配置GOROOT时找不到sdk 解决版本: > cd /usr/local/go # 我本地go的安装目录 > c ...

  8. 推导式,集合推导式,生成器表达式及生成器函数day13

    1.推导式 用一行循环判断遍历处一系列数据的方式 推导式在使用时,只能用for循环和判断,而且判断只能是单项判断 基本语法: lst = [i for i in range(1,51)] print( ...

  9. day01---操作系统安装环境准备

    虚拟机安装操作系统步骤 1.新建虚拟主机 2.选择自定义 3.稍后安装操作系统 4.操作系统选择linux 5.选择存放位置 6.cpu和核数选择,默认即可 7.内存分配 8.网络选择 9.控制器类型 ...

  10. Ubuntu下docker部署

    使用docker进行容器化集成部署 远程服务器更新源 更新ubuntu的apt源 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo dpkg --configu ...