GetDate в ограничении по умолчанию в некоторых таблицах в SQL Server 2012

StackOverflow https://stackoverflow.com/questions/19845370

Вопрос

Как и следовало ожидать, у меня проблемы с getDate в ограничении по умолчанию в некоторых таблицах в SQL Server 2012.

У меня есть два таблица, как ниже (A и B):

CREATE TABLE [dbo].[TABLE_A_OR_B] (
[TABLE_A_OR_B_PK]   BIGINT          IDENTITY (1, 1) NOT NULL,
[CREATE_DATETIME]   DATETIME2 (7)   CONSTRAINT [DF_TABLE_A_OR_B_CREATE_DATETIME] DEFAULT (getdate()) NOT NULL,
[CREATE_USER]       VARCHAR (100)   CONSTRAINT [DF_TABLE_A_OR_B_CREATE_USER] DEFAULT (suser_sname()) NOT NULL,
...
CONSTRAINT [PK_TABLE_A_OR_B] PRIMARY KEY CLUSTERED ([TABLE_A_OR_B_PK] ASC)
);

И у меня есть процедура, в которой я делаю две вставки - сначала до таблицы A и второй для B без столбца Create_dateTime. Между ними много вещей.

Теперь угадайте, что в столбце Create_DateTime в таблицах A и B?

Два раза - может быть, после 1 000 000 записей, никогда раньше - в таблице существует DateTime, больше, чем в таблице B для записей из того же выполнения SP (проверено) как:

row in A: 2013-11-07 00:02:22.7000000 
row in B: 2013-11-07 00:02:22.6970000

Вы можете дать мне некоторые подсказки, почему?

Ответы для комментариев:
1. Нет триггеров.
2. № 1 000 000 записей за раз, это общее количество записей в таблице в момент ошибки в первую очередь. Эта информация предназначена для статистического анализа - сегодня ошибка произошла после XX тысячи записей после последней ошибки - так что она очень случайная.
3. Да, операторы выполняются на 100% в этом порядке.
4. Нет транзакции или одиночных - двух разных процессов - та же ошибка.
5. Конечно DateTime2.

Важный! Кто -то сказал мне, что GetDate имеет точность до 3 миллисекунд, так что, возможно, GetDate Milliseconds с методом Round Robin, так что два раза в одно и то же время (Diff <3 мс) он может дать два разных приближения?

Это было полезно?

Решение 3

Похоже, что изменение ограничений SysDateTime, по -видимому, решает проблему.

Другие советы

Если вы вставляете и совершаете первую вставку в таблицу A, а затем вставьте и совершите вторую вставку в таблицу B, очень возможно получить этот результат, потому что он будет принимать эту разницу во времени, чтобы вставить две записи. Даже если вы не совершаете вставку в отдельные транзакции.

Когда таблица вырастет, вставка займет все больше и больше времени по многим причинам. Если таблица имеет индекс в каждой вставке, индекс должен принять к сведению, где была сохранена или организована запись. Во -вторых, фрагментация на страницах внутри SQL Server сделает вставку, чтобы занять больше времени. Проверьте свою индексную структуру, если вы хотите, чтобы более быстрые вставки держите коэффициент заполнения низким.

Если вы всегда хотите одно и то же время, создайте переменную, получите время, а затем сделайте вставку в обеих таблицах, используя эту переменную.

Надеюсь, поможет.

GETDATE() Получается из часов операционной системы - если что -то заставило часы на сервере измениться (на более раннее время), вы достигнете своего (очевидного) путешествия во времени.

Что может вызвать такие изменения? Очевидными являются ручная корректировка, или если сервер установлен для автоматической синхронизации своих часов с внешним источником - например, другой машиной на вашем домене или через NTP. Там могут быть и другие возможные причины.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top