编辑:更新为状态它没有挂起,只需要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行中消失到以太..
答案 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 INSERT
和GO
语句。
通过在调试时查看我的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的内置支持数据库。