200万条记录从nvarchar转text 慢慢,但也不至于这么慢
死机了吧

解决方案 »

  1.   

    这么多的记录,如果想一次性修改,数据库要保持数据完整性,必须将整个过程放在一个事务中,后果可想而知...注意:一定先做个数据库完全备份,做错了可以恢复到原来的状态数据导成文本
    清空原表(用 truncate table, 不要用 delete from)
    修改表结构
    如果有索引的话,最好先把建索引的SQL生成出来,然后删除索引
    从文本导入数据
    重建索引再注意:如果你的表里面有entity属性的字段,装入数据的时候必须设置能在entity属性的字段上插入值
      

  2.   

    从nvarchar(100)改成text
    -------------------?这个存在编码转换, 从 unicode 转到非 unicode估计资源消耗在这里
      

  3.   

    一般来说应该是从 nvarchar 改 ntext, 这样没有转换的过程
      

  4.   

    SqlServer自己在修改表结构的时候都是先做一张新表,然后将整张表的数据插入到新表中,接着drop旧表,将新表改成原来的名字,最后添加索引触发器等,这一切都在一个事务中如果LZ是在企业管理器中修改的那么就是以上的步骤,如果发生很慢那么可能确实是数据过大,另一个是因为还有人在操作原来的表
    因此建议LZ先锁定整张表,可以用WITH (HOLDLOCK TABLOCKX),
    然后建一个新表,结构是修改过的,自己写Sql语句将数据导入新表,用WITH(NOLOCK)当然也可以将在企业管理器中生成的脚步Copy出来,自己一步步执行
      

  5.   

    用语句改:
    alter table tabname alter colname text
      

  6.   

    SqlServer自己在修改表结构的时候都是先做一张新表,然后将整张表的数据插入到新表中,接着drop旧表,将新表改成原来的名字,最后添加索引触发器等,这一切都在一个事务中>> drop 这种语句也能放到事务里面了? 我一直以为DDL不能进事务的.
      

  7.   

    SqlServer自己在修改表结构的时候都是先做一张新表,然后将整张表的数据插入到新表中,接着drop旧表,将新表改成原来的名字,最后添加索引触发器等,这一切都在一个事务中 > >   drop   这种语句也能放到事务里面了?   我一直以为DDL不能进事务的.
    -------------------------------------
    至少在2000里面(不清楚SQL7.0),连重建索引, create table, dbcc 命令都在事务里面
    我们一个22G的数据库重建索引,之后日志就增大了22G
      

  8.   

    SqlServer自己在修改表结构的时候都是先做一张新表,然后将整张表的数据插入到新表中,接着drop旧表,将新表改成原来的名字,最后添加索引触发器等,这一切都在一个事务中   >   >       drop       这种语句也能放到事务里面了?       我一直以为DDL不能进事务的. 
    ------------------------------------- 
    至少在2000里面(不清楚SQL7.0),连重建索引,   create   table,   dbcc   命令都在事务里面 
    我们一个22G的数据库重建索引,之后日志就增大了22G>> 无法回滚的操作能算是在事务里面么?
      

  9.   

    > >   无法回滚的操作能算是在事务里面么?
    ------------------------------------------
    也算在事务里面的,这是SQL内部要维护数据的完整性不过你这个问题比较有趣,可以试试 truncate table来验证一下
    这个命令照文档说是不写日志的,你在一个事务里面用 truncate table 看看能不能回滚?
    或者执行这个truncate table的时候,强行将连接断了,看看表有没有清空?我没有试过。
      

  10.   

    truncate table是不记录日志的.
    DDL是跟其他分开独立在一个事务里面的.成功就提交,失败就回滚.不能显式rollback
      

  11.   

    谢谢各位高手的指点。
    这里向大家汇报结果。:)
    1:备份数据库,以备不测
    2:新建一个一样的表,修改字段
    3:将数据库事务级别设置为简单,且日至自动收缩,从而减少写log所占空间和时间(主要是空间不够)
    4:将原来的表的输入导入新表
    5:删除原表,将新表该名为原表名称
    6:将数据库事务基本改为完全
    7:完成不过时间也花了不少,大概有2-3个小时,本人机器配置差应该是一方面:1.8G迅驰2,1G DDR,win2003,系统装了到现在大概2年时间。