我在SQL Server 2012管理工作室工作。
在SQL查询窗口中,正在插入#table
。预计将插入约8000万行,每行3 INT
列。
正在进行查询执行。
有没有办法可以跟踪#table
中的行数?
答案 0 :(得分:5)
由于您不能同时在同一窗口中运行两个查询,并且如果使用单个#声明临时表,则在其他会话中无法访问临时表,您应该尝试在插入查询中使用双#来定义它。
然后你可以尝试使用WITH(NOLOCK)查询它。
在同一个数据库上打开一个新的查询窗口,然后尝试
SELECT COUNT(*)
FROM ##YourTableName WITH(NOLOCK)
这会导致脏读,但我认为这不是一个问题,因为您希望对INSERT的位置进行粗略测量。
答案 1 :(得分:1)
如果您希望运行查询以计算另一个窗口中的行或在声明表的范围之外,请使用全局临时表。
例如,
CREATE TABLE ##table(
a int,
b int,
c int)
在另一个可以运行的窗口中,这将有效
SELECT COUNT(*) FROM ##table WITH (NOLOCK)
答案 2 :(得分:1)
一种方法是使用临时表对象id查询DMV。您可以使用此查询从创建它的会话中获取本地临时表对象ID:
SELECT OBJECT_ID(N'tempdb..#table', 'U');
然后在另一个窗口中运行下面的脚本,提供上述查询中的object_id值(在此示例中为-1180342868):
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);
请注意,这可能不是跟踪加载进度的可靠方法。很大程度上取决于查询计划的细节。可能是昂贵的操作员在计划的早期阶段,并且实际插入在最后一刻之前不会发生。