四千岁爷 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日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)