سؤال

أنا في مجال صناعة الموقع والتطبيقات التي هي ليس مهمة حرجة -> على سبيل المثال. البرامج المصرفية، رحلة فضائية، تطبيق مراقبة العناية المركزة، إلخ. تحصل على الفكرة.

لذلك، مع هذا إخلاء المسئولية الضخمة، هل سيء باستخدام تلميح Nolock في بيان SQL؟ منذ عدة سنوات، تم اقتراحه من قبل مسؤول SQL زملائه الذي يجب أن أستخدمه NoLock إذا كنت سعيدا ب "قراءة قذرة" والتي ستمنحك المزيد من الأداء من نظامي لأن كل قراءة لا قفل الجدول / الصف / أيا كان.

قيل لي أيضا أنه حل كبير إذا كنت أعاني من أقفال ميتة. لذلك، بدأت متابعة ذلك الفكر لبضع سنوات حتى تساعدني SQL Guru مع بعض الكود العشوائي ولاحظت جميع الناتج في رمز SQL الخاص بي. لقد كنت مبطنا بأدب حاول شرحها لي (لماذا ليس بالأمر الجيد) وقد ضاعت أنا Sorta. شعرت أن جوهر تفسيره كان "إنه حل مساعدات الفرقة لمشكلة أكثر خطورة .. خاصة إذا كنت تعاني من طريق مسدود. على هذا النحو، إصلاح جذر المشكلة ".

فعلت بعض googling مؤخرا عن ذلك ومرجع هذا المشنور.

لذلك، هل يمكن لبعض SQL DB Guru Sensei من فضلك تنوير لي؟

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

المحلول

مع تلميح Nolock، مستوى عزل المعاملات ل SELECT البيان READ UNCOMMITTED. وبعد هذا يعني أن الاستعلام قد يرى بيانات متسخة وغير متناسلة.

ليست هذه فكرة جيدة أن تنطبق كقاعدة عامة. حتى إذا كان هذا سلوك القراءة القذرة على ما يرام بالنسبة لطلبك المهمة القائم على الويب، فقد يتسبب فحص Nolock في 601 خطأ يقوم بإنهاء الاستعلام بسبب حركة البيانات نتيجة عدم وجود حماية قفل.

أقترح القراءة عندما تساعد العزلة لقطة وعندما يؤلم - توصي MSDN باستخدام لقطة قراءة ملتزم بدلا من لقطة تحت معظم الظروف.

نصائح أخرى

قبل العمل على تجاوز مكدس، كنت ضد NOLOCK على المدير الذي يمكن أن يؤدي ذلك SELECT مع NOLOCK واسترجع النتائج مع البيانات التي قد تكون قديمة أو غير متناسقة. عامل للتفكير هو عدد السجلات التي يمكن إدراجها / تحديثها في نفس الوقت قد تقوم عملية أخرى باختيار البيانات من نفس الجدول. إذا حدث هذا كثيرا، فهناك احتمال كبير في Deadlocks إلا إذا كنت تستخدم وضع قاعدة بيانات مثل READ COMMITED SNAPSHOT.

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

اسأل نفسك سؤالا عند التفكير في استخدام NOLOCK:

هل تشمل استعلني طاولة لها عدد كبير من INSERT/UPDATE الأوامر والقيام بعناية إذا كانت البيانات التي تم إرجاعها من استعلام قد تفتقد هذه التغييرات في لحظة معينة؟

إذا كان الجواب لا، ثم استخدم NOLOCK لتحسين الأداء.


أنا فقط أداء بحث سريع عن بدون قفل الكلمة الأساسية داخل قاعدة التعليمات البرمجية لسريع المكدس وجدت 138 حالة، لذلك نستخدمها في أماكن قليلة تماما.

إذا كنت لا تهتم بالقراءة القذرة (أي في وضع قراءة في الغالب)، ثم NOLOCK على ما يرام.

لكن, أن تكون على دراية بأن غالبية مشاكل القفل من المقرر أن لا يكون لها الفهارس "الصحيحة" لحمل عبء الاستعلام الخاص بك (على افتراض أن الأجهزة متروك للمهمة).

وتم تفسير المعلم صحيحة. عادة ما يكون حلا لمساعدة الفرقة لمشكلة أكثر خطورة.

يحرر: أنا بالتأكيد لا أشير إلى أنه يجب استخدام Nolock. أعتقد أنني يجب أن أكون واضحة بوضوح. (أود فقط استخدامها، في ظروف شديدة حيث كنت قد تحللت أنها على ما يرام). كمثال، منذ الظهر، عملت في بعض TSQL التي تم رشها مع Nolock لمحاولة تخفيف مشاكل القفل. لقد أزلتهم جميعا، ونفذوا الفهارس الصحيحة، وذهب جميع الجمود.

شك في أنه كان "المعلم" الذي كان لديه أي خبرة في حركة المرور العالية ...

عادة ما تكون المواقع "قذرة" عادة بحلول الوقت الذي يعرضه الشخص الصفحة التي تم تحميلها بالكامل. ضع في اعتبارك نموذجا يحمل من قاعدة البيانات ثم يحفظ البيانات التي تم تحريرها؟ إنها غبية الطريقة التي يدخر بها الناس حول القذرة كونك مثل هذا لا.

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

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

