ينضم تجزئة SQL Server مقابل الحلقات المتداخلة

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

  •  27-09-2019
  •  | 
  •  

سؤال


ملاحظة سريعة

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

  1. شخص ما قد يجدها مفيدة.
  2. أنا لا أفهم الكثير لماذا يعمل.

على أي حال الرمز الثابت (انظر الإجابات).


كتبت في الأصل:

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

أقوم بتشغيل الكود أدناه مقابل قاعدة بيانات SQL Server (10) ويتم تنفيذها بسرعة كبيرة. تتضمن خطة التنفيذ التي تستخدمها انضمام تجزئة.

ثم أقوم بتشغيله مرة أخرى ، لكن هذا الوقت قم بإلغاء عدم وجود سطرين أول (إعلان وضبط الخطوط) ، وأيضًا حذف "+1" بجانب y. [في التاريخ] وقم بإلغاء "+ counter". الآن يستغرق الاستعلام الأعمار (على مر العصور) لإكمال - خطة التنفيذ بدلاً من ذلك باستخدام الحلقات المتداخلة. لاحظ أنني ما زلت فقط أضيف واحدة إلى التاريخ ، ولكن باستخدام متغير بدلاً من ثابت.

والسؤال هو: هل يمكنني إجراء الاستعلام باستخدام @counter استخدام انضمام تجزئة بدلاً من حلقة متداخلة؟

(القليل من الخلفية: ما أحاول القيام به هو مطابقة X. [في التاريخ] و Y. يتم ملء الأيام التي يجب استخدامها للاستعلام من حقل في جدول آخر. لقد حاولت استخدام Datediff () أولاً مع ABS () وأقل من ، لكنني متأكد من أن هذا سيستخدم دائمًا حلقات متداخلة. (إنه يحدث عندما أحاول عندما أحاول على أي حال!)

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

-- DECLARE @COUNTER INT
-- SET @COUNTER = 1

BEGIN

    SELECT
        x.[line id]
        , y.[line id]

    FROM
        lines1 AS x
        JOIN lines2 AS y ON (

            x.[in date] = y.[in date] + 1 -- + @COUNTER
            AND x.[country] = y.[country]

        )

    WHERE
        x.[country] = 'USA'

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

المحلول

والسؤال هو: هل يمكنني إجراء الاستعلام باستخدام @counter استخدام انضمام تجزئة بدلاً من حلقة متداخلة؟

نعم. يمكنك استخدام تلميح Join لإجبار هذا:

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