首页新闻找找看学习计划

多表大量数据INNER JOIN连接后,根据条件显示出来问题

0
悬赏园豆:100 [已解决问题] 解决于 2013-07-28 22:37

问题描述:MSSQL数据库。根据条件查找分页显示,数据源来自多表连接产生的大量数据,被连接的表有索引。怎么样处理能让在页面显示的比较快。

问题一:是在查找前让连接语句执行,然后根据条件在连接执行产生的数据里面搜索,把满足条件属于当前页码的记录显示出来;还是把查找条件和当前页码带到JOIN连接语句里面,执行过SQL语句就是需要的记录。

问题二:如果采用问题一前一种方法,连接产生的大量数据怎么处理,用视图或是用临时表给保存起来,还是连接语句直接放在存储过程里面。

大家有更好的也可以跟我说下,我没有这方面处理经验。谢谢。

补充说明:数据量是10万条往上的。

oran176的主页 oran176 | 初学一级 | 园豆:102
提问于:2013-07-24 11:27
< >
分享
最佳答案
0

问题一:十万数据并不多,看增长的趋势。随意选择,但是最好是选前者。因为多表联查会产生笛卡尔积,一般会将数据小的表作为主表,所以在联查前用WHERE筛选是最好的了。不过要注意,不要使用order by ,group by ,这样会使查询脱离关系模型而降低效率。

问题二:如果选择上面的一种方法,数据依然很多,比如几百万,千万以上,那么需要做另外的处理了,几百万对MSSQL来说单表还是受得了的,多表联查的话,尤其是关联4-5张表或更多就会很吃力。解决办法也很简单,你需要根据数据增长的趋势,为表建立分区,比如以创建时间为约束,具体分区的方法就请百度吧。注意,多表联查最好建立外键索引约束,不过MSSQL自带外键索引的,只要建好外键约束就行。

收获园豆:40
十三燕 | 菜鸟二级 |园豆:242 | 2013-07-26 10:25

呵呵。统计数量的时候,和个连接表就是用group by了。另外估计还不会用到分区表。

oran176 | 园豆:102 (初学一级) | 2013-07-27 08:16

@oran176: 要group by也拿到最后去做。反正基础的原则是这样的,如果还是对性能没有信心的话,建议找些好书,系统地学一下,百度上找来和别人回答的都太不系统,盲人摸象,对你真的没有太大帮助。

十三燕 | 园豆:242 (菜鸟二级) | 2013-07-27 18:03
其他回答(7)
0

1、看具体数据量;

2、如果访问量多,那么先视图,然后对视图分页,可能比较适合;

3、多种方式测试,看查询速度;

收获园豆:10
幻天芒 | 园豆:36522 (高人七级) | 2013-07-24 11:30

10w条啊~,直接连接后查询即可。数据量不怎么大,没多大影响。

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2013-07-24 12:53

@幻天芒: 数据还会增加,每天增加五千条左右。所以讲要设计好。

支持(0) 反对(0) oran176 | 园豆:102 (初学一级) | 2013-07-24 18:03

@oran176: 跨几个表查询就不太好,最好能将常用数据,存储在一个表~

就算每天增加5000,那么一年也才200w左右,使用视图将需要的数据先筛选出来,然后在分页查询吧~

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2013-07-24 22:58

@幻天芒: 根据第一范式设计的表。

支持(0) 反对(0) oran176 | 园豆:102 (初学一级) | 2013-07-25 08:52

@oran176: 可以增加冗余字段,减少连表查询,提高查询速度,这个看你具体的语句,不是一句两句就说得明白;

现在,大家也提供了很多方案,具体你就得每个去测试下,哪个快就采用哪个啊~

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2013-07-25 09:48
0

根据执行计划,优化索引

收获园豆:10
dudu | 园豆:41299 (高人七级) | 2013-07-24 11:37
0

先查找,再连接取分页数据

收获园豆:10
小兵仔 | 园豆:1240 (小虾三级) | 2013-07-24 11:39

这样应该有个问题:由于是inner join,所以数据可能不足一页。

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2013-07-24 11:47

@幻天芒: 那有什么关系,有多少就取多少嘛

支持(0) 反对(0) 小兵仔 | 园豆:1240 (小虾三级) | 2013-07-24 11:51

@zhanghb: 作为分页,在每页记录数为30的情况下,如果第一页39,第二页30,客户会怎么想?

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2013-07-24 12:53

先查找,再连接取分页数据

不连接,没有办法查找的,查找条件跨几个表的,要连接了才行吧。

支持(0) 反对(0) oran176 | 园豆:102 (初学一级) | 2013-07-24 18:06
0

把要查询的字段给组合起来建立临时表,然后创建索引。查询的结果直接去那边根据ID拿数据即可。

收获园豆:10
````` | 园豆:14268 (专家六级) | 2013-07-24 12:36
0

10万条数据好少。。。咋搞都可以。

便当之神 | 园豆:268 (菜鸟二级) | 2013-07-24 12:42

不要这么笼统,你说个具体方法。

支持(0) 反对(0) oran176 | 园豆:102 (初学一级) | 2013-07-24 12:50
0

多个表关联的时候,先把每个表中符合的数据查出来做为一个集合,再将各个集合关联成你要的结果,比如查询条件带有日期的,先把每个表中符合这个日期区间的数据取出来做为一个集合,再关联,这只是举个小例子,给你个思路,具体什么条件符合,还得你自己决定,如果单个表无法决定的,只好关联了,另外可以将查出来的结果以当前查询条件组成的URL做为KEY,保存到缓存中,下次再查的时候直接从缓存取。

收获园豆:10
hexllo | 园豆:405 (菜鸟二级) | 2013-07-24 14:11

应该没有这么麻烦吧。

支持(0) 反对(0) oran176 | 园豆:102 (初学一级) | 2013-07-25 08:54
0

50万条下你就算table scan也慢不到哪去的。

收获园豆:10
Daniel Cai | 园豆:10374 (专家六级) | 2013-07-26 10:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册