سؤال

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

كيف يمكنني تجنب متغيرات الجدول ولا يزال لديك استعلام سريع؟

على سبيل المثال، لدينا استعلام SQL مثل

حدد p.projectnameamname، a.mproject، b. trumber from project as p left انضم = b.projectid.

لكنه أبطأ بكثير من الاختيار من الوظائف بشكل منفصل إلى المتغيرات ثم الانضمام لاحقا، على سبيل المثال:

إدراج في @ empa حدد p.projectid، aumber fromth from project as p joint انضم إلى dbo.fn_projectnumber (@ @ data) ك P غادر الانضمام dbo.fn_projectnumber (dateb) as b على p.projectid = b.projectid حدد p.projectname، aumber، b. trumber from project as pled joint @ empa on p.projectid = aprojectid الأيسر انضم @ dempa كما ب على p.projectid = b.projectid

ماذا يمكن أن يكون سبب هذا؟ هل هناك طريقة يمكنني الحصول على استعلام سريع وتجنب متغيرات الجدول؟


المزيد من التفاصيل:

هذا هو المثال فقط مماثلة لما أفعله، ولكن الوظيفة fn_ProjectNumber(@date datetime) سوف تحتوي على شيء مثل الانضمام بين أربعة طاولات ...


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

المحلول

حاول تحديد الصلة، يرجى الرجوع إلى الاسم المستعار الخاطئ في اليسار الثاني

أصلي:

SELECT P.ProjectName, A.Number, B.Number
FROM Project AS P
LEFT JOIN dbo.fn_ProjectNumber(@dateA) AS A
    ON P.ProjectID = A.ProjectID
LEFT JOIN dbo.fn_ProjectNumber(@dateB) AS B
    ON P.ProjectID = A.ProjectID

مثبت:

SELECT P.ProjectName, A.Number, B.Number
FROM Project AS P
LEFT JOIN dbo.fn_ProjectNumber(@dateA) AS A
    ON P.ProjectID = A.ProjectID
LEFT JOIN dbo.fn_ProjectNumber(@dateB) AS B
    ON P.ProjectID = B.ProjectID --<<<<<

نصائح أخرى

هل هناك أي سبب خاص تحاول تجنب متغيرات الجدول؟ يمكن أن تكون تقنية تحسين جيدة ولا تترك أي كائنات TEMP لتنظيفها.

على أي حال، إذا كنت لا ترغب في القيام بذلك بهذه الطريقة يمكنك دائما محاولة

SELECT
    P.ProjectID, A.Number, B.Number
FROM
    Project AS P
        LEFT JOIN
            (SELECT P.ProjectID, A.Number
            FROM Project AS P
            LEFT JOIN dbo.fn_ProjectNumber(@dateA) AS A
               ON P.ProjectID = A.ProjectID
            ) AS A
                ON P.ProjectID = A.ProjectID
        LEFT JOIN
            (SELECT P.ProjectID, B.Number
            FROM Project AS P
            LEFT JOIN dbo.fn_ProjectNumber(@dateB) AS B
                ON P.ProjectID = B.ProjectID
            ) AS B
                ON P.ProjectID = B.ProjectID

البطولة بطيئة لأنه في استعلام مثالك، تقوم بتوصيل كل وظيفة مرة واحدة لكل صف في مشروع الجدول. انها أسرع مع جداول temp لأنك تدعو فقط الوظيفة مرة واحدة.

طريقة واحدة لتجنب جداول TEMP هي استخدام CTES (تعبيرات الجدول الشائعة - إنها ليست فقط للحصول على العودية - متوفرة في SQL 2005 وما فوق.). سيكون بناء الجملة العام شيئا مثل:

WITH cteTempName (<list of columns>)
 as (<your table function call>)
 SELECT <your query here, with "cteTempName" appearing as just another table to select from>

ربما تكون الإنضمام أبطأ لأنك لم تحدد العلاقات بين الطاولات التي تنضم معا؟ لا أعرف الكثير عن أداء الاستعلامات في SQL Server، ولكن تحديد العلاقات ستحسن أداء الإنضمام.

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