100W条记录数据转换耗时问题征求意见~~~~~高手些进来提提意见,感激不尽.在线等

wangping_li 2008-08-07 01:23:41
/*RT:
我现在数据库有A表(主表),B表(子表).A表里有20W条记录,B表有40W条.以后肯定会是好几百万条.
数据逻辑层数据是通过映射的,取数据还蛮快的.A表取出来20W在10秒内(里面把B表挂在A下的记录也一并取出了),
因为我数据逻辑层是服务器端的数据.而给客户端的数据要经过一个转换层的操作(数据有延迟加载的,如果不经过一个层来转换,到时通过WebService传到客户端在广域网上很耗时的).
问题是:当我A表有20W条记录时.数据转换层也就要执行20W次转换操作.这样别说人,电脑也受不了
征求大师们的意见.怎么让它在转换层这里速度快一些(注意:转换层是一定要的.框架结构就是这样的)
非常希望得到你们的想法.我一定好好学习.在此感激不尽.结贴时可加分.谢谢!*/
...全文
209 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangping_li 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 wangping_li 的回复:]
有谁帮我改一下像30楼那样的分页存储过程啊,引用28楼的存储过程来改.格式像30楼的一样.谢谢
改好就结贴了.
[/Quote]

已经换处理方式了啊,就是我36楼说的.哪位大哥可以帮我改一下存储过程方式啊.格式像30楼那样的,我不会改分页存储过程
谢谢
walkghost 2008-08-08
  • 打赏
  • 举报
回复
偶觉得楼主不可能在一个页面上显示几百万条数据吧?
SO:
分页,游标。每次只读取和转化一页数据,这样,速度不就快了么?
wangping_li 2008-08-08
  • 打赏
  • 举报
回复
up
wangping_li 2008-08-08
  • 打赏
  • 举报
回复
有谁帮我改一下像30楼那样的分页存储过程啊,引用28楼的存储过程来改.格式像30楼的一样.谢谢
改好就结贴了.
紫气东来_999 2008-08-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 535cheng110 的回复:]
关注中
[/Quote]
wwd252 2008-08-07
  • 打赏
  • 举报
回复
顶到第一位!
wwd252 2008-08-07
  • 打赏
  • 举报
回复
顶到第一位!
tootto 2008-08-07
  • 打赏
  • 举报
回复
这么复杂的数据操作居然把数据全部提出来做成所谓'cache', 然后再从'cache'重新提炼?其实这个cache就等于是一个新的数据库,你能研究一种算法比sql server还厉害?

cache只是小规模的,做大了还不就成了自主研发的数据库了。

有时间优化这个’算法‘,还不如重新设计一下sql查询。
a12321321321312321 2008-08-07
  • 打赏
  • 举报
回复
顶下
wangping_li 2008-08-07
  • 打赏
  • 举报
回复

ALTER PROCEDURE [dbo].[USP_TransOrder_Select](
@Method varchar (50),
@TransOrderID uniqueidentifier ,
@InputTime datetime,
@Updater varchar (20) ,
@UpdateTime datetime,
@Status int ,
@IsCancel int,
@Remark varchar (500) ,
@Inputer varchar (20) ,
@TransOrderNO varchar (20) ,
@ConsignMan varchar (100) ,
@ReceiveMan varchar (100) ,
@OrderTotalFee varchar(50),
@ConsignDate datetime,
@OrderLoading varchar (100) ,
@OrderUnloading varchar (100)
)
as


if @Method='ByID' /*通过关键字查找*/
BEGIN
SELECT TOP (1) [TransOrderID],[InputTime],[Updater],[UpdateTime],[Status],[IsCancel],[Remark],[Inputer],[TransOrderNO],[ConsignMan],[ReceiveMan],[OrderTotalFee],[ConsignDate],[OrderLoading],[OrderUnloading] FROM [TransOrder] WHERE ([TransOrderID]=@TransOrderID)
END

