我有一个用于记录的表和一个用于清除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)
基本的存储过程流程是:
我收到了一个我认为不可能的错误。我有一个 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)