首页 > 数据库 >KingbaseESV8R6中查看索引常用sql

KingbaseESV8R6中查看索引常用sql

时间:2023-09-18 13:44:43浏览次数:31  
标签:index KingbaseESV8R6 name idx sys 索引 sql size

前言

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;  

标签:index,KingbaseESV8R6,name,idx,sys,索引,sql,size
From: https://www.cnblogs.com/kingbase/p/17711673.html

相关文章

  • KingbaseESV8R6全局临时表不能进行reindex操作
    背景我们经常遇到两种情况下会重建索引,reindex1、索引崩溃,由于软件或硬件问题导致索引内数据失效而不可用。2、索引膨胀,当索引膨胀会占用过多磁盘空间,reindex可以解决此问题。对于临时表和全局临时表而言,临时表可以进行reindex操作,而全局临时表不能进行此操作,原因是全局临时表......
  • 第04章 Spark SQL常用参数
    目录第04章SparkSQL常用参数24.1AQE优化控制24.2SHUFFLE分区个数控制34.3SHUFFLE输入大小控制34.4TASK内存参数34.5TASK同时运行个数34.6其它REDUCE阶段相关参数44.7如何预估每个REDUCE任务处理的数据量6第04章SparkSQL常用参数4.1AQE优化控制通过设置spark.sq......
  • Sql中的窗口函数
    在开发过程中,经常会遇到对分数进行排名的需求,通常的写法大部分都是子查询,而窗口函数可以更加便利的进行分数排列.窗口函数窗口函数是一种在查询结果集的特定窗口或分组中计算结果的函数。它可以根据指定的排序规则和窗口范围进行计算,并返回每个行的结果。窗口函数通常与OVER......
  • 今天安装了SqlServer2005
    手头早就有了一套sqlserver2005,今天上午看了一会儿《sap德国造》,有些累了。想歇息一会儿。在随便浏览电脑的时候,无疑中看到了存储在硬盘上的sqlserver2005安装程序。就猛地萌生了安装它的想法。 虽然sqlserver2005与2000已经区别很大了。但是基于桌面操作系统的应用程序的安装工作......
  • MySQL实战实战系列 03 事务隔离:为什么你改了我还看不见?
    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱。 转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做......
  • windows导出mysql(mysqldump)
      dump.batechooffclsecho正在初始化环境变量……echo.setbackup_date=%date:~0,4%%date:~5,2%%date:~8,2%setdb_name=db_testecho%backup_date%D:\mysql57\bin\mysqldump-hlocalhost-uudumpmonitor-pmysql-P13306%db_name%--default-character-set=ut......
  • Mysql常用处理
    日期处理时间格式化比较DATE_FORMAT(start_time,'%Y-%m-%d')=DATE_FORMAT(now(),'%Y-%m-%d')时间戳比较,注意有些时间戳会加3个000作为后缀,需格式化处理2.UNIX_TIMESTAMP(NOW())<=UNIX_TIMESTAMP(exam_date)实体字段为null设置配置全局处理字段注解@TableField(up......
  • MySQL 8.0 OCP 最新中文考试题库(如需完整版请联系作者)
    大家好!今天要给大家带来的是由Oracle公司研发的MySQL8.0认证考试试题本次试题是全网最全面的试题,总共包含123道。试题正确率在95%以上。对于在今年报考MySQL8.0中文版本的考生有很大的帮助。特别是考试时所遇到的题型,几乎是原题,本人刚考过,特来为大家分享49.使用带有新配置的旧......
  • 创建Oracle索引,过犹不及
    我有几个oracle存储过程,其中有两个涉及到递归运算,相对来说非常费时间的。这几个oracle程序我给他们编号为p1,p2,p3,p4,p5 其中p2,p5有较复杂的递归运算,涉及到的表格主要有4个,分别为t1,t2,t3,t4。另外还有一些基础表。数据首先在基础表中,t1,t2,t3,t4中没有数据。t1,t2,t3,t4的数......
  • MySQL 8.0 OCP 最新中文考试题库(如需完整版请联系作者)
    大家好!今天要给大家带来的是由Oracle公司研发的MySQL8.0认证考试试题本次试题是全网最全面的试题,总共包含123道。试题正确率在95%以上。对于在今年报考MySQL8.0中文版本的考生有很大的帮助。特别是考试时所遇到的题型,几乎是原题,本人刚考过,特来为大家分享49.使用带有新配置的旧......