سؤال

بعد أن تعثرت مع SQL2000 لفترة طويلة جدًا ، لم يكن لدي الكثير من التعرض لتعبيرات الجدول الشائعة.

الإجابات التي قدمتها هنا (#4025380) و هنا (#4018793) ذهبت ضد التدفق من حيث أنهم لم يستخدموا CTE.

إنني أقدر أنه بالنسبة للروح ، فهي Kneez Beez ، وهناك بعض الاستعلامات التي يمكن تبسيطها إلى حد كبير من خلال استخدامها ، ولكن في أي نقطة يكون استخدامها مجرد تافهة؟ هل لديهم فائدة كبيرة في الأداء على مسمة فرعية أو انضمام؟ هل يقومون حقًا بتبسيط الكود ويجعلونه أكثر قابلية للصيانة؟

باختصار ، عندما يكون من الممارسات الجيدة استخدام CTE على بناء جملة "أقل".

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

المحلول

يجب أن تستخدم عمومًا CTE على مسمة فرعية عادية إذا:

  • يتطلب استعلامك عودة (كما لاحظت)
  • الاسم الفرعي كبير أو معقد
  • الاستعلام المحتوي كبير أو معقد
  • يتم تكرار الاسم الفرعي (أو على الأقل يمكن تبسيط العديد من الفخات الفرعية من خلال إجراء عمليات بسيطة مختلفة على مسمة فرعية مشتركة)

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

نصائح أخرى

شخصيا ، بمجرد أن أشعر بالراحة في استخدامها ، أعتقد أنها تنتج رمزًا أكثر نظافة وأكثر قابلية للقراءة. على سبيل المثال ، قارن إجابتك على #4018793. لقد فعلنا نفس الشيء بشكل أساسي ؛ لقد استخدمت CTE ولم تفعل.

إجابتك بدون CTE:

SELECT
    course,
    section,
    grade,
    gradeCount
FROM
    table
INNER JOIN
    (SELECT
        grade,
        Max(gradeCount) as MaxGradeCount
    FROM
        table
    ) MaxGrades
    ON  table.grade = MaxGrades.grade
        AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY 
    table.grade

جوابي مع CTE:

;with cteMaxGradeCount as (
    select 
        grade, 
        max(gradeCount) as MaxGradeCount
    from @Test
    group by grade
)
select 
    t.course, 
    t.SECTION, 
    t.grade, 
    t.gradeCount
from cteMaxGradeCount c
inner join @Test t
    on  c.grade = t.grade
        and c.MaxGradeCount = t.gradeCount
order by t.grade

فهي السكر النحوي ، باستثناء الاستعلامات الهرمية/العودية.

ومع ذلك ، لا ينبغي أن يكون كل شيء يمكن القيام به بشكل متكرر - توليد التاريخ عبر CTE العودية بالكاد أفضل من المؤشر - تم تحجيم خدعة جدول الأرقام بشكل أفضل.

CTE تعطي نتيجة أسرع في سيناريو العودية. يتم استخدام نتيجة CTE مرارًا وتكرارًا للحصول على مجموعة النتائج النهائية. لذا نظرًا لأنك قد أخذت شرط مكانك أو الانبعاث الفرعي في CTE ، فمن المؤكد أنه سيظهر تحسين الأداء.
المرجعي : http://msdn.microsoft.com/en-us/library/MS190766(V=SQL.105).aspx

مجرد ملاحظة ، في العديد من السيناريوهات ، تقدم Temp Tables أداءً أفضل ثم CTE أيضًا ، لذلك يجب أن تحاول أيضًا محاولة Temp Tables أيضًا.
المرجعي : http://social.msdn.microsoft.com/forums/en/transactsql/thread/d040d19d-016e-4a21-bf44-a0359fb3c7fb

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