K
kkkchenA
Unregistered / Unconfirmed
GUEST, unregistred user!
利用ClientDataSet的递增式获取数据是不错的选择,可以大大缓解网络传输的压力。
为了更加有效率,服务器要池化,所以服务器端的DataSet用完就关掉了,把它当前的状态通过OwnerData送回到ClientDataSet让它自己保存状态(就是记着最后的那条数据)。
ClientDataSet要获取下一个数据包的时候通过OwnerData把自己的状态传送过去,让DataSet打开以后定位到相应的记录上,这样DataSetProvider就可以把第二个包打包返回了。
但是,每次的数据定位太浪费时间了,特别是一些有大量数据的表。昨天看了一个存储过程,它用Top关键字来实现数据分页提取,我觉得我也可以用Top关键字,加上主键来定位数据,让DataSet只取回PackSize条的数据。我在DataSetProvider端,根据ClientDataSet保存的状态值,来对CommandText进行修改,把它改成这样的形式:
Select Top PackSize From TableName Where KeyField>KeyValue Order by KeyField
PackSize:包大小
KeyFiled:是主键
KeyValue:上一个包最后一条数据的主键值
这个语句实现了让DataSet只拿回一个包大小的数据,打开速度大大提高。在一个有1000万条数据的表中测试,浏览数据时,基本上感觉不到停顿。
我想知道的是,这样的处理会不会带来什么后遗症?
请大家发表一下自己的见解,如果有更加好的提高效率的方法也请发表一下。
另外我还想知道DataSetProvider是怎么通过DataSet获取从表的数据的,他是怎么知道存在从表的呢?看了一下DataSetProvider的代码,没找到从表的表结构获取部分的代码,估计应该是在DataSet里面自己完成了。
为了更加有效率,服务器要池化,所以服务器端的DataSet用完就关掉了,把它当前的状态通过OwnerData送回到ClientDataSet让它自己保存状态(就是记着最后的那条数据)。
ClientDataSet要获取下一个数据包的时候通过OwnerData把自己的状态传送过去,让DataSet打开以后定位到相应的记录上,这样DataSetProvider就可以把第二个包打包返回了。
但是,每次的数据定位太浪费时间了,特别是一些有大量数据的表。昨天看了一个存储过程,它用Top关键字来实现数据分页提取,我觉得我也可以用Top关键字,加上主键来定位数据,让DataSet只取回PackSize条的数据。我在DataSetProvider端,根据ClientDataSet保存的状态值,来对CommandText进行修改,把它改成这样的形式:
Select Top PackSize From TableName Where KeyField>KeyValue Order by KeyField
PackSize:包大小
KeyFiled:是主键
KeyValue:上一个包最后一条数据的主键值
这个语句实现了让DataSet只拿回一个包大小的数据,打开速度大大提高。在一个有1000万条数据的表中测试,浏览数据时,基本上感觉不到停顿。
我想知道的是,这样的处理会不会带来什么后遗症?
请大家发表一下自己的见解,如果有更加好的提高效率的方法也请发表一下。
另外我还想知道DataSetProvider是怎么通过DataSet获取从表的数据的,他是怎么知道存在从表的呢?看了一下DataSetProvider的代码,没找到从表的表结构获取部分的代码,估计应该是在DataSet里面自己完成了。