Я экспериментирую с программой, которая с высокой скоростью вставляет данные в базу данных SQL 2005 Server (в XP SP3). (Это для сбора данных о времени, чтобы я мог оценить различные аспекты моего дизайна).
Моя базовая установка включает в себя вставку данных в таблицу, как показано ниже (и использование SP, который просто определяет поле полезной нагрузки):
create table data
(
Id int PRIMARY KEY Identity,
payload datatime not null,
inserted datetime default (getdate()) not null
)
Обратите внимание, что оба поля даты и времени также имеют уникальные ограничения.
В клиентской программе я вызывал SP в такой тесной петле, что у меня возникли проблемы с точностью значения .Net DateTime.Now (и, возможно, также спящего потока) и, следовательно, нарушение уникального ограничения полезной нагрузки. Я обратился с помощью комбинации переменной секундомера, небольшого количества Thread.Sleep () и ручного построения данных «полезной нагрузки», чтобы они не нарушали разрешение поля SQL DateTime (3,3 мс)
Однако, когда вставки генерируются со скоростью от 5 мс до 10 мс, я начал видеть проблемы с полем «Вставка» на стороне SQL, где строка регулярно отклоняется из-за нарушения уникального ключа. Только когда я замедляю скорость вставки более чем до 15 мс, эта проблема исчезает. Эта скорость подозрительно похожа на проблему точности, с которой я столкнулся в .Net DateTime.Now (где-то я прочитал 16 мс), поэтому мне интересно, какова действительная точность функции SQL Getdate ().
Так может кто-нибудь сказать мне, что поддерживает GetDate (), и будет ли он привязан к тому же источнику, что и значение .Net DateTime.Now? И какой точности от этого ожидать?
Кроме того, я знаю о типе DATETIME2 на сервере SQL 2008, поэтому возникает вопрос о том, какова точность для GetDate () в этой системе.