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位图索引?