0
votes

La valeur ID de colonne SQL saute 10000 fois

L'index de la colonne ID saute 10000 fois.

Par exemple:

de index :

  • 5 va à 10006

  • et le continue 10007 , 10008 , 10009

  • puis va à 20003 , 20004 ....

    Comment puis-je corriger les valeurs d'identification et les mettre à nouveau comme avant?

    Aussi, j'ai trouvé quelque chose à propos d'une fonction Reseat, mais je ne sais pas ce que c'est et comment l'utiliser?


4 commentaires

Veuillez fournir des informations sur l'insert dans la table.


Ceci est une fonctionnalité connue et Viette qui se produit normalement après une fermeture (inappropriée). Un identité est un nombre arbitraire qui est toujours ascendant, rien de plus, rien de moins. Sa valeur réelle n'a pas de sens que cela est plus grand que l'avant, et est donc (le long d'une contrainte unique) un bon canditidate pour un kot principal. Vous ne devriez pas «prendre soin» de quelle valeur réelle est.


Si vous voulez vraiment un numéro séquentiel, utilisez une séquence docs.microsoft.com/en-us/sql/t-sql/statifs/...


Avez-vous vraiment besoin d'un numéro séquentiel?


3 Réponses :


1
votes

Ce n'est pas un problème. Ceci est une fonctionnalité de performance de SQL Server.

SQL Server est conçu pour gérer de nombreuses transactions simultanées - Pensez des dizaines ou des centaines d'inserts par seconde. Il peut faire cela sur des systèmes avec plusieurs processeurs.

Dans un tel environnement, "Ajout d'un peu de 1" au maximum peut avoir beaucoup de frais généraux - tous les différents processeurs doivent être d'accord sur ce que le maximum est. Cela implique un verrouillage complexe ou un séquençage des transactions - qui ralentit les choses.

Pour prévenir les goulots d'étranglement de la performance, SQL Server préférera parfois pré-allouer des valeurs d'identité. Cela peut entraîner des lacunes si les chiffres ne sont pas utilisés.

Si vous n'aimez pas cette fonctionnalité, vous pouvez le contourner en utilisant une séquence et une gâchette pour attribuer la valeur. Juste être averti que des approches alternatives ont des implications de performance.


0 commentaires

3
votes

Je suppose que vous utilisez une colonne d'identité:

BEGIN TRAN

--CREATE TEMP TABLE
DECLARE @Tooltip TABLE
(
    [TooltipId] INT NOT NULL,
    [TooltipKey] NVARCHAR(100) NOT NULL,
    [Name] NVARCHAR(255) NOT NULL
)

--INSERT EXISTING INTO TEMP TABLE
INSERT INTO @Tooltip (TooltipKey, Name )
SELECT TooltipKey, Name
FROM dbo.Tooltip
ORDER BY TooltipId


--CLEAR ACTUAL TABLE
TRUNCATE TABLE dbo.Tooltip

--RESET IDENTITY TO 1
DBCC CHECKIDENT ("dbo.Tooltip", RESEED, 1)

--REINSERT FROM TEMP TABLE INTO ACTUAL TABLE
INSERT INTO dbo.Tooltip (TooltipKey, Name )
SELECT TooltipKey, Name
FROM @Tooltip
ORDER BY TooltipId

--TEST OUTPUT
SELECT * FROM dbo.Tooltip

--DO THIS FOR TESTING
ROLLBACK TRAN

--DO THIS WHEN YOU'RE CERTAIN YOU WANT TO PERFORM THE ACTION
--COMMIT TRAN


4 commentaires

Comment puis-je réexécuter la colonne ID du studio de gestion?


Pourriez-vous également m'expliquer le contrôle DBCC ("DBO.MYTABLE", RECEED, 10), ce que cela signifie et ses parties? Merci d'avance


En outre, comment puis-je corriger toutes les valeurs d'identification et les mettre à nouveau à partir de 1, 2, 3, 4 ....


Le code de votre checeur DBCC réexécutera la colonne. Donc, si vous avez besoin de la définir de manière à ce que le numéro suivant soit 6 DO DBCC Checkident ("DBO.MYTABLE", RESEEEE, 6)



1
votes

Avez-vous exécuté de grandes suppressions?

Supprimer ne réinitialise pas l'identité, donc si vous aviez des rangées 1-10000, puis les toutes les ont supprimées, l'identité continuerait toujours de 10001 lorsque vous avez ajouté une nouvelle ligne.

tronquage réinitialise l'identité, mais supprime toujours toutes les lignes sans journalisation.

Vous pouvez utiliser la fonction Reseat pour réinitialiser l'identité également, mais ne seriez pas utile pour cette affaire puisque vous réprimez lentement dans les identifiants utilisés par les données existantes.


2 commentaires

Merci pour la réponse mais je n'ai rien supprimé, comment je peux réexécuter la colonne ID?


La fonction de réseel serait "DBCC Checkident (" [TestTable] ", Reseat, 0)". Ne le faites pas, votre table a déjà des données. Les autres réponses ont déjà couvert les raisons d'alternance des lacunes dans l'identité. Si la numérotation est importante, utilisez le type de données de séquence.