[20180926]查询相似索引.txt

--//有时候在表上建立索引比如A,B字段,可能又建立B字段索引,甚至A字段索引以及B,A字段索引,或者还建立C,A字段索引,
--//需要有1个脚本查询这些索引,可能还有必要删除一些索引,统一协调建立合适的索引.
--//优化需要,做一个记录.

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

2.建立测试例子:
SCOTT@test01p> create table t (a number,b number,c number);
Table created.

SCOTT@test01p> create index i_t_a_b on t(a,b);
Index created.

SCOTT@test01p> create index i_t_c_b on t(c,b);
Index created.

--//网上找到的例子:
SELECT TABLE_OWNER, TABLE_NAME, INDEX_NAME, COLUMN_NAME
  FROM ALL_IND_COLUMNS
 WHERE COLUMN_POSITION = 1
   AND TABLE_OWNER     = UPPER ('&&1')
   AND (TABLE_OWNER, TABLE_NAME, COLUMN_NAME) IN (
        SELECT TABLE_OWNER, TABLE_NAME, COLUMN_NAME
          FROM (
                SELECT TABLE_OWNER, TABLE_NAME, COLUMN_NAME, COUNT (*) TCOUNT
                  FROM ALL_IND_COLUMNS
                 WHERE TABLE_OWNER NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP')
                HAVING COUNT (*)       > 1
 GROUP BY TABLE_OWNER, TABLE_NAME, COLUMN_NAME))
 ORDER BY TABLE_OWNER, TABLE_NAME, COLUMN_NAME, INDEX_NAME;

--//实际上这个例子在我们生产系统根本无法执行,表N多,1个小时都没有查询出来.而且像上面建立的索引是无法找到的.
--//因为它仅仅针对COLUMN_POSITION = 1的情况.

--//使用with改写如下:
/* Formatted on 2018/9/25 22:19:20 (QP5 v5.227.12220.39754) */
WITH t1
     AS (SELECT TABLE_OWNER
               ,TABLE_NAME
               ,INDEX_NAME
               ,COLUMN_NAME
               ,COLUMN_POSITION
           FROM ALL_IND_COLUMNS
          WHERE TABLE_OWNER = UPPER ('&&1'))
    ,t2
     AS (  SELECT DISTINCT TABLE_OWNER
                          ,TABLE_NAME
                          ,INDEX_NAME
                          ,COLUMN_NAME
             FROM t1
            WHERE (TABLE_OWNER, TABLE_NAME, COLUMN_NAME) IN
                     (SELECT TABLE_OWNER, TABLE_NAME, COLUMN_NAME
                        FROM (  SELECT TABLE_OWNER
                                      ,TABLE_NAME
                                      ,COLUMN_NAME
                                      ,COUNT (*) TCOUNT
                                  FROM T1
                                HAVING COUNT (*) > 1
                              GROUP BY TABLE_OWNER, TABLE_NAME, COLUMN_NAME))
         ORDER BY TABLE_OWNER
                 ,TABLE_NAME
                 ,COLUMN_NAME
                 ,INDEX_NAME)
    ,t3
     AS (  SELECT TABLE_OWNER
                 ,TABLE_NAME
                 ,INDEX_NAME
                 ,LISTAGG (column_name, ', ')
                     WITHIN GROUP (ORDER BY column_position)
                     AS column_group
             FROM t1
         GROUP BY TABLE_OWNER, TABLE_NAME, INDEX_NAME)
SELECT TABLE_OWNER
      ,TABLE_NAME
      ,INDEX_NAME
      ,column_group
  FROM t3
 WHERE (TABLE_OWNER, TABLE_NAME, INDEX_NAME) IN
          (SELECT TABLE_OWNER, TABLE_NAME, INDEX_NAME FROM t2);

TABLE_OWNER          TABLE_NAME           INDEX_NAME           COLUMN_GROUP
-------------------- -------------------- -------------------- ----------------------
SCOTT                T                    I_T_A_B              A, B
SCOTT                T                    I_T_C_B              C, B

--//补充:在生产系统使用不到1秒就执行完成.
--//换一个参数OE.
Enter value for 1: OE
old   8:           WHERE TABLE_OWNER = UPPER ('&&1'))
new   8:           WHERE TABLE_OWNER = UPPER ('OE'))

TABLE_OWNER          TABLE_NAME           INDEX_NAME           COLUMN_GROUP
-------------------- -------------------- -------------------- -------------------------------------------------
OE                   INVENTORIES          INVENTORY_IX         WAREHOUSE_ID, PRODUCT_ID
OE                   INVENTORIES          INV_PRODUCT_IX       PRODUCT_ID
OE                   ORDER_ITEMS          ITEM_ORDER_IX        ORDER_ID
OE                   ORDER_ITEMS          ORDER_ITEMS_PK       ORDER_ID, LINE_ITEM_ID
OE                   ORDER_ITEMS          ORDER_ITEMS_UK       ORDER_ID, PRODUCT_ID
OE                   ORDER_ITEMS          ITEM_PRODUCT_IX      PRODUCT_ID
6 rows selected.

--//如果使用网上的脚本结果如下:

