小编Dan*_*Dan的帖子

SELECT INTO 语句的进展

我们的 ETL 流程有一个长时间运行的 SELECT INTO 语句,它动态地创建一个表,并用数亿条记录填充它。

该声明看起来像 SELECT ... INTO DestTable FROM SrcTable

出于监控目的,我们希望大致了解此语句在执行时的进度(大约行计数、写入的字节数或类似内容)。

我们尝试了以下方法无济于事:

-- Is blocked by the SELECT INTO statement:
select count(*) from DestTable with (nolock)

-- Returns 0, 0:
select rows, rowmodctr
from sysindexes with (nolock)
where id = object_id('DestTable')

-- Returns 0:
select rows
from sys.partitions
where object_id = object_id('DestTable')
Run Code Online (Sandbox Code Playgroud)

此外,我们可以在 中看到事务sys.dm_tran_active_transactions,但我无法找到一种方法来获取给定的受影响行数transaction_id(类似于@@ROWCOUNT也许,但带有transaction_idas 参数)。

我知道在 SQL Server 上,SELECT INTO 语句是 DDL 和 DML 语句合二为一,因此,隐式表创建将是一个锁定操作。我仍然认为必须有一些聪明的方法来在语句运行时获取某种进度信息。

sql-server insert sql-server-2014

15
推荐指数
4
解决办法
9535
查看次数

正在进行大容量插入时 SSDT 架构比较不起作用

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

今天,我发现当 SSIS 包正在对数据库表执行 BULK INSERT 时,不可能对该数据库执行 SSDT 模式比较。这是不幸的,因为我们的一些软件包需要很长时间才能完成。我们想使用 Schema Compare 功能来检测数据库结构的更改,以便将它们保存在我们的 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 架构比较完成其工作的解决方案更感兴趣,即使某些对象被锁定。

sql-server ssis ssdt

11
推荐指数
1
解决办法
693
查看次数

标签 统计

sql-server ×2

insert ×1

sql-server-2014 ×1

ssdt ×1

ssis ×1