首页 新闻 会员 周边 捐助

不用存储过程分页,大家有什么高效的办法?

0
悬赏园豆:10 [已解决问题] 解决于 2014-10-26 21:05

在通过的存储过程分页中,一个查询会查2次数据库。

一次获取符合条件的记录总数。

一次获取分页区间的数据。

 

很多通过的存储过程都这样写的,感觉效率上应该不是最好的。

 

大家看看我这种实现的想法可行不?

 

1,一次性将符合条件的所有数据全取出来,放在DataTable中,并用一个key将此DataTable存放在HashTable里。

 

2,获取DataTable.Rows.Count来计算并获取要显示给前台的数据,将取得的数据绑定给分页控件的数据源。

 

3,设置分页控件的信息(当前页,总页数,页大小)完成后,给分页控件的Tag赋上保存DataTable时的key.

 

4,点击分页控件翻页后,在后台用Tag所存储的key去HashTable里取要显示的数据。。

 

大家觉得这样可行么?在实现的过程中,要注意哪些地方?谢谢!

hexllo的主页 hexllo | 菜鸟二级 | 园豆:318
提问于:2014-10-15 20:43
< >
分享
最佳答案
0

分两次查询。一次查记录数,一次查具体数据(top分页,row_number分页)。

对于问题所说DataTable,在较大数据量上,完全不可取。问题:1、首次加载速度慢;2、条件查询慢。

其实用存储过程封装两次查询的话,从应用程序到DB之间,只发起了一次连接。

收获园豆:8
幻天芒 | 高人七级 |园豆:37205 | 2014-10-16 08:37
其他回答(6)
1

1,一次性将符合条件的所有数据全取出来,放在DataTable中。

数据库正在查询中,请等待,估计3年后返回查询结果....

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-10-15 20:54

别吓我。。取内存比查DB快

支持(0) 反对(0) hexllo | 园豆:318 (菜鸟二级) | 2014-10-15 20:56

@hexllo: 想象一下数据行3亿,数据表占用磁盘空间15G...

你那个服务器大概得买320G内存,不知道够不够用,不过反正内存现在也便宜,

320G也才几万,好像不会超过10万吧。

这还不算厉害,

如果数据库服务器与应用服务器不在一个物理机上,或者数据库服务器与应用是通过

低带宽连接的话,3年其实一般是不会啦,都是SystemTimeOut。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-10-15 21:00

@爱编程的大叔: 嗯,有道理,有没有什么办法只查一次DB能解决翻页问题?

支持(0) 反对(0) hexllo | 园豆:318 (菜鸟二级) | 2014-10-15 21:01

@hexllo: 你假装看不见调用了两次。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-10-15 21:07
0

对于比较灵活的查询条件,看来只能查两次了。对于比较固定的比如说取某个栏目下的文章,只是根据栏目ID查,没有别的筛选条件的这种情况,可以在栏目表中冗余一个共有多少条文章的字段,增加删除文章时维护一下,后面查询的时候直接取这个数字就行了。

于为源 | 园豆:956 (小虾三级) | 2014-10-16 08:10
0

分页为什么要存储过程?

吴瑞祥 | 园豆:29449 (高人七级) | 2014-10-16 08:47
0

貌似我们公司实测的结果是,建立两次连接拼SQL查询条件分别查询记录数和具体数据,比在一个存储过程里把两个都查出来要快?

焰£天琊 | 园豆:418 (菜鸟二级) | 2014-10-16 09:18
0

数据不多的话还能这么做,数据一多,唉....

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-10-16 09:41
0

 把2个语句写一起,一并执行,返回 dataset,

例子 :

-- 总数

select count(1) from pagetest

-- 分页

select * from 
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>=9901 and rownumber<=9952
 
返回的dataset 第一个 table 是总数,第二个 table 是分页数据
收获园豆:2
jerry128 | 园豆:31 (初学一级) | 2014-10-26 18:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册