互联网服务

碰到索引的一个问题

有一个这样的表: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 是范围条件? 收起
参与5

查看其它 3 个回答galzero 的回答

galzero galzero 数据库管理员 交通银行太平洋信用卡中心
其实只有三个值-10,-20,-30的话 优化器很可能不选择走索引的
建议用MDC表
金融其它 · 2012-04-26
浏览818

回答者

galzero
数据库管理员 交通银行太平洋信用卡中心
评论15

galzero 最近回答过的问题

回答状态

  • 发布时间:2012-04-26
  • 关注会员:1 人
  • 回答浏览:818
  • X社区推广