4

编辑:更新声明它没有挂起,只需要 AGES !

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

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

这种如果时差是可以预期的吗?全面使用了redgate的SqlCompare,我发现时间不合时宜。

deploy 方法的第三个参数是 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

4 回答 4

7

好的,通过调试器(VS2012)运行时经历了愚蠢的时代。编译后,选择 Memory DacSchemaModelStorageType 时的时间约为 25 秒,选择 File DacSchemaModelStorageType 时的时间约为 45 秒。

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

于 2013-05-14T14:44:59.127 回答
2

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

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

努力修复警告,构建时间应该会减少。

埃德

于 2014-12-02T23:59:04.563 回答
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 条INSERTANDGO语句。通过在调试时查询我的 dbo.Resource 表并看到有问题的脚本执行缓慢,我能够看到该脚本导致了问题,因为该表中的行数仍在增加。

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

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

这解决了问题。

于 2016-06-16T12:26:57.720 回答
0

希望有人能提供一些具体的 dacpac 建议,但由于您提到 SQL 比较更快,您可能希望查看基于包的部署,作为 Red Gate 部署管理器工具的一部分,该工具具有对 SQL Server 数据库的内置支持。

于 2013-05-07T09:09:14.303 回答