四千岁爷 2021-06-16 18:25 采纳率: 66.7%
浏览 21
已结题

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月22日
  • 已采纳回答 10月14日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装