最近遇上一个项目,很是纠结。不确定怎么处理,希望高手指点迷津。在此谢过!!
要求:从20多个表中抽出相关联的数据导出为平面文件。
描述:实际上就是生成页面浏览的报表信息,但是是从运用的数据库查询出,而不是数据仓库。相关联的表有20(a,b,c.......n)多个,所有的表由一个code直接或间接关联,像这种情况可能会马上会想到有关联的code就可从(a,b,c....n)联合查询出想要的数据就OK了,但是我的妈呀这表太多了,不是3,4张表,所以不敢确定着是唯一的方法,如果要这样联合查询出结果,那sql语句可能写的都离谱了,而我想了另一种方法,根据要查询的数据范围,借用数据仓库的思想,为其建数据模型,在把数据填充到模型中,直接从模型中查数据,这样效率就大大不同了。由于没在这样的情况下使用过,也不确定。
需求:请求高手指点该用什么方法实现好,以及性能方面给出宝贵建议,能具体甚好!!!thanks in advance.
其实啊,这都的具体问题具体分析,如果不了解查询语句是怎么写的,每张表是什么结构,要提取什么类型的字段,那么解决方案都是盲目的。如果仅仅根据有20张表要通过一个字段来关联查询就能提供一个很好的解决方案,那还要你们干什么?你的价值就在于你能做到具体问题具体分析,并提供适当的解决方案。
首先申明,我说的只是想法!进入正题:如果有表20而且需求是查询,那么我认为可以考虑使用视图,如20个表创建5个视图,那么就可以连接查询这5个视图
其实我认为最好的办法,是使用存储过程,一次书写N次调用,简单而高效
也不多啊,我记得以前做过财务报表,虽然只有5,6张表,但是因为数据整合的原因,自连接了N次,相当于几十张表联合查询了,sql语句就有6000多字节,调试花了一个星期。开始速度要花1分钟,到最后3秒钟不到。也是一个sql语句。
视图是一个好办法
每次都用两个表操作,得到结果后再与下一个表操作。
其实楼猪已经想到办法了。。。
我觉得还是做个临时表吧,写个存储过程,把数据先填充到这个临时表中,再从这个表中去查询数据。。。这样挺好。。。
如果是实时数据查询的话,在已经知道关联关系的情况下你就还是写SQL语句找关联关系吧,但是可以对SQL语句进行优化,相关的表该加索引加索引,如果表的数量巨大的话,该分区分区,减少查询表的体积.
最好是写在存储过程以返回表的形式出现,或者使用视图. 不要使用临时表,会产生额外的开销.
如果不是实时的数据,比如就是每天,每个礼拜或者定期需要查询这些表并返回查询的集合作为输出文件报表的话.建议创建一张Working Table,这个表的结构应该是你所需要所有数据的列的集合. 在每一次需要发布报表之前, 可以使用SQL Job 定时查询数据到这个Working Table里,这个表将作为你的文件报表的源. 因为不是实时的查询结果,所以你需要和你的业务人员讨论能否接受这种报表结果,即这个报表数据的统计是截止在某某时刻的.
以空间换时间吧,抽取关联性紧密的向个表把存储结果存到一或几个物理的临时表内,之后 再查询这几个临时表。如果查询模式,不经常变就可以复用。如果那二十几个基础数据表数据经常有变动就用作业在服务器闲置时间定期把所需临时数据插入到物理临时表中。