2014-07-21 34 views
1

我正在SQL Server 2012管理工作室工作。跟踪正在进行人口统计的#table中的行数

在SQL查询窗口,插入到#table正在发生的事情。预计将插入大约8000万行,每个列有3个INT列。

查询执行正在进行。

有没有办法,我可以跟踪任何中行的#table的方法吗?

+0

你如何插入行?有没有可能监控这个过程? –

+0

插入发生在#table。 (例如:#934),仅在该查询窗口中可用。在查询运行时,我可以执行任何其他操作。 –

+0

不,哪些或哪些代码将行插入#934? –

回答

5

既然你不能同时运行在同一窗口中的两个查询,如果他们与单个#声明的临时表是不是在其他会话中访问,你应该尝试在你的插入查询双#定义它。

然后,你可以尝试使用WITH(NOLOCK)查询它。

打开同一数据库一个新的查询窗口,并尝试

SELECT COUNT(*) 
FROM ##YourTableName WITH(NOLOCK) 

这将让脏读,但我不认为它会在你的情况的问题,你想在哪里粗略衡量你的INSERT是。

+0

我在新的查询窗口中执行此操作。 但收到错误 '消息208,级别16,状态0,第1行 无效的对象名称#934'。 –

+1

你正在使用临时表吗?刚注意到这一点。有一个#使得表只能在当前范围内访问,在你的情况下是当前查询编辑器。如果您可能会改变您的插入查询使用##表,这将使其在其他会话中可访问。 –

+0

是的,我想我应该用##表来代替... –

1

如果你想运行查询计数在另一个窗口或者被宣布为表范围之外的行,请使用全局临时表。

例如,

CREATE TABLE ##table(
a int, 
b int, 
c int) 

而且在可以运行另一个窗口,这将工作

SELECT COUNT(*) FROM ##table WITH (NOLOCK) 
1

一种方法是查询中使用临时表对象ID的动态管理视图。你可以从创建它使用此查询会话的本地临时表对象ID:

SELECT OBJECT_ID(N'tempdb..#table', 'U'); 

然后在另一个窗口中运行下面的脚本,(在这个例子中-1180342868)提供从上述查询的OBJECT_ID值:

DECLARE @object_id int = -1180342868; 
SELECT SUM(rows) 
FROM tempdb.sys.partitions 
WHERE 
    object_id = @object_id 
    AND index_id IN(0,1); 

当然,这种方法假定您有先见之明,在运行插入之前获取临时表对象ID。如果查询当前正在运行,则可以运行下面的脚本并进行有根据的猜测,以确定哪个对象可能是要加载的临时表。

USE tempdb; 
SELECT OBJECT_NAME(object_id), SUM(rows) 
FROM tempdb.sys.partitions 
WHERE 
    index_id IN(0,1) 
    AND OBJECTPROPERTYEX(object_id, 'IsUserTable') = 1 
GROUP BY 
    OBJECT_NAME(object_id); 

请注意,这可能不是跟踪加载进度的可靠方法。很大程度上取决于查询计划的细节。这可能是昂贵的操作员在计划中较早,并且直到最后一分钟才会发生实际插入。

+0

让我试试这个..我会让你知道,它是如何为我工作的。 –