J'expérimente avec un programme qui insère des données dans une base de données SQL 2005 Server (sur XP SP3) à haut débit. (Ceci est pour collecter des données de synchronisation afin que je puisse évaluer différents aspects de ma conception).Précision de SQL Getdate?
Mon configuration de base consiste à insérer une donnée dans un tableau comme suit (et en utilisant un SP qui spécifie que le champ de charge utile):
create table data
(
Id int PRIMARY KEY Identity,
payload datatime not null,
inserted datetime default (getdate()) not null
)
Notez que les deux champs datetime ont UNIQUE sur eux aussi .
Sur le programme client, j'appelais le SP dans une boucle tellement serrée que j'avais des problèmes avec la précision de la valeur .Net DateTime.Now (et éventuellement du thread dormant) et donc violant la contrainte unique de la charge utile. Je ai adressé par une combinaison d'une variable chronomètre, un peu de Thread.Sleep() et la construction manuelle des données "payload" de sorte qu'il n'a pas violé la résolution du champ SQL DateTime (3.3 mS)
Cependant avec les inserts étant générés à une vitesse comprise entre 5mS et 10mS J'ai commencé à voir des problèmes avec le champ "Inséré" du côté SQL où une ligne est régulièrement rejetée pour une violation de clé unique. Ce n'est que lorsque je ralentis mon taux d'insertion à plus de 15 mS que ces problèmes disparaissent. Ce taux ressemble étrangement au problème de précision que j'avais avec le .Net DateTime.Now (j'ai lu 16mS sur un post quelque part) donc je me demande quelle est la précision réelle de la fonction SQL Getdate().
Alors, quelqu'un peut-il me dire ce qui soutient GetDate(), et serait-il lié à la même source que la valeur .Net DateTime.Now? Et quelle précision dois-je en attendre? En outre, je connais le type DATETIME2 dans le serveur SQL 2008, ce qui soulève la question de savoir quelle est la précision de GetDate() dans ce système également.
Pourquoi avez-vous besoin d'une contrainte unique sur la colonne insérée? La colonne d'identité montrera dans quel ordre ils ont été insérés.Je présume que la base de données générée sera sensible aux variations naturelles de la fréquence avec laquelle elle peut traiter vos demandes d'insertion en raison d'une activité simultanée, si l'insertion précédente a causé une division de page etc. de toute façon, elle n'a aucun sens sémantique justifier le contraignant comme ça. –
@martin .. L'unicité et l'ordre ne sont pas la même chose. Je barbotais avec l'idée que vous ne pouviez pas insérer deux rangées en même temps - mais la précision du getdate m'a prouvé le contraire. Cependant, je ne dis pas que ce que je fais est la chose la plus intelligente au monde! –