سؤال

أعتقد أن السؤال الحقيقي هو:

إذا أنا لا أهتم القذرة يقرأ ، إضافة مع (NOLOCK) تلميح لتحديد بيان تؤثر على الأداء:

  1. الحالي SELECT
  2. المعاملات الأخرى ضد بالنظر إلى الجدول

على سبيل المثال:

Select * 
from aTable with (NOLOCK)
هل كانت مفيدة؟

المحلول

1) نعم, ، حدد مع NOLOCK استكمال أسرع من العادي حدد.

2) نعم, ، حدد مع NOLOCK سوف تسمح استفسارات أخرى ضد تنفذ الجدول لاستكمال أسرع من العادي حدد.

لماذا يكون هذا ؟

NOLOCK عادة (اعتمادا على DB المحرك) يعني تعطيني البيانات الخاصة بك, و لا يهمني ما الدولة هو و لا يكلف نفسه عناء عقد في حين لا يزال تقرأ من ذلك.بل هو في كل مرة أسرع وأقل موارد كثيرة جدا و خطير جدا.

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

كنت حقا لا تعرف ما هي الدولة من البيانات.

إذا كنت تحاول الحصول على أشياء مثل عدد الصفوف أو غيرها من البيانات الموجزة حيث هامش الخطأ مقبولا ، NOLOCK هو وسيلة جيدة لتعزيز الأداء على هذه الاستفسارات و تجنب وجود لهم تؤثر سلبا على أداء قاعدة البيانات.

دائما استخدام NOLOCK تلميح بحذر شديد و علاج أي بيانات تعود بشكل مثير للريبة.

نصائح أخرى

NOLOCK يجعل معظم حدد البيانات بشكل أسرع ، بسبب عدم وجود تأمين المشتركة.كما أن عدم صدور أقفال يعني أن الكتاب لن تعيقه الخاص بك تحديد.

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

هنا هو معلومات حول كافة مستويات العزل تحت تصرفكم ، وكذلك الجدول تلميحات.

تعيين مستوى عزل المعاملة

تلميح الجدول (Transact-SQL)

بالإضافة إلى ما ذكر أعلاه, يجب أن تكون حذرا جدا أن nolock الواقع يفرض مخاطر لا الحصول على الصفوف التي ارتكبت قبل الخاص بك تحديد.

انظر http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

وسوف يكون أسرع لأنها لا تضطر إلى الانتظار أقفال

  • الحالي حدد سوف تبدأ في وقت سابق ، لأنها لا تضطر إلى الانتظار.

  • المعاملات الأخرى سوف تبطئ كما أنهم الآن تقاسم وقت المعالجة مع معاملة جديدة.

لا تستخدم.

NOLOCK وغالبا ما تستغل مثل طريقة سحرية لتسريع قاعدة بيانات يقرأ, ولكن أنا في محاولة لتجنب استخدامه whever ممكن.

نتيجة مجموعة يمكن أن تحتوي على الصفوف التي لم ترتكب ، التي غالبا ما تكون في وقت لاحق من التراجع.

خطأ أو مجموعة النتائج يمكن أن تكون فارغة ، يكون في عداد المفقودين الصفوف أو عرض نفس الصف عدة مرات.

وذلك لأن المعاملات الأخرى يتم نقل البيانات في نفس الوقت كنت تقرأ ذلك.

قراءة ارتكبت يضيف قضية إضافية حيث تلف البيانات في عمود واحد حيث العديد من المستخدمين تغيير نفس الخلية في وقت واحد.

هناك آثار جانبية أخرى أيضا ، مما يؤدي إلى التضحية زيادة سرعة كنت تأمل في الحصول على المركز الأول.

الآن أنت تعرف أبدا استخدامه مرة أخرى.

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