J'ai une application qui a besoin de créer un instantané des identificateurs d'enregistrement qui peuvent être persistés dans le serveur de base de données. J'ai actuellement une table qui ressemble à ceci:sélectionner en vrac dans un varbinary
CREATE TABLE Workset (
Workset_id int,
Sequence int,
Record_id int
)
que j'insérer en utilisant quelque chose comme:
INSERT INTO WorkSet (Workset_id, Sequence, Record_id)
SELECT TOP 100
@Workset_id,
ROW_NUMBER() OVER (
ORDER BY -- this may be a complex ordering clause
),
Record_id
FROM SalesRecords
-- WHERE some conditions are met
Plus tard, je peux interroger pour l'identificateur d'enregistrement d'une entrée spécifique dans le jeu de travail par l'identifiant et le numéro de ligne
SELECT SalesRecords.* FROM SalesRecords
JOIN WorkSet ON WorkSet.Record_Id = SalesRecords.Record_id
WHERE Workset_id = @Workset_id AND Sequence = @Sequence
le problème est que l'instantané devient grand la quantité de données que je dois écrire dans les données sous-projet se développe rapidement. Il ne serait pas rare d'avoir un workset dans les millions d'enregistrements et si chacun de ces éléments nécessite 12 octets de stockage en ligne, il s'additionne rapidement.
Il semble qu'une façon plus compacte de représenter les données consisterait à stocker simplement un ID de workset et une colonne varbinary contenant tous les identificateurs d'enregistrement dans l'ordre de séquence. Cela évite d'avoir à répéter l'identificateur de l'ensemble de travaux pour chaque ligne du même sous-projet et évite d'avoir à stocker les numéros de séquence (car ils sont impliqués par la position dans le varbinary).
Existe-t-il un moyen raisonnable de transformer ma requête INSERT en quelque chose qui génère un varbinary des identifiants d'enregistrement dans l'ordre?