select a.ORDERSOURCE,a.SHOPCODE,count(distinct a.ORDERCODE),sum(b.AMT)
from ORDER a
join ORDERPAYMENT b on a.ORDERCODE = b.ORDERCODE
where a.CREATEDATE >= date'2019-03-10' and
a.CREATEDATE <= date'2019-04-13'+18/24 and (a.ORDERSOURCE=26 or a.ORDERSOURCE=4) and a.CHANGETYPE=0 and a.ORDERSTATUS =3 and a.PAYCONCODE = '1'
and b.BILLTYPE=1 and b.PAYTYPECODE = 'alipay'
group by a.ORDERSOURCE,a.SHOPCODE
两张表数量都在千万级,ORDER表中ORDERCODE 是主键,CREATEDATE 有索引,ORDERPAYMENT表 中ORDERCODE 有索引
查询计划:
为什么ORDERPAYMENT表一直被全表扫描?
你这个执行计划里显示用到CREATEDATE的索引了吧,索引全表扫那行显示的就是使用索引的名称,这段sql的主要耗时在连接和group by上面;
索引是在查询部分数据时可以加快速度,如果要全表查询的话索引是没有加快效率的,如果b表的条件比较常用的话可以在那些字段上加索引,你不加索引的话 B表肯定是全表扫
junk box: CREATEDATE IDX
没太明白,CREATEDATE已经有索引的