تعرف على ما يعنيه واستخدامه عند الاقتضاء. ستكون قاعدة البيانات الخاصة بك دائما عنق الزجاجة الرئيسية في هذه الأيام وأن تكون ذكيا في استخدام Nolock يمكن أن يوفر لك الآلاف في البنية التحتية.

تعديل: إنها ليست مجرد طريق جمود يساعد في ذلك، فمن الأفضل أيضا أن تجعل الجميع ينتظرون حتى الانتهاء، أو العكس.

باستخدام تلميح nolock في EF4؟

أيا من الإجابات خاطئة، ولكن ربما مربكة قليلا ربما.

  • عند الاستعلام عن قيم / صفوف واحدة دائما ممارسة سيئة لاستخدام Nolock - ربما لا ترغب في عرض معلومات غير صحيحة أو ربما حتى اتخاذ أي إجراء على بيانات غير صحيحة.
  • عند عرض المعلومات الإحصائية الخام، يمكن أن يكون Nolock مفيدا للغاية. استغرق الأمر مثالا: سيكون هذا الهراء لأخذ الأقفال لقراءة بالضبط عدد وجهات النظر حول السؤال، أو العدد الدقيق للأسئلة للحصول على علامة. لا أحد يهتم إذا كنت غير صحيح 3360 أسئلة معلمة مع "SQL-Server" الآن، وبسبب التراجع المعاملات، 3359 سؤالا واحدا في وقت لاحق.

كمطور محترف أود أن أقول ذلك يعتمد. لكنني بالتأكيد اتبع GATS و OMG Ponies المشورة. تعرف ماذا تفعل، ومعرفة متى يساعد وعندما يؤلم

اقرأ تلميحات وغيرها من الأفكار الفقيرة

ما قد يجعلك تفهم أن SQL Server أعمق. أتابع القاعدة عموما أن SQL تلميحات شريرة، ولكن لسوء الحظ، استخدمها جميعا الآن ثم عندما سئمت من التجسيد مع إجبار SQL Server القيام بالأشياء ... ولكن هذه حالات نادرة.

لوقا

عندما أراد دعم التطبيقات الإجابة على استفسارات الإعلانات من خادم الإنتاج باستخدام SSMS (التي لم تكن قد تم تناولها مقابل التقارير)، طلبت استخدامها NoLock. وبهذه الطريقة لا تتأثر الأعمال "الرئيسية".

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

أعتقد أنه لا يصحح فعليا لاستخدام nolock.

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

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

Nolock هي علامة بديلة ل "لا أهتم إذا كانت هذه الإجابة تحتوي على صفوف مكررة أو صفوف محذوفة أو الصفوف التي لم يتم إدراجها أبدا للبدء مع التراجع"

الأخطاء التي يمكن بموجب nolock:

  • الصفوف التي لا تعاد المباراة على الإطلاق.
  • يتم إرجاع صفوف واحدة عدة مرات (بما في ذلك مثيلات متعددة لنفس المفتاح الأساسي)
  • يتم إرجاع الصفوف التي لا تتطابق.

أي إجراء يمكن أن يسبب تقسيم صفحة أثناء تشغيل Nolock قيد التشغيل تحدث هذه الأشياء. تقريبا أي إجراء (حتى حذف) يمكن أن يسبب تقسيم الصفحة.

لذلك: إذا كنت "تعرف"، فلن يتم تغيير الصف أثناء تشغيله، ولا تستخدم Nolock، حيث سيسمح فهرس استرجاع فعال.

إذا كنت تشك في أن الصف يمكن أن يتغير أثناء تشغيل الاستعلام، فهتم الدقة، لا تستخدم Nolock.

إذا كنت تفكر في NoLock بسبب Deadlocks، فقم بفحص هيكل خطة الاستعلام لمسح الجدول غير المتوقع، وتتبع الجمودين ومعرفة سبب حدوثها. يمكن أن يعني Nolock حول الكتابة أن الاستفسارات التي من المحتمل أن تكتمل كل من المسدود في السابق الإجابة الخاطئة.

الحلول الأفضل، عندما تكون ممكنا:

  • نسخ البيانات الخاصة بك (باستخدام النسخ المتماثل السجل) إلى قاعدة بيانات التقارير.
  • استخدم لقطات SAN وجبل نسخة ثابتة من DB
  • استخدم قاعدة بيانات لها مستوى عزل المعاملات الأساسية الأفضل

تم إنشاء مستوى عزل المعاملات لقطة لأن MS كانت تفقد المبيعات إلى Oracle. تستخدم Oracle سجلات التراجع / الإعادة لتجنب هذه المشكلة. Postgres تستخدم MVCC. في المستقبل، سيستخدم MS في Heckaton MVCC، ولكن هذه السنوات بعيدا عن الإنتاج جاهز.

غالبا ما يتم استغلال Nolock كطريقة سحرية لتسريع قراءة قاعدة البيانات، لكنني أحاول تجنب استخدامه بدلا من ذلك.

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

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

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

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

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

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