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 سجل ، لم يسبق له مثيل - هناك في الجدول A وقت أكبر مما كان عليه في الجدول 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 مللي ثانية ، لذا ربما يحصل على جولات ميلي ثانية مع طريقة Round Robin ، لذا مرتين لنفس الوقت أو تقريبًا (Diff <3ms) ، يمكن أن يعطي تقريبين مختلفين؟

هل كانت مفيدة؟

المحلول 3

يبدو أن GetDate to sysdatetime في القيود يحل المشكلة.

نصائح أخرى

إذا قمت بإدراج وارتكب أول إدراج في الجدول أ ثم أدخل وارتكاب الإدراج الثاني في الجدول B ، فمن الممكن جدًا الحصول على هذه النتيجة لأن سيأخذ هذا الاختلاف في الوقت المناسب لإدراج السجلين. حتى لو لم ترتكب الإدراج في معاملات منفصلة.

عندما ينمو الجدول ، سيستغرق الإدراج المزيد والمزيد من الوقت لأسباب عديدة. إذا كان الجدول يحتوي على فهرس في كل إدراج ، فيجب أن يلاحظ الفهرس المكان الذي تم فيه حفظ السجل أو تنظيمه. ثانياً ، سيجعل التفتت في الصفحات داخليًا في SQL Server الإدراج لقضاء المزيد من الوقت. تحقق من بنية الفهرس إذا كنت تريد إدراج أسرع حافظ على عامل التعبئة منخفضًا.

إذا كنت تريد نفس الوقت دائمًا ، فقم بإنشاء متغير احصل على الوقت ثم قم بإجراء الإدراج في كلا الجدول باستخدام هذا المتغير.

أتمنى أن يساعد ذلك.

GETDATE() مشتق من ساعة نظام التشغيل - إذا كان هناك شيء تسبب في تغيير الساعة على الخادم (إلى وقت سابق) ، فستحقق السفر عبر الزمن (الظاهر).

ما الذي يمكن أن يسبب مثل هذه التغييرات؟ من الواضح أن التعديل اليدوي ، أو إذا تم تعيين الخادم لمزامنة ساعته تلقائيًا بمصدر خارجي - مثل جهاز آخر في مجالك أو عبر NTP. قد يكون هناك أسباب محتملة أخرى أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top