在SQL Server中找到主键中丢失数最少的最快方法

时间:2015-07-22 08:35:09

标签: sql-server

我在SQL Server中的表上有一个主键(我使用的是版本9.00.4060.00 SP3标准版)。

假设它的值为1,2,3,5,17。

我可以按顺序遍历每一行,直到找到一个缺失值(在这种情况下为4),如果行数很小,那就没问题,但是如果有数百万行,第一个缺失的数字在中间这将需要很长时间。

是否有一些SQL Server内置功能可以快速执行此操作?

3 个答案:

答案 0 :(得分:3)

这真的需要多长时间吗?

SELECT MIN(ID) + 1 
FROM TableName t1
WHERE NOT EXISTS
(
    SELECT 1 FROM TableName t2
    WHERE ID = t1.ID + 1
)

编辑:我已经在一张包含约1亿条记录的桌子上进行了测试,这真的花了一些时间,比我想象的要多。在12522150处缺少主键,查询花了31秒。

您也可以使用ROW_NUMBER,它可以在SQL-Server 2005上运行:

WITH CTE AS
(
    SELECT ID, RN = ROW_NUMBER() OVER (ORDER BY ID)
    FROM TableName
)
SELECT MIN(ID) + 1
FROM CTE
WHERE ID <> (RN - 1) + (SELECT MIN(ID) FROM TableName)

但这个查询甚至需要41秒。

两个查询都假定以下规则:

  • 如果第一个值是1000,那么它不是第一个差距
  • 如果有1002
  • ,则第一个差距为1000,1001,1003

答案 1 :(得分:1)

stackoverflow上有一个类似的问题。看这里:Find the smallest unused number in SQL Server

SELECT TOP 1 t1.Id+1 
FROM table t1
WHERE NOT EXISTS(SELECT * FROM table t2 WHERE t2.Id = t1.Id + 1)
ORDER BY t1.Id

答案 2 :(得分:0)

没有内置功能来执行此操作。你可以试试这样的东西

SELECT Min(ID) AS MIN_MISSING_ID
FROM   (SELECT *,
               RN= Row_number()OVER (ORDER BY ID)
        FROM   Yourtable) dt
WHERE  RN < ID