作者:盖世猎人 | 来源:互联网 | 2023-08-04 20:17
库里有个表的数据量太大,查询太慢,现需要对表进行拆分,按照年份。这个库是高频库,每5分钟更新3000多条数据,表里数据大概达到1亿多。insertintodbo.T_MIN5_2014
库里有个表的数据量太大,查询太慢,现需要对表进行拆分,按照年份。
这个库是高频库,每5分钟更新3000多条数据,表里数据大概达到1亿多。
insert into dbo.T_MIN5_2014
.... from dbo.T_MIN5
where F_DATE between 20140101 and 20140131
插入一个月的数据1个小时也没有出来结果。
怎么解决,求大神,版主
12 个解决方案
查询表的速度就很慢,而且需要拆分的表没有建立索引,只有主键。
单表不行,可用业务表和历史表/历史表用分区表
插入业务表
定时搬动了历史表
历史表数据量大用可分区表去分区
用into 生成拆分表
生成表后再创建相关索引
e.g.
select * into table1 from tablename where ID<=4000
T_MIN5表的F_DATE 栏位没有索引吗?没的话加上试试。
然后
1,数据库的恢复模式临时修改为简单模式
2,用SELECT INTO 语句按日期条件分装数据(分装所有数据)
3,全部分装完之后,用TRUNCATE TABLE来将T_MIN5表数据清除,然后DROP掉表T_MIN5
4,将最近的分装表,如T_MIN5_2016表明改回T_MIN5
采用分区表,历史数据定时分区交换到历史分区表即可。秒级完成。
1建议用导入导出向导,虽然不一定快,但是你可以看到进度
2如果写select 迁移数据建议分成多次执行,比如按日或几日或月,先从一天开始逐渐增加时间跨度,多测试几次就能找出最经济的跨度。
3检查数据库剩余空间,建议先把数据库空间加大而不是登没空间里让它自动增长。
4迁移完成后再给历史表创建索引等
5删除原始表中数据时按照导出时那样分次执行(delete会更慢)
插入之前,先建聚集索引吧,查询快些
删除的时候,先把索引删除,再删除数据,批量啥数据的时候试试下面的sql
SET STATISTICS TIME ON;
DECLARE @Timer DATETIME = GETDATE();
SET ROWCOUNT 100000;
WHILE 1 = 1
BEGIN
BEGIN TRAN
DELETE FROM [dbo].[Employee];
COMMIT
IF @@ROWCOUNT = 0
BREAK;
END
SET ROWCOUNT 0;
SELECT DATEDIFF(MS, @Timer, GETDATE()) AS [执行时间(毫秒)];
SET STATISTICS TIME OFF;
这样只会记录一条日志,不会每次delete的时候都记录一次日志
别被亿级吓倒,搞清楚数据存储和访问的机制,搞清楚分表、分区的机制、特点是正道
F_DATE 字段上如果没有索引,就创建一个索引。
,初步计算了一下,按照你说的一个月的数据的1000w左右,拷贝1000w的数据确实的比较长时间。