sql 检索的写法和技巧

 

尽量在 sql 里进行 group

对于汇总类型的报表,往往需要进行分组聚集运算,如果在数据库中先进行一次分组聚集,能够大大减少取到报表服务器的记录数,加快取数和报表运算的速度。

这是一个典型的交叉分组报表,其 sql 有两种写法:
第一种:select 产品,客户,销量 from 购买记录表
第二种:select 产品,客户,sum(销量) from 购买记录表 group by 产品,客户

分析:

采用第一种做法,不仅仅取到报表服务器上记录数多了,取数速度慢,而且在报表端对购买记录表进行分组运算的时候速度也慢了;
采用第二种做法,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快,且取到报表服务器端的记录数大大减少,取数速度大大加快,因此在报表端进行分组运算的时候只要对很少的记录数进行,报表的运算速度大大加快了
总结:第二种做法的性能远远优于第一种

尽量不用 select * from

对于初学者来说,这是一个很容易犯的错误,例如报表中只需要用到三个字段,但是数据库中实际的表有十个字段,一些初学者习惯性的用 select * from table1,这样相当于把十个字段的数据都取到报表服务器端,增加了报表服务器端的内存占用以及减慢了运算速度
正确的写法是:select col1,col2,col3 from table1,即用到哪几个字段就取哪几个,用不着的不要取

尽量在 sql 里排序

报表中往往需要对数据进行排序,排序运算可以在数据库中进行,也可以在报表端进行,如果报表中的排序规则是确定的,那么建议排序操作选择在数据库端进行,因为数据库中有索引,且数据库是 c 语言开发的,数据运算速度快。

尽量在 sql 里过滤

这个问题和前面的是类似的,报表很多时候并不需要对表中的所有记录进行操作,而是对部分满足条件的记录进行操作,因此建议过滤操作在数据库中进行,这样取到报表服务器端的记录数大大减少,既加快了取数的速度,也加快了报表的运算速度,因为报表需要处理的数据少了。

数据量过大可以采用大数据集或者脚本取数

数据涉及到几百万上千万以及更多的数据时,可以试用大数据集展现,能在报表展现性能上有了很大提升,把数据不断分批取出,存储到临时文件中。这样用外存来换取内存,从而大大提高了报表的预览速度,使得大报表运算和普通报表运算速度无异。
可用 tag 标签完成大报表的解析及运算,并按用户配置的属性要求将 html 文件流输出到客户端。