UniverseSae
作者UniverseSae·2015-07-19 23:27
数据库管理员·待业

调优笔记:检查表是否有重复索引

字数 2356阅读 1920评论 7赞 2

我日常需要管理的一个大数据库中,索引较多,大约有5000~7000组索引(上线一个大版本时会增加许多索引),索引多时,总需要定期进行一些维护工作,比如清理一些从没用过的索引,又或者一张很小的表,却增加很多组字段结构相差不多的重复索引,这些都是要对索引进行维护的日常工作。

假设表中存在A、B两组索引:

索引A的字段为name,age

索引B的字段为name,age,city

那么即认为索引A为重复索引,本文只讨论如何定位重复索引,并不是说重复索引就一定是"重复"多余的,而我在日常管理索引时,我会结合该被标识"重复"索引的很多信息进行深入分析,比如tcb基准(可参考我另外的博文得到索引的tcb信息)、reorgchk的F4-F8等等,是否该删除或者重组等等工作。

可以参考以下SQL进行查询出来:

WITH t

AS (

        SELECT CASE

                WHEN a.colnames <> b.colnames AND trim(a.colnames) || '+' LIKE trim (b.colnames) || '+%'

                THEN 'YES'

                ELSE 'NO'

               END duplicate

                ,a.tabschema

                ,a.tabname

                ,a.indname

                ,a.colnames AS colnames1

                ,b.colnames AS colnames2

        FROM syscat.indexes a

        LEFT JOIN syscat.indexes b ON a.tabname = b.tabname

        )SELECT

        duplicate

        ,tabschema

        ,tabname

        ,indname

        ,colnames1

        ,(CASE

            WHEN duplicate = 'YES'   THEN '存在重复索引[' CONCAT colnames2 CONCAT ']'

            ELSE '不存在重复索引' 

          END ) remark

FROM t

WHERE duplicate = 'YES'  and colnames2 <> ''

ORDER BY tabname

WITH ur


PS:以上SQL为我日常调优笔记中摘取,可能有格式问题未能成功执行。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论7 条评论

zhendazhenda数据库管理员昆仑银行
2015-08-05 16:31
ppjava2009: WITH t AS (
SELECT CASE WHEN a.colnames<>b.colnames
                 AND locate(trim(a.colnames)||'+', trim(b.colnames))=1
            THEN 'yes
这个是在相同的表中做不同索引字段判断。这个查询结果也汇集了不同表的相同索引字段名称。改进一下就好了。
ppjava2009ppjava2009系统工程师用友汽车信息科技(上海)有限公司
2015-07-28 10:09
WITH t AS (
SELECT CASE WHEN a.colnames<>b.colnames
                 AND locate(trim(a.colnames)||'+', trim(b.colnames))=1
            THEN 'yes'
            ELSE 'no'
            END duplicate,
        a.tabschema, a.tabname, a.indname,
        a.colnames as colnames1, b.colnames as colnames2
  FROM syscat.indexes a
  LEFT JOIN syscat.indexes b ON a.tabname=b.tabname
)
SELECT duplicate, tabschema, tabname, indname, colnames1,
      (CASE WHEN duplicate='yes' THEN '存在重复索引['||colnames2||']' ELSE '不存在重复索引' END) remark
  FROM t
WHERE duplicate='yes'
   AND colnames2<>''
ORDER BY tabname
  WITH UR
ppjava2009ppjava2009系统工程师用友汽车信息科技(上海)有限公司
2015-07-28 09:53
我在db2 v9.7中尝试like表达式的写法是不正确的,可以使用locate函数替换
and locate(trim(a.colnames), trim(b.colnames)||'+')=1
lxpeng163lxpeng163项目经理哈尔滨银行
2015-07-26 21:09
very good
drdb2drdb2系统工程师se
2015-07-22 00:40
very best stuff
梦幻涛梦幻涛商业智能工程师华腾
2015-07-21 10:37
cool
weiruan85weiruan85数据库管理员ibm
2015-07-20 09:32
支持
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广