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

mer*_*erk 1 sql sql-server sql-server-2012

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

更改表mytable alter column shortname nvarchar(35)

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

ALTER COLUMN的执行时间

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

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

这是SQL Server 2012

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

Aar*_*and 5

SELECT被封锁了.一些潜在的事情:

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

现在,如果blocking_session_id是一个正整数,你可以看到个人阻止你的人或者是什么,例如

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

DBCC INPUTBUFFER(<blocker>);

-- replace <blocker> with the blocking_session_id
Run Code Online (Sandbox Code Playgroud)

否则,让我们知道wait_type价值是什么......