有一个这样的表:CREATE TABLE t1 ( "BUSEVENT_ID"BIGINTNOT NULL, "SEQUENCE"INTEGERNOT NULL, "CREATETSTMP"TIMESTAMPNOT NULL, "EVENTDATA"VARCHAR(4000)NOT NULL, "CHECKED"SMALLINT, "OPTCOUNTER...
显示全部
有一个这样的表:CREATE TABLE t1 (
"BUSEVENT_ID"
BIGINT
NOT NULL,
"SEQUENCE"
INTEGER
NOT NULL,
"CREATETSTMP"
TIMESTAMP
NOT NULL,
"EVENTDATA"
VARCHAR(4000)
NOT NULL,
"CHECKED"
SMALLINT,
"OPTCOUNTER"
SMALLINT,
"EVENT_SEARCHKEY"
CHARACTER(64)
)
数据量有180W左右,目前有两个索引:idx_p(BUSEVENT_ID,SEQUENCE)和idx1(CHECKED,BUSEVENT_id),idx_p是主键。
CHECKED的值分布,只有三个值,-10,-20,-30,其中大部分都是,-10,其它两值只占几K条记录。
有这样一个操作:DELETE FROM t1
WHERE CREATETSTMP < ? AND CHECKED = ?,查看它的执行计划,是走的是主键,然后回表DELETE。做优化的时候,创建idx2(CREATETSTMP,CHECKED)或idx3(CHECKED,CREATETSTMP) 。
以前看过一些资料,组合索引什么列做前导列,对其本身影响并不太,即idx2和idx3对上面的DELETE操作,影响并不太。(现在对其保留意见)
由于已有IDX1是CHECKED做前导列,所以为了发拔索引的最大功效,我建了IDX2。但实际上建IDX2后,我查看其执行计划,它并不是走IDX2,而是走了IDX1。有点莫名其妙了,最后我删除IDX2,创建IDX3,这次它就走了IDX3了,达到了我们的优化目的。
但IDX2和IDX3对那个DELETE的操作不是一样的么?为什么效果不一样的呢?难道是因为CHECKED是等值条件,CREATETSTMP 是范围条件?
收起