Dacpac升级数据库时代有点傻

时间:2013-05-03 12:15:36

标签: sql-server sql-server-data-tools dac

编辑:更新为状态它没有挂起,只需要AGES!

我正在尝试使用dacpac更新现有的sql server数据库。

我可以使用下面的(剥离)示例在30秒内创建一个新的SQL Server数据库。 我遇到的问题是使用相同的dacpac,重新运行程序(因此它更新现有数据库而不是重新创建)需要20分钟。

如果时差到期是什么呢?全面使用了redgate的SqlCompare后,我觉得时间不容乐观。

部署方法的第三个参数是UpgradeExisting,我设置为true - 这是我需要做的还是我错过了什么?

void Deploy(string TargetConnectionString, string TargetDatabaseName, string pathToSourceDACPAC)
{

    DacServices dacServices = new DacServices(TargetConnectionString);

    //Set up message and progress handlers
    dacServices.Message += new EventHandler<DacMessageEventArgs>(dbServices_Message);
    dacServices.ProgressChanged += new EventHandler<DacProgressEventArgs>(dbServices_ProgressChanged);

    //Load the DACPAC
    DacPackage dacpac = DacPackage.Load(pathToSourceDACPAC);

    //Set Deployment Options
    DacDeployOptions dacOptions = new DacDeployOptions();
    dacOptions.AllowIncompatiblePlatform = true;

    //Deploy the dacpac
    dacServices.Deploy(dacpac, TargetDatabaseName, true, dacOptions);

}

//Event handlers...
void dbServices_Message(object sender, DacMessageEventArgs e)
{
    OutputThis("DAC Message", e.Message.ToString());
}

void dbServices_ProgressChanged(object sender, DacProgressEventArgs e)
{
    OutputThis(e.Status.ToString(), e.Message.ToString());
}

注意,程序会在dacServices.Deploy行中消失到以太..

4 个答案:

答案 0 :(得分:5)

好的,在运行调试器(VS2012)时遇到了愚蠢的时间。编译后,选择Memory DacSchemaModelStorageType时的时间为25秒左右,选择File DacSchemaModelStorageType时则为45秒左右。

我想这只是意味着调试是一个痛苦的事情!

答案 1 :(得分:2)

如果你在调试器下发现它慢得多,你有很多警告吗?

警告通常由它使用的antlr解析器生成,解析器抛出非常昂贵的异常。

修复警告的工作和构建时间应该会降低。

答案 2 :(得分:2)

我们遇到了同样的问题 - dacpac部署在运行测试时运行良好,但在调试测试时运行速度非常慢。

就我而言,dacpac有一堆.sql脚本,它们将一些测试数据播种到数据库中。其中一个脚本是从SSMS自动生成的,所以它长达40,000行,如下所示:

INSERT [dbo].[Resource] ([CategoryId], [StoreCode], [LocaleCode], [ResourceName], [ResourceText]) VALUES (1, N'AU', N'en-AU', N'AD', N'Andorra')
GO
INSERT [dbo].[Resource] ([CategoryId], [StoreCode], [LocaleCode], [ResourceName], [ResourceText]) VALUES (1, N'AU', N'en-AU', N'AE', N'United Arab Emirates')
GO
INSERT [dbo].[Resource] ([CategoryId], [StoreCode], [LocaleCode], [ResourceName], [ResourceText]) VALUES (1, N'AU', N'en-AU', N'AF', N'Afghanistan')

等,对于40,000行,即20,000 INSERTGO语句。 通过在调试时查看我的dbo.Resource表,我看到脚本导致了问题,并且看到有问题的脚本执行缓慢,因为该表中的行数仍在增加。

我使用一些Notepad ++宏重写了该脚本,以减少INSERT个语句,并在每个INSERT上插入1000行,例如

INSERT [dbo].[Resource] ([CategoryId], [StoreCode], [LocaleCode], [ResourceName], [ResourceText]) VALUES 
(1, N'AU', N'en-AU', N'AD', N'Andorra'),
(1, N'AU', N'en-AU', N'AE', N'United Arab Emirates'),
(1, N'AU', N'en-AU', N'AF', N'Afghanistan'),
... 
GO

并解决了这个问题。

答案 3 :(得分:0)

希望有人会有一些dacpac特定的建议,但是既然你提到SQL Compare更快,你可能想看看基于包的部署作为Red Gate的Deployment Manager工具的一部分,它具有对SQL Server的内置支持数据库。