为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.1
【操作系统】:centos7
【CPU】:x86
【问题描述】*:sql使用时间戳字段作为排序字段,查询异常缓慢.(数据量600w)
sql:
SELECT
pi.PS_MSG_ID,
pi.PS_CODE,
pi.CLIENT_NAME,
pi.REQ_TIME,
pi.ERR_FLAG
FROM
SRRC_OSB_PS_INVOKE pi
WHERE
pi.err_flag = 'N'
and pi.ps_code like 'PS%'
order by pi.REQ_TIME
相关索引定义:
CREATE INDEX "INDEX_REQ_TIME" ON "xxx"."SRRC_OSB_PS_INVOKE"("REQ_TIME" DESC) STORAGE(ON "xxx", CLUSTERBTR) ;
CREATE INDEX "INDEX_PS_PS_CODE" ON "xxx"."SRRC_OSB_PS_INVOKE"("PS_CODE" DESC) STORAGE(ON "xxx", CLUSTERBTR) ;
CREATE INDEX "INDEX_PS_ERR_FLAG" ON "xxx"."SRRC_OSB_PS_INVOKE"("ERR_FLAG" ASC) STORAGE(ON "xxx", CLUSTERBTR) ;
其中REQ_TIME,ps_code,err_flag都加了索引.req_time降序索引.
执行计划:
请问改如何优化,使其查询速度在有排序的情况下提升,感谢.
注:所搜相关问题后,未能解决问题,故提问.
现在查询时间稳定在11s左右,不知道这个查询速度在600w数量级是否是正常的速度.
把相关的索引的定义发出来看看
索引里面的排序顺序应该和order by里面的顺序一致,注意:如果在三个字段组合过滤性好的情况下,你可以根据实际情况建立组合索引,如下:
create index index_text_001 on SRRC_OSB_PS_INVOKE(REQ_TIME asc,err_flag,ps_code,);
统计信息请100%更新,STAT 100 ON SRRC_OSB_PS_INVOKE(err_flag);STAT 100 ON SRRC_OSB_PS_INVOKE(ps_code);STAT 100 ON SRRC_OSB_PS_INVOKE(REQ_TIME );
可以尝试创建一个ERR_FLAG和REQ_TIME的组合索引:
CREATE OR REPLACE INDEX “INDEX_PS_ERR_FLAG” ON “xxx”.“SRRC_OSB_PS_INVOKE”(“ERR_FLAG” ASC,REQ_TIME DESC) STORAGE(ON “xxx”, CLUSTERBTR) ;
收集一下表和索引的统计信息:
DBMS_STATS.GATHER_TABLE_STATS(用户名,表名,‘’,100,TRUE,‘FOR ALL COLUMNS SIZE AUTO’);
再看看执行计划有没有变化