【发布时间】:2019-03-09 16:22:18
【问题描述】:
我正在使用 SQL Server 存储数千万条记录。我需要能够查询其表以查找 Id 列中存在间隙的缺失行,因为应该没有。
我目前正在使用我在 StackOverflow 上找到的解决方案:
CREATE PROCEDURE [dbo].[find_missing_ids]
@Table NVARCHAR(128)
AS
BEGIN
DECLARE @query NVARCHAR(MAX)
SET @query = 'WITH Missing (missnum, maxid) '
+ N'AS '
+ N'('
+ N' SELECT 1 AS missnum, (select max(Id) from ' + @Table + ') '
+ N' UNION ALL '
+ N' SELECT missnum + 1, maxid FROM Missing '
+ N' WHERE missnum < maxid '
+ N') '
+ N'SELECT missnum '
+ N'FROM Missing '
+ N'LEFT OUTER JOIN ' + @Table + ' tt on tt.Id = Missing.missnum '
+ N'WHERE tt.Id is NULL '
+ N'OPTION (MAXRECURSION 0);';
EXEC sp_executesql @query
END;
此解决方案一直运行良好,但随着表的增长,它变得越来越慢且占用更多资源。现在,在 3800 万行的表上运行该过程大约需要 3.5 分钟和大量 CPU。
有没有更有效的方法来执行此操作?在发现某个范围不包含任何缺失的 Id 后,我不再需要再次检查该范围。
【问题讨论】:
-
我将使用与递归 cte 不同的方法生成计数表,如下所示:stackoverflow.com/a/1394239/5070879。第二件事 ID 可能对 IDENTITY/SEQUENCE 都有差距
-
看看这个answer 寻找运行计数器中的空白。
-
我建议使用
QUOTENAME,你那里的东西很容易注入 -
真正的问题是你为什么关心 id 列中的空白。
标签: sql-server tsql