进行大容量插入时,SSDT Schema Compare不起作用


11

我正在一个大型ETL和DW项目中工作,在该项目中我们将TFS /源代码控制与SSIS和SSDT一起使用。

今天,我发现,当SSIS包对数据库表执行批量插入时,无法对该数据库执行SSDT架构比较。这很不幸,因为我们的某些软件包需要很长时间才能完成。我们希望使用“模式比较”功能来检测对数据库结构的更改,以便将其保存在我们的SSDT项目中,以进行数据库的版本控制。

仔细研究一下,我发现SSDT中的Schema Compare函数执行一个SQL脚本,该脚本OBJECTPROPERTY()在数据库的表上调用系统函数。特别是在我的情况下,OBJECTPROPERTY(<object_id>, N'IsEncrypted')<object_id>引用当前正在批量插入的表时,对的任何调用似乎都被阻止了。

在Visual Studio中,SSDT架构比较会在一段时间后简单地超时,并声称未检测到差异。

SSDT中是否有解决此问题的方法,还是应该尝试提交MS Connect错误报告?

或者,由于BULK INSERT来自SSIS包,是否有某种方法可以在不锁定OBJECTPROPERTY表调用的情况下进行此插入?编辑:在SSIS OLE DB目标中,我们可以删除“锁定表”中的复选标记,该标记如其所愿,但这在某些情况下可能会损害性能。我对允许SSDT架构比较执行其工作的解决方案更感兴趣,即使某些对象被锁定。


看看控制批量导入的锁定行为 -您可能启用了“批量加载时的表锁定”。还要检查您的BULK INSERT是否未指定TABLOCK
stuartd

如果您正在使用表锁,则无论如何都要禁用负载(technet.microsoft.com/en-us/library/ms177445.aspx),无论找到什么原因,我都会引发连接,因为超时应该在至少失败,而不仅仅是说没有改变
Ed Elliott

谢谢stuartd和Ed Elliot的答复。事实证明,出于性能原因,我们实际上确实希望锁定表。我认为,SSDT应该能够处理此问题,因为我们只想比较数据库,而不是将更改应用于数据库中的对象。我将创建一个连接帖子来解决这个问题。
2015年

3
内部结构不是我的专长,但据我了解,您在桌子上有锁。无论采取什么锁定,都是因为大容量插入与验证架构所需的锁定不兼容。相关阅读BOL 模式锁
billinkc

您能否更好地解释为什么模式比较必须与装入操作并行运行?也许替代方法是拥有数据库的参考模型。没有数据,只有架构。对此进行比较,然后确保在没有首先更新参考模型的情况下,没有人修改正在执行这些批量操作的实际数据库。
billinkc

Answers:


19

OBJECTPROPERTY调用需要架构稳定(Sch-S)锁,该锁仅与架构修改(Sch-M)锁不兼容

BULK INSERT在某些情况下,此功能将使用Sch-M锁定。这些在“ 优化联机丛书中的批量导入指南 ”的“表锁定和日志记录”部分中列出:

批量导入锁定

如果目标表是群集的,则可能会发现启用跟踪标志610会有所帮助。请阅读所有这些文章和《数据加载性能指南》,并彻底测试是否决定采用这种方法。

我不知道为什么SSDT检查IsEncrypted表的属性。我无法想象一个有意义的方案,但这是SSDT人员的问题。


3
这是一个非常全面和令人满意的答案。非常感谢你。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.