مؤشرات SQL...هل هناك أي حالات استخدام يمكنك الدفاع عنها؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

ساذهب اولا.

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

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

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

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

المحلول

وبالتأكيد، هناك عدد من الأماكن التي قد تكون مؤشرات أفضل من مقرها انشاء العمليات.

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

وآخر هو إذا كنت تريد أن تأخذ أقفال على مستوى التطبيق باستخدام الإجراء sp_getapplock تخزينها، وهي مفيدة عندما تريد ضمان الصفوف التي يتم باستقصاء من خلال عمليات متعددة يتم استردادها مرة واحدة بالضبط (<لأ href = "HTTP: / /gregbeech.com/blogs/tech/archive/2008/06/11/retrieving-a-row-exactly-once-with-multiple-polling-processes-in-sql-server.aspx "يختلط =" نوفولو noreferrer "> المثال هنا ).

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

نصائح أخرى

الكثير

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

وهناك أيضا حالات عندما المؤشرات ببساطة يتفوق لأن محسن ليست ذكية بما فيه الكفاية. في تلك الحالات، إما هناك الفوقية المعلومات في رأسك الذي هو ببساطة لا أنزل على محسن من خلال مؤشرات أو إحصاءات على الجداول، أو رمز هو مجرد معقدة جدا أن ينضم (وعادة، وإعادة ينضم) يمكن ببساطة 'ر يكون الأمثل في الطريقة التي يمكن أن تصور لهم بطريقة القائم على المؤشر. في SQL Server 2005، وأعتقد CTEs تميل إلى جعل هذا تبدو أبسط كثيرا في رمز، ولكن ما إذا كان محسن يرى أيضا بأنها أكثر بساطة من الصعب أن نعرف - يتعلق الأمر الى انخفاض مقارنة خطة التنفيذ لكيفية أعتقد أنه يمكن عمله بأكبر قدر من الكفاءة وإجراء المكالمة.

والقاعدة العامة - لا تستخدم المؤشر إلا إذا لزم الأمر. ولكن عند الضرورة، لا تعطي نفسك وقتا عصيبا عن ذلك.

هناك الكثير من مختلفة سلوكيات المؤشر.

  • ثابت مقابل KEYSET مقابل ديناميكي
  • التمرير مقابل الأمام فقط مقابل التقديم السريع
  • غير حساس أم لا
  • متفائل أو أقرأ فقط أم لا
  • محلي مقابل عالمي (على الأقل هذا سهل)

يجب لا تستخدم المؤشر أبدًا إلا إذا كنت تستطيع شرح كل هذه الخيارات وأي منها تشغيل بشكل افتراضي.

وأنا لا أفعل ذلك أبدًا.

بدلاً من ذلك، عندما أشعر بالحاجة إلى تكرار شيء ما في T-SQL...أقوم بتحميله في جدول متغير، وهو ما يشبه مؤشر LOCAL STATIC SCROLL ...باستثناء أنه يمكن فهرسته والانضمام إليه (تحرير:والجانب السلبي لمنع استخدام التوازي).

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

والمرشحين الآخرين ستكون إجرائية بطبيعتها مثل حلقات من خلال الجدول التكوين وتوليد وتنفيذ سلسلة من الاستعلامات.

وجنبا إلى جنب مع ما قاله ديفيد B ، وأنا أيضا، تفضل نهج حلقة / الجدول.

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

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

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

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

والمجاميع الجري كما نوقش من قبل الآخرين يمكن أن تكون أسرع.

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

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

ولكن لماذا تفعلون هذا النوع من العمل في إجراء مخزن في المقام الأول؟ هل هذا حقا أفضل استخدام خادم قاعدة البيانات الخاصة بك؟ هو T-SQL حقا اللغة الصحيحة لاستخدامها عند إنشاء مدونة؟

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

إذا كان جدول الامم المتحدة وفهرستها لسبب ما، فإن المؤشر يكون أسرع من غيرها من أساليب بالتكرار على الطاولة. لقد وجدت هذه المعلومات في هذا بلوق وظيفة على المؤشرات في SQL Server العام الماضي.

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

وبلوق وظيفة تحتوي على الرمز الفعلي، لذلك يمكن للقراء محاولة الاستعلامات أنفسهم ونرى النتائج.

وحسنا عملية واحدة حيث المؤشرات هي أفضل من مجموعات وعند حساب تشغيل الاشياء الكلي ومماثلة.

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