删除记录时,索引播种仍然很高

时间:2011-12-29 19:11:02

标签: sql-server sql-server-2008

好的,我在数据库主题方面缺乏经验,但考虑到你的表中有一个名为id的字段的情况,它是Indexable / Increment-seeding。

所以也许你有1-60行,所以id在1-60之间,增量为“61”。

如果删除30-50行,那么增量是否应该回到“31”?填写那些30-50个ID,然后再回到61?

我的问题:::为什么不用MSSQL / SQL Server,这样做? 30-50之间丢失的未使用的ID永远不会再次使用。

此外,如果你在id 500-600之间手动插入一些行怎么办?当增量变为“500”时,是否会出现“重复键”错误? ???

因此,如果您的某些表格经常被每个用户更改 - 删除,插入,删除,插入,您最好希望id是bigint,因为它会很快进入1,000,000+区域,如果你有足够的用户。

2 个答案:

答案 0 :(得分:4)

如果该字段用作唯一ID,则不应让它重用值。删除后,不应重复使用值。

如果字段是自动生成的,则不应手动设置其中的值,特殊情况除外(如复制)。

是的;您需要确保选择足够大的数据类型。不要拉扯类似Y2K的特技并不必要地限制你的应用程序。

答案 1 :(得分:1)

如果您使用自动增量字段,强烈建议让SQL Server为您处理值。它以最小化完整性冲突的方式这样做。

也就是说,如果您真的想在大量删除后重置id值,请考虑使用TRUNCATE TABLE(如果要清除整个表,则会自动重置自动增量值),或DBCC CHECKIDENT如果你需要更好地控制它是如何工作的。

编辑:

这是为了演示当自动增量ID值中存在手动执行的间隙时SQL Server的行为:

BEGIN TRAN

create table #t1 (id int identity, data int)

insert into #t1 (data) values (1)
insert into #t1 (data) values (2)
insert into #t1 (data) values (3)
insert into #t1 (data) values (4)

select * from #t1

dbcc checkident(#t1, reseed, 10)

insert into #t1 (data) values (5)
insert into #t1 (data) values (6)
insert into #t1 (data) values (7)
insert into #t1 (data) values (8)

select * from #t1

dbcc checkident(#t1, reseed, 5)

insert into #t1 (data) values (9)
insert into #t1 (data) values (10)
insert into #t1 (data) values (11)
insert into #t1 (data) values (12)
insert into #t1 (data) values (13)
insert into #t1 (data) values (14)
insert into #t1 (data) values (15)
insert into #t1 (data) values (16)

select * from #t1 -- this will demonstrate that SQL Server is quite happy to duplicate IDs if you have manually introduced a gap and then reset the ID to a lower value...

truncate table #t1

insert into #t1 (data) values (1)
insert into #t1 (data) values (2)
insert into #t1 (data) values (3)
insert into #t1 (data) values (4)

select * from #t1 -- this will show that TRUNCATE TABLE does (yes, really!) reset the autoincrement id value.

create table #t2 (id int identity primary key, data int)

insert into #t2 (data) values (1)
insert into #t2 (data) values (2)
insert into #t2 (data) values (3)
insert into #t2 (data) values (4)

select * from #t2

dbcc checkident(#t2, reseed, 10)

insert into #t2 (data) values (5)
insert into #t2 (data) values (6)
insert into #t2 (data) values (7)
insert into #t2 (data) values (8)

select * from #t2

dbcc checkident(#t2, reseed, 5)

-- the errors you are about to get should demonstrate that if there is an integrity constraint (in this case, the ever-popular PRIMARY KEY constraint) you will get errors when attempting to insert duplicates.

insert into #t2 (data) values (9)
insert into #t2 (data) values (10)
insert into #t2 (data) values (11)
insert into #t2 (data) values (12)
insert into #t2 (data) values (13)
insert into #t2 (data) values (14)
insert into #t2 (data) values (15)
insert into #t2 (data) values (16)

select * from #t2

ROLLBACK