SCOTT@test01p> SELECT TABLE_OWNER, TABLE_NAME, INDEX_NAME, COLUMN_NAME
  2    FROM ALL_IND_COLUMNS
  3   WHERE COLUMN_POSITION = 1
  4     AND TABLE_OWNER     = UPPER ('&&1')
  5     AND (TABLE_OWNER, TABLE_NAME, COLUMN_NAME) IN (
  6             SELECT TABLE_OWNER, TABLE_NAME, COLUMN_NAME
  7               FROM (
  8                             SELECT TABLE_OWNER, TABLE_NAME, COLUMN_NAME, COUNT (*) TCOUNT
  9                               FROM ALL_IND_COLUMNS
 10                              WHERE TABLE_OWNER NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP')
 11                             HAVING COUNT (*)       > 1
 12   GROUP BY TABLE_OWNER, TABLE_NAME, COLUMN_NAME))
 13   ORDER BY TABLE_OWNER, TABLE_NAME, COLUMN_NAME, INDEX_NAME;
old   4:    AND TABLE_OWNER     = UPPER ('&&1')
new   4:    AND TABLE_OWNER     = UPPER ('OE')
TABLE_OWNER          TABLE_NAME           INDEX_NAME           COLUMN_NAME
-------------------- -------------------- -------------------- --------------------
OE                   INVENTORIES          INV_PRODUCT_IX       PRODUCT_ID
OE                   ORDER_ITEMS          ITEM_ORDER_IX        ORDER_ID
OE                   ORDER_ITEMS          ORDER_ITEMS_PK       ORDER_ID
OE                   ORDER_ITEMS          ORDER_ITEMS_UK       ORDER_ID
OE                   ORDER_ITEMS          ITEM_PRODUCT_IX      PRODUCT_ID

--//1.结果不同,存在遗漏.
--//2.明显感觉执行很慢.
--//3.显示不直观.

[20180926]查询相似索引.txt的更多相关文章

  1. Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题

    Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...

  2. MySQL多表查询之外键、表连接、子查询、索引

    MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...

  3. [20190226]测试使用bbed恢复索引.txt

    [20190226]测试使用bbed恢复索引.txt --//上午做tab$删除恢复测试时发现,tab$的索引i_tab1很小.可以尝试使用bbed解决这个问题.--//首先在普通表上做一个测试看看. ...

  4. oracle查询不走索引的一些情况(索引失效)

    Oracle建立索引的目的是为了避免全表扫描,提高查询的效率. 但是有些情况下发现即使建立了索引,但是写出来的查询还是很慢,然后会发现是索引失效导致的,所以需要了解一下那些情况会导致索引失效,即查询不 ...

  5. Mongodb 笔记03 查询、索引

    查询 1. MongoDB使用find来进行查询.find的第一个参数决定了要返回哪些文档,这个参数是一个文档,用于指定查询条件.空的查询会匹配集合的全部内容.要是不指定查询,默认是{}. 2. 可以 ...

  6. 为何在查询中索引未被使用 (Doc ID 1549181.1)

        To Bottom * 为何在查询中索引未被使用 (Doc ID 1549181.1) To Bottom 文档内容 用途   排错步骤   高速检查   表上是否存在索引?   索引是否应该 ...

  7. MongoDB的第二天(更新,删除,查询,索引)

    Mongodb的更新方式有三种 update函数,操作符更新,save函数 update: 语法格式:db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选) ...

  8. mysql中的回表查询与索引覆盖

    了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...

  9. elasticsearch查询篇索引映射文档数据准备

    elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...

随机推荐

  1. Unity UI性能优化技巧

    本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...

  2. leetcode — anagrams

    import java.util.*; /** * * Source : https://oj.leetcode.com/problems/anagrams/ * * Created by lverp ...

  3. 【WebApi系列】浅谈HTTP在WebApi开发中的运用

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  4. Spring基础系列-容器启动流程(2)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9503210.html 一.概述 这里是Springboot项目启动大概流程,区别于SSM ...

  5. Mybatis(六) Spring整合mybatis

    心莫浮躁~踏踏实实走,一步一个脚印,就算不学习,玩,能干嘛呢?人生就是那样,要找点有意思,打发时间的事情来做,而钻研技术,动脑动手的过程,还是比其他工作更有意思些~ so,努力啥的都是强迫自己做自以为 ...

  6. vs2010打不开vs2017的.sln文件,出现错误提示 “选择的文件是解决方案文件 但是用此应用程序的较新版本创建的,无法打开”

    解决方案: 1.复制下面这段语句 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 2. ...

  7. C#设计模式之七桥接模式(Bridge Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的,英文名称:Bridge Pattern.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称 ...

  8. 6;XHTML 超链接

    1.超链接的基本格式 2.超链接的种类 3.相对链接和绝对链接 4.书签的链接 5.基准参考点 6.超链接事件 7.为链接创建键盘快捷键 8.为链接设置制表符次序 超链接也叫 URL 中文翻译为资源定 ...

  9. 魔幻般冒泡背景的CSS3按钮动画

    这是一款非常有特点的CSS3按钮,按钮的背景不是北京图片,也不是单纯的颜色,而是一组魔幻般的冒泡背景动画.当我们将鼠标滑过按钮时,按钮的冒泡背景动画就可以展示出来.可以说这款CSS3按钮的设计风格相当 ...

  10. Sql 判断函数是否存在、sql判断表是否存在、sql判断存储过程是否存在、sql判断视图是否存在

    --数据库是否存在 IF exists(SELECT * FROM master..sysdatabases WHERE name=N'库名') PRINT 'exists' ELSE PRINT ' ...