Help!修改一个200万条记录的表结构时,发现速度非常之慢,有什么办法?(4个小时了修改还没有完成)(高分,不够再给) 200万条记录从nvarchar转text 慢慢,但也不至于这么慢死机了吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这么多的记录,如果想一次性修改,数据库要保持数据完整性,必须将整个过程放在一个事务中,后果可想而知...注意:一定先做个数据库完全备份,做错了可以恢复到原来的状态数据导成文本清空原表(用 truncate table, 不要用 delete from)修改表结构如果有索引的话,最好先把建索引的SQL生成出来,然后删除索引从文本导入数据重建索引再注意:如果你的表里面有entity属性的字段,装入数据的时候必须设置能在entity属性的字段上插入值 从nvarchar(100)改成text-------------------?这个存在编码转换, 从 unicode 转到非 unicode估计资源消耗在这里 一般来说应该是从 nvarchar 改 ntext, 这样没有转换的过程 SqlServer自己在修改表结构的时候都是先做一张新表,然后将整张表的数据插入到新表中,接着drop旧表,将新表改成原来的名字,最后添加索引触发器等,这一切都在一个事务中如果LZ是在企业管理器中修改的那么就是以上的步骤,如果发生很慢那么可能确实是数据过大,另一个是因为还有人在操作原来的表因此建议LZ先锁定整张表,可以用WITH (HOLDLOCK TABLOCKX),然后建一个新表,结构是修改过的,自己写Sql语句将数据导入新表,用WITH(NOLOCK)当然也可以将在企业管理器中生成的脚步Copy出来,自己一步步执行 用语句改:alter table tabname alter colname text SqlServer自己在修改表结构的时候都是先做一张新表,然后将整张表的数据插入到新表中,接着drop旧表,将新表改成原来的名字,最后添加索引触发器等,这一切都在一个事务中>> drop 这种语句也能放到事务里面了? 我一直以为DDL不能进事务的. SqlServer自己在修改表结构的时候都是先做一张新表,然后将整张表的数据插入到新表中,接着drop旧表,将新表改成原来的名字,最后添加索引触发器等,这一切都在一个事务中 > > drop 这种语句也能放到事务里面了? 我一直以为DDL不能进事务的.-------------------------------------至少在2000里面(不清楚SQL7.0),连重建索引, create table, dbcc 命令都在事务里面我们一个22G的数据库重建索引,之后日志就增大了22G SqlServer自己在修改表结构的时候都是先做一张新表,然后将整张表的数据插入到新表中,接着drop旧表,将新表改成原来的名字,最后添加索引触发器等,这一切都在一个事务中 > > drop 这种语句也能放到事务里面了? 我一直以为DDL不能进事务的. ------------------------------------- 至少在2000里面(不清楚SQL7.0),连重建索引, create table, dbcc 命令都在事务里面 我们一个22G的数据库重建索引,之后日志就增大了22G>> 无法回滚的操作能算是在事务里面么? > > 无法回滚的操作能算是在事务里面么?------------------------------------------也算在事务里面的,这是SQL内部要维护数据的完整性不过你这个问题比较有趣,可以试试 truncate table来验证一下这个命令照文档说是不写日志的,你在一个事务里面用 truncate table 看看能不能回滚?或者执行这个truncate table的时候,强行将连接断了,看看表有没有清空?我没有试过。 truncate table是不记录日志的.DDL是跟其他分开独立在一个事务里面的.成功就提交,失败就回滚.不能显式rollback 谢谢各位高手的指点。这里向大家汇报结果。:)1:备份数据库,以备不测2:新建一个一样的表,修改字段3:将数据库事务级别设置为简单,且日至自动收缩,从而减少写log所占空间和时间(主要是空间不够)4:将原来的表的输入导入新表5:删除原表,将新表该名为原表名称6:将数据库事务基本改为完全7:完成不过时间也花了不少,大概有2-3个小时,本人机器配置差应该是一方面:1.8G迅驰2,1G DDR,win2003,系统装了到现在大概2年时间。 想学存储过程 有资料吗 问一个奇怪的问题:有两块网卡的服务器上装有SQL SERVER,那么这个数据库到底“属于”哪个网卡呢? 位置固定的模糊查询怎么写? 如何在查询中把SUM()的结果加起来? 数据汇总筛选 如何提取一个最大的字符串,然后让其增加1? 那种数据库的格式是ndf Sql Server为何调用当前用户定义的函数还要用户名.表名??? 数据库的强制恢复 SQL server 备份时发生的数据变化会怎么样 求一个sql查询语句,---郁闷 如何保存sqlserver中scripts 中的print 到文件?
清空原表(用 truncate table, 不要用 delete from)
修改表结构
如果有索引的话,最好先把建索引的SQL生成出来,然后删除索引
从文本导入数据
重建索引再注意:如果你的表里面有entity属性的字段,装入数据的时候必须设置能在entity属性的字段上插入值
-------------------?这个存在编码转换, 从 unicode 转到非 unicode估计资源消耗在这里
因此建议LZ先锁定整张表,可以用WITH (HOLDLOCK TABLOCKX),
然后建一个新表,结构是修改过的,自己写Sql语句将数据导入新表,用WITH(NOLOCK)当然也可以将在企业管理器中生成的脚步Copy出来,自己一步步执行
alter table tabname alter colname text
-------------------------------------
至少在2000里面(不清楚SQL7.0),连重建索引, create table, dbcc 命令都在事务里面
我们一个22G的数据库重建索引,之后日志就增大了22G
-------------------------------------
至少在2000里面(不清楚SQL7.0),连重建索引, create table, dbcc 命令都在事务里面
我们一个22G的数据库重建索引,之后日志就增大了22G>> 无法回滚的操作能算是在事务里面么?
------------------------------------------
也算在事务里面的,这是SQL内部要维护数据的完整性不过你这个问题比较有趣,可以试试 truncate table来验证一下
这个命令照文档说是不写日志的,你在一个事务里面用 truncate table 看看能不能回滚?
或者执行这个truncate table的时候,强行将连接断了,看看表有没有清空?我没有试过。
DDL是跟其他分开独立在一个事务里面的.成功就提交,失败就回滚.不能显式rollback
这里向大家汇报结果。:)
1:备份数据库,以备不测
2:新建一个一样的表,修改字段
3:将数据库事务级别设置为简单,且日至自动收缩,从而减少写log所占空间和时间(主要是空间不够)
4:将原来的表的输入导入新表
5:删除原表,将新表该名为原表名称
6:将数据库事务基本改为完全
7:完成不过时间也花了不少,大概有2-3个小时,本人机器配置差应该是一方面:1.8G迅驰2,1G DDR,win2003,系统装了到现在大概2年时间。