2013-10-25 130 views
2

我希望这不是脱离主题,但我有一个真正的问题,我oculd使用一些建议。Sql Server问题

我有一个应用程序在启动时升级自己的Sql Server数据库(从以前的版本)。通常这很好,但是新版本必须改变几个nvarchar列的宽度。

对于表中有大量数据的实时数据库,这需要很长时间。似乎有两个问题 - 一个是Sql Server似乎正在处理数据(可能重写它),尽管实际上并没有改变,另一个是事务日志吞噬了大量的空间。

有什么办法可以规避这个问题吗?它只是一个简单的Alter Table ... Alter Column命令,将nvarchar(x)更改为nvarchar(x + n),没有什么奇怪的,但是它在该领域造成了一个'问题'并引起很大的不满。如果有一种方法可以在不处理现有数据的情况下更改列宽,并以某种方式抑制事务日志内容,那将很方便。

它似乎没有与Oracle数据库的问题。

一个例子命令:

IF EXISTS (SELECT 1 FROM information_schema.COLUMNS WHERE table_name='ResourceBookings' AND column_name = ('ResourceBookerKey1') AND character_maximum_length <= 50) 
    ALTER TABLE [ResourceBookings] ALTER COLUMN [ResourceBookerKey1] NVARCHAR(80) NULL 

正如你可以看到,该表只改变,如果列的宽度需要增加

TIA

+0

我知道你所描述的代码,但它可能仍然是有用的张贴实际的代码。 –

+0

听起来你有一些页面拆分正在进行,但我不认为这将是必要的VAR。 – Paparazzi

+0

这个字段是否有索引? – valex

回答

1

升级之前,请确保在SQL Server数据库的恢复模式设置为“简单”。转到SSMS,右键单击数据库,选择属性,然后单击选项页面。记录“恢复模式”值。如果还没有(我假设它设置为FULL),则将恢复模型设置为“简单”。

然后运行升级。升级之后,您可以将该值恢复到原来的值。

或者你可以用这样的脚本是:

升级之前:

升级
ALTER DATABASE MyDatabase SET RECOVERY SIMPLE; 

后:

ALTER DATABASE MyDatabase SET RECOVERY FULL;