表的字段date_id定义为Integer型,并且date_id为本表分区字段。现在有一个处理,需要取表中本月第一条到目前的累积数据。
老虎的sql如下:
select *
FROM PV_MART_A.FIN_MID_SERV_INC_DAILY A1
WHERE Date_Id <=CAST('20090818' AS INTEGER)-2
and substr(cast(date_id as VARCHAR(8)),1,6)=substr((cast((CAST(CAST('20090818' AS DATE FORMAT 'YYYYMMDD')-2 AS INTEGER)+19000000) as varchar(8))),1,6)
;
因为上述sql条件等号的左右都做了处理,毫无疑问她不会走分区。
select *
FROM PV_MART_A.FIN_MID_SERV_INC_DAILY A1
WHERE Date_Id between (date - extract(day from date) + 1)/1+19000000 and CAST('20090818'AS INTEGER)-2
;
仍不走分区,但sql改成:
select *
FROM PV_MART_A.FIN_MID_SERV_INC_DAILY A1
WHERE Date_Id between 20090801 and 20090816;
可以走分区,请问有没有什么办法让其走分区?
经过多次实验,sql改成如下样子会走分区:
select *
FROM PV_MART_A.FIN_MID_SERV_INC_DAILY A1
WHERE Date_Id between cast(trim(substr('20090818',1,6))||'01' as integer) and CAST('20090818'AS INTEGER)-2
;
问题解决了,调优目的达到了,但是没有搞明白优化器为什么做这种选择。
闲了好好研究研究优化器的操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16723161/viewspace-1027097/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/16723161/viewspace-1027097/