四千岁爷
2021-06-16 18:25
采纳率: 100%
浏览 14

Oracle数据库创建索引时该怎么选择索引?

请大家帮忙分析一下下面这种情况,Oracle数据库应该怎么创建索引。我们使用的Oracle版本为:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production。

我们有一张表TABLE_DATA,表结构如下:

create table TABLE_DATA
(
  c_id                    VARCHAR2(32) not null,
  c_order_no              VARCHAR2(50),
  c_real_order_no         VARCHAR2(30),
  col_1                   VARCHAR2(30),
  col_2                   CHAR(1),
  t_crt_tm                DATE,
  t_upd_tm                DATE,
  c_suc_mrk               CHAR(1),
  n_sum_cyc               NUMBER,
  col_2                   VARCHAR2(50),
  col_2                   VARCHAR2(1000),
  col_2                   VARCHAR2(1000),
  c_plat_typ              VARCHAR2(6),
  col_2                   VARCHAR2(10),
  col_2                   VARCHAR2(50),
  col_2                   VARCHAR2(50),
  col_2                   VARCHAR2(50),
  col_2                   VARCHAR2(10),
  col_2                   VARCHAR2(2000),
  col_2                   VARCHAR2(200),
  col_2                   VARCHAR2(200),
  col_2                   VARCHAR2(20),
  c_sms_mrk               VARCHAR2(1),
  col_2                   VARCHAR2(1),
  col_2                   VARCHAR2(1),
  col_3                   VARCHAR2(2)
)

这张表现在有10903027条数据,这张表目前只有c_id  ,c_order_no ,c_real_order_no 这三个列有创建索引,都是普通索引index。

其中c_plat_typ这一列的值是枚举值,c_plat_typ的值大概有20种不同的值,也有可能有空值。

C_SUC_MRK这一列的值也是枚举值,C_SUC_MRK的值有5种不同的值,也有可能有空值。

问题是:

1、我们查询的时候经常会用c_plat_typ和C_SUC_MRK作为WHERE条件进行查询,并且查询速度较慢。

下面这个SQL查出来627条数据,花了3秒钟,我感觉太慢了。

SELECT c_order_no , c_real_order_no , C_PLAT_TYP
          FROM TABLE_DATA 
         WHERE C_PLAT_TYP = 'ATYPE'
           AND C_SUC_MRK ='0';

下面这个SQL查出来9条数据,花了5.2秒钟,我感觉太慢了。

SELECT c_order_no, c_real_order_no, C_PLAT_TYP

  FROM (SELECT c_order_no, c_real_order_no, C_PLAT_TYP,
          FROM TABLE_DATA s1
         WHERE C_PLAT_TYP = 'GJEPDF'
           AND C_SUC_MRK IN ('0')
           AND EXISTS (SELECT s2.c_order_no
                  FROM TABLE_DATA  s2
                 WHERE s2.C_PLAT_TYP = 'GJSPDF'
                   AND s2.C_SUC_MRK = 'S'
                   AND s1.c_order_no= s2.c_order_no)
         ORDER BY T_CRT_TM DESC)
 WHERE rownum < 1000

问:根据我们表的情况要优化上面俩个SQL,c_plat_typ和C_SUC_MRK这俩个列是否适合建立索引。适合建什么索引?

如果要建索引,应该建普通的index索引呢还是bitmap位图索引

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

  • 脑子进水养啥鱼? 2021-06-16 23:07
    最佳回答

    两个字段同时可能出现空值且更新不频繁可以用位图索引

    两个字段不会同时出现空值可以用复合索引

    不同B树索引不存空值

    可参考

    https://www.cnblogs.com/yumiko/p/5927611.html

    可以根据业务需求,详细测下

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题