it-swarm.asia

انضمام خادم SQL / حيث أمر المعالجة

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

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

SELECT *
FROM   ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2

كن أفضل/أسرع من:

SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val

نظريتي هي على النحو التالي (قد لا يكون هذا هو التنفيذ الصحيح ، أحاول أن أتذكر من كتاب SQL Server 2008 الداخلي الذي قرأته (MSFT Press)):

  1. يحصل معالج الاستعلام أولاً على الجدول الأيسر (الجدول 1)
  2. الانضمام إلى الجدول الثاني (الجدول 2) وتشكيل منتج ديكارتى قبل تصفية الصفوف اللازمة (إن أمكن)
  3. ثم ينفذ عبارات WHERE ، ORDER BY ، GROUP BY ، HAVING مع عبارة SEELCT آخر.

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

قد أكون بعيدًا جدًا عن هذا الأمر غير واقعي. كما قلت ، إنها نظرية.

افكارك؟

ملاحظة : لقد فكرت للتو في هذا السؤال ولم تتح لي الفرصة لإجراء أي اختبارات بنفسي حتى الآن.

ملاحظة 2 : تم وضع علامة باسم SQL Server كما لا أعرف أي شيء حول تنفيذ MySql وما إلى ذلك. حر في الرد/التعليق على أي حال

18
Stuart Blackler

تتم المعالجة المنطقية للاستعلام MSDN (مكتوبة بواسطة فريق Microsoft SQL Server ، وليس الجهات الخارجية)

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP

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

هذا منطقي بالرغم من: ليس فعلي . بغض النظر عن كيفية قيام SQL Server بذلك بالفعل ، فإن هذه الدلالات يتم تكريمها إلى الحرف. يتم تحديد "الفعلي" بواسطة مُحسِّن الاستعلام (QO) وتجنب منتج Cartesion المتوسط ​​الذي ذكرته.

تجدر الإشارة إلى أن SQL عبارة عن إعلان: أنت تقول "ماذا" لا "كيف" مثلما تفعل مع البرمجة الإجرائية/الحتمية (Java ، .net). لذا فإن قول "يحدث هذا قبل ذلك" خطأ في كثير من الحالات (على سبيل المثال افتراض دوائر قصيرة أو L-to-R أينما)

في حالتك أعلاه ، سينشئ QO نفس الخطة بغض النظر عن هيكلها لأنه استعلام بسيط.

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

لذا قد تساعد حالتك الأولى المُحسِّن في العثور على خطة أفضل لأن ترتيب المعالجة المنطقي يختلف عن طلبَي البحث. ولكن قد لا يكون كذلك.

لقد استخدمت هذه الحيلة على SQL Server 2000 للحصول على تحسين أداء 60x السرعة في استعلامات التقارير. نظرًا لأن QO يحسن الإصدار إلى الإصدار ، فإنه يتحسن في العمل على هذه الأشياء.

والكتاب الذي ذكرته: هناك خلاف حوله
راجع SO والروابط اللاحقة: https://stackoverflow.com/q/3270338/27535

16
gbn

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

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

يمكن لرضا جدول بسيط للغاية مثل المثال الخاص بك أن يكون راضيا عن أي واحد من مئات خطط التنفيذ المختلفة. يقرر المُحسِّن الطريقة الأفضل للإجابة على استعلامك من خلال مقارنة تكاليف هذه الخطط.

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

6
Mark Storey-Smith