我们的报表为什么会慢
1.为图方便写代码,写SQL的时候,直接在有索引的列上直接用函数
举个例子:销售单上销售日期这个列上键有所有,要根据年和月2个参数来查询某个月的销售单数据,很多就是这样写的:以MS-SQL为例
select * from 销售单 where year(销售日期)=${年份} and month(销售日期)=${月份}
其实这样会导致索引失效,如果销售单这个表上的数据比较多,那么执行就会非常慢
正确的写法:改变思路,在参数上执行计算,比方说查询2017年10月份的,转换成销售日期>='2017-10-01' and 销售日期<'2017-11-01'这种形式
select * from 销售单 where 销售日期 >= DATEADD(MONTH,${月份}-1,DATEADD(YEAR,${年份}-1900,'1900-01-01')) and 销售日期= '2017-10-01' and 销售日期 < '2017-11-01' --返回50万条记录
正确的做法:
select 地区,sum(销售金额) as 销售金额 from 销售单 where 销售日期 >= '2017-10-01' and 销售日期 < '2017-11-01' group by 地区--有多少个门店返回多少条记录
这样能减少数据从数据库返回到报表服务器的I/O开销
5.在报表数据多的时候,做SQL注入查询。仍然以销售单为例,比方说销售单上有客户ID,没有客户地址,客户地址存在客户信息表上,我们需要做一个销售单明细报表,上面要有客户地址,有的人会这样写来获取客户地址:
在单元格中设置公式
=sql("销售数据","select 客户地址 from 客户信息 where 客户ID = '"+B3+"'",1,1)
这样的做法会导致B3单元格扩展多少次,这个SQL脚本就会执行多少次,之前我有个报表用类似的方法来写,导致一个返回几千条数据的报表,执行了10几分钟还没执行完。
正确的做法是:尽量在SQL中进行关联,而不是在FR设计器中用条件过滤或者公式去关联取数