if @Method='ByConsignMan' /*通过拖运人查找*/
BEGIN
SELECT [TransOrderID],[InputTime],[Updater],[UpdateTime],[Status],[IsCancel],[Remark],[Inputer],[TransOrderNO],[ConsignMan],[ReceiveMan],[OrderTotalFee],[ConsignDate],[OrderLoading],[OrderUnloading] FROM [TransOrder] WHERE ([ConsignMan]=@ConsignMan)
END

我想用上面这种方式写存储过程,
就是if @Method='名称'
BEGION
--这里写分页存储过程
END
这样的28楼的不好改
wangping_li 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 qijund 的回复:]
我是菜鸟,先问个问题,这端代码什么意思:
static DATA From <DATA, SDO>(SDO input)
where DATA : TransOrder <DATA>, new ()
where SDO : TransOrderSDO <SDO>, new ()
{
where是什么东东?
--------------------------
[/Quote]
where就是约束啊.泛型里的没用过?
wangping_li 2008-08-07
  • 打赏
  • 举报
回复
谢谢
yytt123622 2008-08-07
  • 打赏
  • 举报
回复
通用分页存储过程
CREATE PROCEDURE UP_GetRecordByPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 主键字段名
@PageSize int = 10, -- 页尺寸(每页显示几条数据)
@PageIndex int = 1, -- 页码 (1就是第一页,2就是第二页)
@IsReCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(100) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
+ @strOrder

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
set @strTmp =''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end

if @IsReCount != 0
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere

exec (@strSQL)
GO


这个够明白了吧!
wangping_li 2008-08-07
  • 打赏
  • 举报
回复
看来只有换种方式了.因为里面通过WS传输涉及到序列化和加密码问题.肯定要不少时间的.是我开先没有考虑周全.谢谢大家的意见
现在换一种方式,我搞个分页的,第一次加载时我就只显示10条,这样就只传输10条.点下一页的时候再加载下10条.这样好些.
感谢楼上所有人的意见.
我第一次显示1-10,点下一页的时候显示11-20.存储过程里面怎么判断好一点.知道SQL高手多.会的人帮下我吧.
再次感谢,最后一页时显示最后10条
zhouzx 2008-08-07
  • 打赏
  • 举报
回复
巨汗,你为什么一定要一次转换全部数据?类似于分页查询,只转换部份数据,想要后面的下一页再转换不就行.
qijund 2008-08-07
  • 打赏
  • 举报
回复
我是菜鸟,先问个问题,这端代码什么意思:
static DATA From<DATA, SDO>(SDO input)
where DATA : TransOrder<DATA>, new ()
where SDO : TransOrderSDO<SDO>, new ()
{
where是什么东东?
--------------------------
如果不想每次都转换的话,可不可以先转换,放在临时表里,需要数据时再发过去?
Smile_Wong1 2008-08-07
  • 打赏
  • 举报
回复
关注~~顺便学习
paulin 2008-08-07
  • 打赏
  • 举报
回复
关注,学习~
wangchao1982 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wangping_li 的回复:]
TO:tangserver

不行,那样就不灵活了.我逻辑层只管提供数据.转换层相当于给数据消费者提供服务.
相当于我造币厂只管造人民币出来.至于你要哪去怎么花我不管,你可以换成美元花,可以换成港币花我不管.
逻辑层的数据要和数据库一致.反正全部提供.要公开给服务器端多少数据是另一层控制的.客户端的数据返回服务器端时也会经过一个转换的.转换层有一个双向转换.这样实现逻辑的独立

谢谢你的意见.继续啊.寻找解决方案.
[/Quote]

你这里已经很明确了。我只提供人民币,要花我的钱,自己想办法换:那么你干脆把不转换的当成人民币不就行了么。
zwl12549 2008-08-07
  • 打赏
  • 举报
回复
mark
加载更多回复(19)

62,071

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