为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:执行以下DDL语句
CREATE TABLE INDICATOR_PROD.SY_PERSON_LIST (
"c0001" VARCHAR(100),
"c0002" VARCHAR(300),
"c0003" VARCHAR(100),
"c0004" INT,
"c0005" VARCHAR(100),
"c0006" VARCHAR(100),
"c0007" INT,
"c0008" VARCHAR(100),
"c0009" INT,
"c0010" INT,
"c0011" INT,
"c0012" VARCHAR(300),
"c0013" VARCHAR(100),
"c0014" VARCHAR(300),
"c0015" VARCHAR(100),
"c0016" VARCHAR(100),
"c0017" VARCHAR(100),
"c0018" VARCHAR(100),
"c0019" VARCHAR(100),
"c0020" VARCHAR(100),
"c0021" VARCHAR(100),
"c0022" VARCHAR(100),
"c0023" VARCHAR(100),
"c0024" VARCHAR(100),
"c0025" VARCHAR(100),
"c0026" VARCHAR(300),
"c0027" VARCHAR(100),
"c0028" VARCHAR(10),
"c0029" VARCHAR(100),
"c0030" INT,
"c0031" VARCHAR(100),
"c0032" INT
);
CREATE INDEX IDX_SY_PERSON_LIST_C0001 ON INDICATOR_PROD.SY_PERSON_LIST ("c0001");
CREATE INDEX IDX_SY_PERSON_LIST_C0017 ON INDICATOR_PROD.SY_PERSON_LIST ("c0017");
CREATE INDEX IDX_SY_PERSON_LIST_C0018 ON INDICATOR_PROD.SY_PERSON_LIST ("c0018");
CREATE INDEX IDX_SY_PERSON_LIST_C0019 ON INDICATOR_PROD.SY_PERSON_LIST ("c0019");
CREATE INDEX IDX_SY_PERSON_LIST_C0020 ON INDICATOR_PROD.SY_PERSON_LIST ("c0020");
CREATE INDEX IDX_SY_PERSON_LIST_C0021 ON INDICATOR_PROD.SY_PERSON_LIST ("c0021");
CREATE INDEX IDX_SY_PERSON_LIST_C0028 ON INDICATOR_PROD.SY_PERSON_LIST ("c0028");
CREATE INDEX IDX_SY_PERSON_LIST_C0029 ON INDICATOR_PROD.SY_PERSON_LIST ("c0029");
CREATE INDEX IDX_SY_PERSON_LIST_C0030 ON INDICATOR_PROD.SY_PERSON_LIST ("c0030");
CREATE INDEX IDX_SY_PERSON_LIST_C0031 ON INDICATOR_PROD.SY_PERSON_LIST ("c0031");
CREATE INDEX IDX_SY_PERSON_LIST_UNION_HJ ON INDICATOR_PROD.SY_PERSON_LIST ("c0028","c0017");
CREATE INDEX IDX_SY_PERSON_LIST_UNION_HJJD ON INDICATOR_PROD.SY_PERSON_LIST ("c0028","c0018");
CREATE INDEX IDX_SY_PERSON_LIST_UNION_HJSQ ON INDICATOR_PROD.SY_PERSON_LIST ("c0028","c0019");
CREATE INDEX IDX_SY_PERSON_LIST_UNION_WG ON INDICATOR_PROD.SY_PERSON_LIST ("c0030","c0017");
CREATE INDEX IDX_SY_PERSON_LIST_UNION_WGJD ON INDICATOR_PROD.SY_PERSON_LIST ("c0030","c0018");
CREATE INDEX IDX_SY_PERSON_LIST_UNION_WGSQ ON INDICATOR_PROD.SY_PERSON_LIST ("c0030","c0019");
该表每天清空并更新所有数据;
执行该SQL语句,走的全表,需要7s
SELECT * FROM INDICATOR_PROD.SY_PERSON_LIST WHERE 1=1 AND c0028 = '2' LIMIT 6;
同样的语句,在select * 后面加回车换行符,
SELECT *
FROM INDICATOR_PROD.SY_PERSON_LIST WHERE 1=1 AND c0028 = '2' LIMIT 6;
此时只需200ms,即可查询出结果,执行计划与上面的一致。
执行该SQL语句,仍然走的全表,一样需要7s
SELECT
c0001,
c0002,
c0003,
c0004,
c0005,
c0006,
c0007,
c0008,
c0009,
c0010,
c0011,
c0012,
c0013,
c0014,
c0015,
c0016,
c0017,
c0018,
c0019,
c0020,
c0021,
c0022,
c0023,
c0024,
c0025,
c0026,
c0027,
c0028,
c0029,
c0030
FROM INDICATOR_PROD.SY_PERSON_LIST WHERE 1=1 AND c0028 = '2' LIMIT 6;
SQL语句加上hint , 也没有走索引,/* + INDEX(INDICATOR_PROD.SY_PERSON_LIST,IDX_SY_PERSON_LIST_C0028) */
该表每天进行truncate 并 重新插入2千万数据 ,这个应该怎么调整索引?
这个感觉跟select * 后面换不换行不影响,是不是执行的时候带了explain。如果直接执行sql,加个换行影响查询时间,可以造个对应的测试demo发上来,另外最好说明下你使用的数据库具体版本。
truncate之后,要收集统计信息
SP_TAB_STAT_INIT('INDICATOR_PROD','SY_PERSON_LIST');--收集表
SP_INDEX_STAT_INIT('INDICATOR_PROD','IDX_SY_PERSON_LIST_C0028',100);收集索引
hint写法
/*+ INDEX(SY_PERSON_LIST IDX_SY_PERSON_LIST_C0028) */