2009-03-31 4 views
3

J'ai une table qui stocke les ticks de stock dans sql server 2008. Elle est entrée dans la colonne de symbole et le datecolumn qui est datetime2. Dans une application C# inserts sont envoyés à un taux élevé à la table. Actuellement, une ligne est créée à l'aide du symbole DateTime.Now, puis insérée. La situation peut survenir lorsque 2 ticks pour le même symbole entrent et que datetime.now revient en même temps, jusqu'à la milliseconde. Ma question est comment puis-je m'assurer que mes inserts n'utilisent pas la même heure pour un symbole donné. Je suppose que je pourrais avoir une autre clé unique comme rowver ou somekind de autonumber dans la base de données comme une solution, mais même si l'insertion est réussie, je ne veux pas qu'il y ait des temps de duplicata pour un symbole donné. J'ai aussi pensé à stocker le dernier temps d'insertion et à y ajouter une millième de seconde s'il est égal. Je ne suis pas sûr de la meilleure façon d'y arriver. Aussi le datetime2 semble avoir plus de précisions que le datetime .net, donc je ne sais pas si je devrais essayer de le résoudre sur le serveur ou le client.Comment conserver les insertions de colonnes datetime2 uniques?

Merci

Je veux garder insérer tout, peu importe quoi et pour des raisons de performance, je ne veux pas aller avec la vérification des valeurs antérieures, donc la solution que je vais aller avec est une colonne d'identité. Cela me permettra de préserver l'ordre des insertions tout en permettant des doublons dans le datetime2.

Répondre

2

Utilisez une colonne d'identité en tant que clé primaire et placez simplement un index (qui peut être mis en cluster si vous le souhaitez) sur la coche + datetime. Je ne suis pas sûr de ce que vous voulez avec les dups, mais de cette façon, vous serez en mesure d'enregistrer qu'ils se sont produits ...

1

Je pense que la réponse à cela dépendra de ce que vous voulez faire dans le cas où un symbole entre en même temps?

Vous pouvez créer un index unique sur le symbole et la colonne datetime - mais cela entraînerait une violation de clé unique pour l'une des deux instances. Si vous concevez pour la performance, cela pourrait être un exercice coûteux.

Une autre option consiste à avoir une colonne d'horodatage, ce qui assurerait que même si vous obtenez deux symboles identiques exactement au même moment, votre insertion n'échouera pas. La vraie question est - que voulez-vous faire avec ce deuxième symbole identique? Pouvez-vous vous permettre de vérifier si un symbole et un datetime identiques existent déjà dans la table avant de l'écrire? Donc, vous pourriez alors vous connecter et rejeter le doublon?

+0

Eh bien, je veux enregistrer le double dans le tableau, peu importe quoi, comme un vrai métier, je ne me inquiète pas si le temps est tout à fait correct , donc ajouter une milliseconde est ok, je veux juste qu'il soit proche et préserve l'ordre de la façon la plus performante possible – RBear

0

Vos insertions de base de données sont-elles sûres? C'est à dire. Est-il possible que deux insertions puissent se produire en même temps et ne pas se connaître? Dans ce cas, stocker le plus haut et ajouter une milliseconde ne fonctionnerait pas.

Vous devrez peut-être avoir une procédure régulière qui passe par et incrémente une fois dans le cas d'une collision. N'utilisez pas la date/heure dans la clé.

1

Ne pas utiliser C# DateTime.Now, même si DateTime.Now est thread-safe il peut renvoyer deux valeurs identiques. Il vaudrait mieux utiliser la propriété autogenerated de votre colonne Datetime2.

modifier: ... en définissant la propriété autogenerated à DateHeureSys()

+0

Cela ne garantit pas non plus d'être unique. –