问题描述:MSSQL数据库。根据条件查找分页显示,数据源来自多表连接产生的大量数据,被连接的表有索引。怎么样处理能让在页面显示的比较快。
问题一:是在查找前让连接语句执行,然后根据条件在连接执行产生的数据里面搜索,把满足条件属于当前页码的记录显示出来;还是把查找条件和当前页码带到JOIN连接语句里面,执行过SQL语句就是需要的记录。
问题二:如果采用问题一前一种方法,连接产生的大量数据怎么处理,用视图或是用临时表给保存起来,还是连接语句直接放在存储过程里面。
大家有更好的也可以跟我说下,我没有这方面处理经验。谢谢。
补充说明:数据量是10万条往上的。
问题一:十万数据并不多,看增长的趋势。随意选择,但是最好是选前者。因为多表联查会产生笛卡尔积,一般会将数据小的表作为主表,所以在联查前用WHERE筛选是最好的了。不过要注意,不要使用order by ,group by ,这样会使查询脱离关系模型而降低效率。
问题二:如果选择上面的一种方法,数据依然很多,比如几百万,千万以上,那么需要做另外的处理了,几百万对MSSQL来说单表还是受得了的,多表联查的话,尤其是关联4-5张表或更多就会很吃力。解决办法也很简单,你需要根据数据增长的趋势,为表建立分区,比如以创建时间为约束,具体分区的方法就请百度吧。注意,多表联查最好建立外键索引约束,不过MSSQL自带外键索引的,只要建好外键约束就行。
呵呵。统计数量的时候,和个连接表就是用group by了。另外估计还不会用到分区表。
@oran176: 要group by也拿到最后去做。反正基础的原则是这样的,如果还是对性能没有信心的话,建议找些好书,系统地学一下,百度上找来和别人回答的都太不系统,盲人摸象,对你真的没有太大帮助。
1、看具体数据量;
2、如果访问量多,那么先视图,然后对视图分页,可能比较适合;
3、多种方式测试,看查询速度;
10w条啊~,直接连接后查询即可。数据量不怎么大,没多大影响。
@幻天芒: 数据还会增加,每天增加五千条左右。所以讲要设计好。
@oran176: 跨几个表查询就不太好,最好能将常用数据,存储在一个表~
就算每天增加5000,那么一年也才200w左右,使用视图将需要的数据先筛选出来,然后在分页查询吧~
@幻天芒: 根据第一范式设计的表。
@oran176: 可以增加冗余字段,减少连表查询,提高查询速度,这个看你具体的语句,不是一句两句就说得明白;
现在,大家也提供了很多方案,具体你就得每个去测试下,哪个快就采用哪个啊~
根据执行计划,优化索引
先查找,再连接取分页数据
这样应该有个问题:由于是inner join,所以数据可能不足一页。
@幻天芒: 那有什么关系,有多少就取多少嘛
@zhanghb: 作为分页,在每页记录数为30的情况下,如果第一页39,第二页30,客户会怎么想?
先查找,再连接取分页数据
不连接,没有办法查找的,查找条件跨几个表的,要连接了才行吧。
10万条数据好少。。。咋搞都可以。
不要这么笼统,你说个具体方法。
多个表关联的时候,先把每个表中符合的数据查出来做为一个集合,再将各个集合关联成你要的结果,比如查询条件带有日期的,先把每个表中符合这个日期区间的数据取出来做为一个集合,再关联,这只是举个小例子,给你个思路,具体什么条件符合,还得你自己决定,如果单个表无法决定的,只好关联了,另外可以将查出来的结果以当前查询条件组成的URL做为KEY,保存到缓存中,下次再查的时候直接从缓存取。
应该没有这么麻烦吧。
50万条下你就算table scan也慢不到哪去的。