Performances JOIN: key composite par rapport à la key primaire BigInt

Nous avons une table qui va dire 100 millions à un milliard de lignes (Nom de la table: Archive)

Cette table sera référencée à partir d'une autre table, Users.

Nous avons 2 options pour la key primaire sur la table Archive:

option 1: ID de données (bigint)

option 2: userID + datetime (version 4 octets).

Schéma:

Utilisateurs – ID user (int)

Archive – ID user – datetime

OU

Archive – ID de données (gros int)

Lequel serait le plus rapide?

Nous hésitons à utiliser l'option # 1 parce que bigint fait 8 octets et avec 100 millions de lignes qui s'ajoutent à l'allocation de stockage.

Mise à jour Ok désolé j'ai oublié de mentionner, userID et datetime doivent être indépendamment, donc c'était la raison pour ne pas append une autre colonne, dataID, à la table.

Quelques reflections, mais il n'y a probablement pas de solution claire:

  • Si vous avez un milliard de lignes, pourquoi ne pas utiliser int qui va de -2,1 milliards à +2,1 milliards?

  • Userid, int, 4 octets + smalldatetime, 4 octets = 8 octets, même chose que bigint

  • Si vous pensez à userid + smalldatetime alors sûrement c'est utile quand même. Si c'est le cas, l'ajout d'une colonne de substitution "archiveID" augmentera l'espace de toute façon

  • Avez-vous besoin de filterr / sortinger par userid + smalldatetime?

  • Assurez-vous que votre model est correct, inquiétez-vous des JOINs plus tard …

Préoccupation: L'utilisation de UserID / [small] datetime comporte un risque élevé de ne pas être unique.

Voici un vrai schéma. Est-ce ce dont vous parlez?

-- Users (regardless of Archive choice) CREATE TABLE dbo.Users ( userID int NOT NULL IDENTITY, <other columns> CONSTRAINT <name> PRIMARY KEY CLUSTERED (userID) ) -- Archive option 1 CREATE TABLE dbo.Archive ( dataID bigint NOT NULL IDENTITY, userID int NOT NULL, [datetime] smalldatetime NOT NULL, <other columns> CONSTRAINT <name> PRIMARY KEY CLUSTERED (dataID) ) -- Archive option 2 CREATE TABLE dbo.Archive ( userID int NOT NULL, [datetime] smalldatetime NOT NULL, <other columns> CONSTRAINT <name> PRIMARY KEY CLUSTERED (userID, [datetime] DESC) ) CREATE NONCLUSTERED INDEX <name> ON dbo.Archive ( userID, [datetime] DESC ) 

Si c'était ma décision, je serais certainement avec l'option 1. Le disque est bon marché.

Si vous utilisez l'option 2, il est probable que vous deviez append une autre colonne à votre PK pour la rendre unique, puis votre design commence à se dégrader.

Qu'est-ce que c'est avec l'option 3: Faire un ID de données de 4 octets int?

De plus, si je comprends bien, la table d'archivage sera référencée à partir de la table des users, donc cela n'aurait même pas beaucoup de sens d'avoir l'ID user dans la table d'archivage.

Je vous recommand de configurer une simulation pour valider ceci dans votre environnement, mais je pense que le single bigint serait plus rapide en général; Cependant, lorsque vous interrogez la table sur quoi allez-vous interroger?

Si je construisais une arhive, je pourrais avoir un champ d'identification auto-incrémenté, puis utiliser un schéma de partioning basé sur DateTime et peut-être userid mais cela dépendrait de la circonstance.