为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM7
【操作系统】:
【CPU】:
【问题描述】*:
如图所示,我希望在select PDATE,seqid,jyqxid
from NMJY.T_JYGL_CJMX_VLD_FYDJY
WHERE pdate>'2023-10-01'
and BIDSIGN='11'
创建pdate和bidsign字段的联合索引,并且pdate需要一个时间范围,如何建立?
根据当前统计信息和执行计划的结果集来看,应该是pdate字段过滤性不好,可以尝试建立BIDSIGN字段和PDATE字段的组合索引,即 将当前组合索引反过来。
看下下面两点:
首先,PDATE 字段是字符型的么?
第二,目前表上已经有索引了么?
然后做个试验,查一下下面SQL
SELECT COUNT(1) AS CNT
,COUNT(DISTINCT PDATE) AS CNT_PDATE
,COUNT(DISTINCT BIDSIGN) AS CNT_BIDSIGN
,SUM(CASE WHEN PDATE >'2023-10-01' AND BIDSIGN = '11' THEN 1 END) AS CNT_FILT
FROM NMJY.T_JYGL_CJMX_VLD_FYDJY
如果目前表上还没有索引那就用:
CREATE INDEX IDX_T_JYGL_CJMX_VLD_FYDJY_TST1 ON NMJY.T_JYGL_CJMX_VLD_FYDJY(PDATE,BIDSIGN)
索引里两个字段的顺序可以看 PDATE和BIDSIGN唯一数结果值除以CNT得到占比排序,占比高的排到前面
增加索引后,再查一下执行计划,看看索引是否用上
另外,还要看查询结果中 CNT_FILT 与 CNT 值很接近,则估计有可能用不上这个索引
pdate是分区列????