小编Aba*_*cus的帖子

SQL Server 中 LOB 数据的慢速 DELETE

我有一个用于记录的表和一个用于清除DELETE 性能非常慢的旧数据的存储过程,这超出了我的理解。我正在寻找如何修改表或 DELETE 语句以在 LOB 数据上表现得相当好。或者,如果微软确认了这个问题——比如“我们已经用 SQL 服务器版本 x 解决了这个问题”,或者甚至“我们看到这性能很差,但它不是优先事项”——这也可以.

这是在 Microsoft SQL Server 2012 (SP3) 上运行的。下面基本上是我的实际表格和代码,只是稍微简化了:

CREATE TABLE [LOG_VALUE](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [VALUE] [varchar](max) NOT NULL,
 [CHECKSUM] [int] NOT NULL,
 [VALUE_LEN] [int] NOT NULL,
 CONSTRAINT [PK_LOG_REQUEST] PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

有问题的删除是通过以下方式完成的:

WHILE (@@ROWCOUNT > 0)
  DELETE TOP (100) [LOG_VALUE]
  OUTPUT DELETED.[VALUE_LEN] INTO @DELETED_ROWS
  WHERE [ID] IN (SELECT [ID] FROM @DELETE_IDS);
Run Code Online (Sandbox Code Playgroud)

基本的存储过程流程是:

  1. 删除引用要清除的行的值
  2. 从上述日志表中不存在的 LOB 表中选择 [ID] 值,放入表变量 @DELETE_IDS
  3. 一次删除前 …

performance sql-server delete sql-server-2012 blob

8
推荐指数
1
解决办法
2099
查看次数

这个 SQL Server PK 违规怎么可能?

我收到了一个我认为不可能的错误。我有一个 SQL Server(11.0.6594 版)表,如下所示:

CREATE TABLE [IDMaster](
  [ID] [int] NOT NULL,
 CONSTRAINT [PK_IDMaster] PRIMARY KEY CLUSTERED 
([ID] ASC) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

它基本上应该做 IDENTITY 现在所做的事情(已经有一段时间了)——它用于获取新的唯一整数值​​,这些值在其他几个表中使用。

现在我有一个 SQL 语句,它选择 MAX 值,添加到它,然后将该值插入到同一个表中——所有这些都在一个语句中。所以从理论上讲,这个语句不可能违反 PK(尽管我认为可能会陷入僵局)。但是,不知何故,它越来越之一。

违反 PRIMARY KEY 约束“PK_IDMaster”。无法在对象“IDMaster”中插入重复键。重复的键值为 (25309587)。

我不知道这怎么可能,但显然是这样;因为它刚刚发生。

想象一下,尝试从同一张表中生成新 ID 值的任何其他方法的疯狂、奇怪的混合,它们可能与此系统中存在的内容相去甚远。但是我想不出它们会导致该特定错误的任何方式。这是我的理解是SQL Server所使用的交易锁定强制执行,不具有(NOLOCK)一个SQL语句,它或任何东西内,也不能与行,它是引用的任何干扰。

唯一的另一个因素,我认为可能不相关但谁知道,是该 SQL 包含在 TRY 中,并设置了一些选项。这是出现该错误的 SQL:

SET XACT_ABORT ON;
SET IMPLICIT_TRANSACTIONS ON;
BEGIN TRY

INSERT INTO IDMaster (ID) 
 SELECT COALESCE(
  -- make sure the new value is odd
  CASE WHEN MAX(COALESCE(ID,0)) % 2 = …
Run Code Online (Sandbox Code Playgroud)

sql-server primary-key transaction

6
推荐指数
2
解决办法
3053
查看次数