更改表列运行速度很慢,无法从该表中选择数据

时间:2013-10-04 21:10:54

标签: sql sql-server sql-server-2012

我运行了一个非常简单的alter table查询

更改表mytable alter column shortname nvarchar(35)

尝试将该列的大小从20个字符增加到35个字符。在几分钟的查询仍未完成之后,我取消了它。现在我甚至无法对该表进行选择。通常选择*需要少于一秒才能返回结果。现在几分钟后它仍在运行,没有结果。

Execution time of ALTER COLUMN

我看了那个帖子,但那里没有任何帮助给我。

该表本身有大约3000条记录,大多数是文本,大多数记录最多只占一段文本。正如我所说,做一个select *通常会在一秒钟内返回所有记录。

这是SQL Server 2012

该列是我最近添加到表中的列。此表上有多个FK关系,但它们都不涉及此列。

1 个答案:

答案 0 :(得分:5)

您的SELECT被屏蔽了。一些潜在的事情:

  • 代码仍然可以回滚。当您点击取消时,如果Management Studio尚未向您显示“用户取消查询”或其他内容,则您需要继续等待。

  • 代码可能已在事务中运行,其他查询被阻止。在您运行此更改的窗口中(并单击取消),检查SELECT @@TRANCOUNT; - 如果是> 0,多次运行ROLLBACK TRANSACTION;

在任何一种情况下,您都应该能够检查阻止SELECT的人或者是谁。请注意运行查询的会话ID(这是5971之类的数字,它位于查询窗口的选项卡和/或状态栏的括号中。打开一个新的查询窗口(当该窗口继续运行时)并运行以下命令:

SELECT blocking_session_id, wait_type, last_wait_type
  FROM sys.dm_exec_requests WHERE session_id = <value>;
-- replace <value> with the session id from the original query

现在,如果blocking_session_id是一个正整数,您可以看到那个人正在做什么阻碍了你,例如

SELECT * FROM sys.dm_exec_requests WHERE session_id = <blocker>;

DBCC INPUTBUFFER(<blocker>);

-- replace <blocker> with the blocking_session_id

否则,请告诉我们wait_type值是什么......