查询效率问题---望指点

风之影子 2010-10-29 11:46:32
我简述一下:环境MSSQL2005
我有一张数据表,里面有上百万条记录,我查特定日期的数据,进行逐行分析比较,也就是说我先按时间排序后,把特定时间段的数据存为内存表,再加上identity字段,每次通过while取前三条(tempid为1,2,3),进行比较,处理后,再进行接下来的三条(tempid为2,3,4),我现在声明了三个变量分别查询进行赋值后使用,似乎不合理。
可思路有限,望高手指教一二。


不用前台,只在数据库实现。
...全文
125 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
guguda2008 2010-10-29
  • 打赏
  • 举报
回复
这种循环操作应该可以替换为一个批操作的,LZ再研究一下算法
billpu 2010-10-29
  • 打赏
  • 举报
回复
可以用dawugui的子查询方式
不过你如果要避免用while,那也不困难
set rowcount=3 --设置记录集操作数为3条
select ......where...order by id
...你的比较操作赋值等
delete ......where id in (select min(id) from ...) --或者用exists不过3条记录效率估计也无所谓
select ......order by id --重复选取以上操作
事务结束之后记得 set rowcount 0
叶子 2010-10-29
  • 打赏
  • 举报
回复
楼主是要用游标吗?
dawugui 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 libinguest 的回复:]
是的,我觉的每次都内存表里查询赋一个值,这样while下来效率不是很好(个人认为),请指教。

另外一楼的我在看,还没有完全看懂。[/Quote]
就是按照时间排序,同时生成从1开始的序号,你不是要三个吗?所以需要三个相同的查询做为子查询。
然后每个递增1来获取数据。

我应该没有理解错你的意思吧?
风之影子 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 billpu 的回复:]
你觉得什么不合理?
每次取3条的方式?
能简单说明下
我现在声明了三个变量分别查询进行赋值后使用的语句?
[/Quote]


是的,我觉的每次都内存表里查询赋一个值,这样while下来效率不是很好(个人认为),请指教。

另外一楼的我在看,还没有完全看懂。
软件钢琴师 2010-10-29
  • 打赏
  • 举报
回复
按时间排序后,把特定时间段的数据存为 两个 相同 的 内存表
然后用这两个表的数据去对比
不知道我的理解是不是准确
guguda2008 2010-10-29
  • 打赏
  • 举报
回复
如果你的处理是有规律的,可以试着用语句一次性完成,如果不好做就把按时间和identity字段排序后的涉及到的所有字段的查询放到临时表进行处理,数据量大的话可以为临时表加上索引。
billpu 2010-10-29
  • 打赏
  • 举报
回复
你觉得什么不合理?
每次取3条的方式?
能简单说明下
我现在声明了三个变量分别查询进行赋值后使用的语句?
dawugui 2010-10-29
  • 打赏
  • 举报
回复
那你不如把这个表生成序号,然后做成三个子查询进行比较。假设时间字段为time
大致为:
select t1.* , t2.* , t3.* from
(select t.* , px = row_number() over(order by time) from tb t) t1,
(select t.* , px = row_number() over(order by time) from tb t) t2,
(select t.* , px = row_number() over(order by time) from tb t) t3
where t1.px = t2.px - 1 and t2.px = t3.px - 1 and 你其他的条件或比较
风之影子 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 guguda2008 的回复:]
这种循环操作应该可以替换为一个批操作的,LZ再研究一下算法
[/Quote]

谢谢
风之影子 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 billpu 的回复:]
可以用dawugui的子查询方式
不过你如果要避免用while,那也不困难
set rowcount=3 --设置记录集操作数为3条
select ......where...order by id
...你的比较操作赋值等
delete ......where id in (select min(id) from ...) --或者用exists不过3条记录效率估计也无所谓
sele……
[/Quote]


我试试
风之影子 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 maco_wang 的回复:]
楼主是要用游标吗?
[/Quote]


有好的办法以用什么都可以。

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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