هل سبق لك أن واجهت استعلامًا تعذر على SQL Server تنفيذه لأنه أشار إلى عدد كبير جدًا من الجداول؟

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

سؤال

هل سبق لك أن رأيت أيًا من رسائل الخطأ هناك؟

- SQL سيرفر 2000

لا يمكن تخصيص جدول إضافي للعرض أو دقة الوظيفة.
تم تجاوز الحد الأقصى لعدد الجداول في الاستعلام (256).

- SQL خادم 2005

هناك عدد كبير جدًا من أسماء الجداول في الاستعلام.الحد الأقصى المسموح به هو 256.

إذا كانت الإجابة بنعم، ماذا فعلت؟

استسلم؟هل أقنعت العميل بتبسيط مطالبه؟غير طبيعي قاعدة البيانات؟


@(الجميع يريدني أن أنشر الاستعلام):

  1. لست متأكدًا مما إذا كان بإمكاني لصق 70 كيلو بايت من التعليمات البرمجية في نافذة تحرير الإجابات.
  2. حتى لو تمكنت من ذلك، فلن يساعد ذلك نظرًا لأن هذا الكود الذي يبلغ حجمه 70 كيلو بايت سيشير إلى 20 أو 30 مشاهدة والتي سأضطر أيضًا إلى نشرها وإلا فإن الكود سيكون بلا معنى.

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

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

المحلول

بالنسبة لـ SQL Server 2005، أوصي باستخدام متغيرات الجدول وإنشاء البيانات جزئيًا أثناء التقدم.

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

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

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

بمجرد الانتهاء، يمكنك بعد ذلك إجراء عملية SELECT * بسيطة من متغير الجدول الخاص بك وإرجاع مجموعة النتائج هذه إلى المستخدم.

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

نصائح أخرى

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

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

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

قد يحدث هذا طوال الوقت عند كتابة تقارير خدمات التقارير لعمليات تثبيت Dynamics CRM التي تعمل على SQL Server 2000.يحتوي CRM على مخطط بيانات تم تطبيعه بشكل جيد مما يؤدي إلى الكثير من الصلات.يوجد في الواقع إصلاح عاجل سيؤدي إلى رفع الحد الأقصى من 256 إلى 260: http://support.microsoft.com/kb/818406 (كنا نظن دائمًا أن هذه مزحة رائعة من جانب فريق SQL Server).

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

@Kevin، أحب هذا التيشيرت -- يقول كل شيء :-).

أرغب في رؤية هذا الاستعلام، لكنني أتخيل أنه يمثل مشكلة في نوع ما من التكرارات، وبينما لا أستطيع التفكير في أي مواقف حيث يكون ذلك ممكنًا، أراهن أنه من فترة سيئة/حالة/مؤشر أو الكثير من وجهات النظر سيئة التنفيذ.

نشر الاستعلام :د

أشعر أيضًا أن إحدى المشكلات المحتملة قد تكون وجود عدد كبير (اقرأ 200+) من جداول الأسماء/القيم التي يمكن تكثيفها في جدول بحث واحد.

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

نوع من السخافة بالنظر إلى التنفيذ المنطقي هو نفسه ...

واجهت نفس المشكلة في SQL Server 2005 (عملت في 2008) عندما أردت إنشاء طريقة عرض.لقد قمت بحل المشكلة عن طريق إنشاء إجراء مخزن بدلاً من طريقة العرض.

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