求助:千万数据批量划分时段SQL

jhzy7777 2018-09-03 08:44:12
2017-09-09每五分钟划分为一个时段,一共1800多万行,
...全文
817 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-09-07
  • 打赏
  • 举报
回复
引用 9 楼 m0_38069220 的回复:
[quote=引用 8 楼 yenange 的回复:]
改恢复模式也很重要, 不知你改了没有?

嗯,默认设置的简单模式[/quote]
如果没有其它操作在干扰这个表, 基本上是到极限了, 再想其它办法也快不了太多。
希望再快只能在硬件方面想办法了。
xiaoxiangqing 2018-09-07
  • 打赏
  • 举报
回复
简单模式是没有日志,要看下查询字段是否有索引
ダ雨夹雪リ 2018-09-07
  • 打赏
  • 举报
回复

--用s_time和该时间0点计算分钟数,然后整除5
--这样只是组可能不是从1开始,但是每5分钟一个组是正确的
UPDATE 表 SET period=DATEDIFF(mi,CONVERT(DATE,s_time),s_time)/5
jhzy7777 2018-09-07
  • 打赏
  • 举报
回复
引用 8 楼 yenange 的回复:
改恢复模式也很重要, 不知你改了没有?

嗯,默认设置的简单模式
吉普赛的歌 2018-09-07
  • 打赏
  • 举报
回复
改恢复模式也很重要, 不知你改了没有?
jhzy7777 2018-09-07
  • 打赏
  • 举报
回复
DECLARE @i int
DECLARE @time_start smalldatetime
DECLARE @time_end smalldatetime
SET @i=1
SET @time_start= CONVERT(smalldatetime,SUBSTRING('20170909 00:00:00',1,120))
WHILE @i<=288
BEGIN SET @time_end = DATEADD(mi,*5,@time_start)
UPDATE CAR_FLOW
SET PERIOD = @i WHERE S_TIME BETWEEN @time_start AND @time_end
SET @time_start = @time_end
  SET @i+=1
END


jhzy7777 2018-09-07
  • 打赏
  • 举报
回复
引用 4 楼 yenange 的回复:
1. 加索引
CREATE clustered INDEX ix_CAR_FLOW_S_TIME ON CAR_FLOW(S_TIME)


2. 看下你的日志模式, 改为简单会比较快:


感谢版主,按照建议加了索引。我又修改了一下我的sql,3个多小时跑完。。虽然还是很慢,但好歹完成了
jhzy7777 2018-09-07
  • 打赏
  • 举报
回复
两位大神说的没错。。新手小白确实没加索引
  • 打赏
  • 举报
回复
10楼的方法 可以试试
吉普赛的歌 2018-09-04
  • 打赏
  • 举报
回复
1. 加索引
CREATE clustered INDEX ix_CAR_FLOW_S_TIME ON CAR_FLOW(S_TIME)


2. 看下你的日志模式, 改为简单会比较快:
zjcxc 2018-09-04
  • 打赏
  • 举报
回复
估计是 C_TIME 没加索引
jhzy7777 2018-09-03
  • 打赏
  • 举报
回复
自己写了一段sql程序,跑了几个小时,才更新了十几万行。。。求各位大佬帮帮忙指点指点
ALTER TABLE CAR_FLOW ADD PERIOD
DECLARE @i int
DECLARE @time_start smalldatetime
DECLARE @time smalldatetime
SET @i=1
SET @time_start= CONVERT(smalldatetime,SUBSTRING('20170909 00:00:00',1,120))
WHILE @i<=288
BEGIN
UPDATE CAR_FLOW
SET PERIOD = @i WHERE S_TIME BETWEEN DATEADD(mi,(@i-1)*5,@time_start) AND DATEADD(mi,@i*5,@time_start)

  SET @i+=1
END
jhzy7777 2018-09-03
  • 打赏
  • 举报
回复
自己写了一段sql程序,跑了几个小时,才更新了十几万行。。。求各位大佬帮帮忙指点指点
ALTER TABLE CAR_FLOW ADD PERIOD
DECLARE @i int
DECLARE @time_start smalldatetime
DECLARE @time smalldatetime
SET @i=1
SET @time_start= CONVERT(smalldatetime,SUBSTRING('20170909 00:00:00',1,120))
WHILE @i<=288
BEGIN
UPDATE CAR_FLOW
SET PERIOD = @i WHERE S_TIME BETWEEN DATEADD(mi,(@i-1)*5,@time_start) AND DATEADD(mi,@i*5,@time_start)

  SET @i+=1
END

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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