【问题标题】:Create Table DDL causes sql server to hang创建表 DDL 导致 sql server 挂起
【发布时间】:2015-05-21 14:03:04
【问题描述】:

此 DDL 语句中是否有任何内容可能导致系统挂起并创建长时间运行的查询?

  -- Abort on any error
SET XACT_ABORT ON
GO
-- FUll isolation
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
GO
CREATE TABLE ClientPayerCrosswalkMapping
( 
  id INT IDENTITY(1, 1) NOT NULL,
  lbxid INT NOT NULL,
  ClientPayerID NVARCHAR(80),

  CONSTRAINT PK_ClientPayerCrosswalkMapping_ID PRIMARY KEY CLUSTERED (id),
  CONSTRAINT UN_lbxid UNIQUE(lbxid),

  CONSTRAINT FK_LockboxDocumentTracking FOREIGN KEY (lbxid)
  REFERENCES LockboxDocumentTracking(lbxid)
);

GO

这是在 SQL Server 2005 上,当时系统处于中等负载状态。

这是新表,为什么系统会挂起,我唯一的怀疑是表有一个 CONSTRAINT

【问题讨论】:

  • 这里真的需要事务和SERIALIABLE隔离级别吗?如果它只创建一个表,您可以随时再次删除它,例如如果后续数据填充脚本失败。
  • 其实,你为什么需要交易呢?
  • 应该有一些记录在填充后插入到该表中,这就是我们有事务的原因。但是是的,它可以在没有交易的情况下执行
  • 使用事务包装 DDL 语句可能会出现问题(具有特殊处理的 #temporary 表除外)。尝试将CREATE TABLE .. 移出事务。
  • 此外,无论何时您使用SERIALIZABLE,您都应该预料到可能会有很长的延迟。

标签: sql sql-server ddl


【解决方案1】:

在不创建任何事务的情况下试试这个:

CREATE TABLE ClientPayerCrosswalkMapping
( 
  id INT IDENTITY(1, 1) NOT NULL,
  lbxid INT NOT NULL,
  ClientPayerID NVARCHAR(80),

  CONSTRAINT PK_ClientPayerCrosswalkMapping_ID PRIMARY KEY CLUSTERED (id),
  CONSTRAINT UN_lbxid UNIQUE(lbxid),

  CONSTRAINT FK_LockboxDocumentTracking FOREIGN KEY (lbxid)
  REFERENCES LockboxDocumentTracking(lbxid)
);

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 2011-07-25
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2013-03-24
    相关资源
    最近更新 更多