【发布时间】:2012-06-08 20:38:13
【问题描述】:
我目前正在运行以下语句
select * into adhoc..san_savedi from dps_san..savedi_record
这需要很长时间,我想看看它走了多远,所以我运行了这个:
select count(*) from adhoc..san_savedi with (nolock)
这并没有及时返回任何东西,所以我做了这个:
select top 1 * from adhoc..san_savedi with (nolock)
即使这似乎无限期地运行。如果有数百万条记录,count(*) 可能需要很长时间,我可以理解,但我不明白为什么考虑到我指定了 nolock,选择前 1 条记录不会立即返回。
以完全公开的名义,dps_san 是一个通过链接服务器从 odbc 连接中提取的视图。我不认为这会影响为什么我不能返回第一行,而是将它扔在那里以防我错了。
所以我想知道是什么阻止了该语句的运行?
编辑:
正如我上面提到的,是的 dps_san..savedi_record 是一个视图。它的作用如下:
select * from DPS_SAN..root.SAVEDI_RECORD
它只是一个别名,没有分组/排序/等,所以我认为问题不在于这里,但如果我错了,请赐教。
【问题讨论】:
-
视图有什么作用?如果它执行 GROUP BY、ORDER BY 或使用聚合函数,那么选择前 1 行的成本可能几乎与选择所有行一样昂贵。
-
您确定 SELECT INTO 已将单行写入磁盘了吗?也许它仍处于模式锁定模式,因为它仍在等待 ODBC 从您的链接连接中传递第一行。
-
@AaronBertrand 不,我不确定。但是,我可以打开另一个查询窗口并从 dps_san..savedi_record 中选择我想要的所有记录并获得结果,所以如果它现在还没有写入任何结果(已经 2 多个小时),那就太奇怪了。
标签: sql sql-server-2008 locking