在通过的存储过程分页中,一个查询会查2次数据库。
一次获取符合条件的记录总数。
一次获取分页区间的数据。
很多通过的存储过程都这样写的,感觉效率上应该不是最好的。
大家看看我这种实现的想法可行不?
1,一次性将符合条件的所有数据全取出来,放在DataTable中,并用一个key将此DataTable存放在HashTable里。
2,获取DataTable.Rows.Count来计算并获取要显示给前台的数据,将取得的数据绑定给分页控件的数据源。
3,设置分页控件的信息(当前页,总页数,页大小)完成后,给分页控件的Tag赋上保存DataTable时的key.
4,点击分页控件翻页后,在后台用Tag所存储的key去HashTable里取要显示的数据。。
大家觉得这样可行么?在实现的过程中,要注意哪些地方?谢谢!
分两次查询。一次查记录数,一次查具体数据(top分页,row_number分页)。
对于问题所说DataTable,在较大数据量上,完全不可取。问题:1、首次加载速度慢;2、条件查询慢。
其实用存储过程封装两次查询的话,从应用程序到DB之间,只发起了一次连接。
1,一次性将符合条件的所有数据全取出来,放在DataTable中。
数据库正在查询中,请等待,估计3年后返回查询结果....
别吓我。。取内存比查DB快
@hexllo: 想象一下数据行3亿,数据表占用磁盘空间15G...
你那个服务器大概得买320G内存,不知道够不够用,不过反正内存现在也便宜,
320G也才几万,好像不会超过10万吧。
这还不算厉害,
如果数据库服务器与应用服务器不在一个物理机上,或者数据库服务器与应用是通过
低带宽连接的话,3年其实一般是不会啦,都是SystemTimeOut。
@爱编程的大叔: 嗯,有道理,有没有什么办法只查一次DB能解决翻页问题?
@hexllo: 你假装看不见调用了两次。
对于比较灵活的查询条件,看来只能查两次了。对于比较固定的比如说取某个栏目下的文章,只是根据栏目ID查,没有别的筛选条件的这种情况,可以在栏目表中冗余一个共有多少条文章的字段,增加删除文章时维护一下,后面查询的时候直接取这个数字就行了。
分页为什么要存储过程?
貌似我们公司实测的结果是,建立两次连接拼SQL查询条件分别查询记录数和具体数据,比在一个存储过程里把两个都查出来要快?
数据不多的话还能这么做,数据一多,唉....
把2个语句写一起,一并执行,返回 dataset,
例子 :
-- 总数
select count(1) from pagetest
-- 分页