البرمجة

تحسين أداء استعلام SQL لاسترجاع قيم غير مكررة باستخدام ROW_NUMBER()

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

قبل كل شيء، يجب عليك أن تعلم أن علامة (+) تُستخدم في Oracle للإشارة إلى الانضمام الخارجي، وهو تقنية قديمة. يُفضل استخدام عبارات الانضمام الحديثة باستخدام الكلمات المفتاحية INNER JOIN أو LEFT JOIN، حسب الحاجة.

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

لتحسين استعلامك، يمكنك استخدام الانضمام الحديث وكذلك الاستعلام الذي يعود بسجل واحد فقط لكل صف. يمكنك استخدام ROW_NUMBER() OVER() لترقيم الصفوف واختيار السجل الأول في كل مجموعة.

فيما يلي مثال على كيفية تحقيق ذلك:

sql
WITH RankedResults AS ( SELECT A.TOTAL_PRESENT, A."LIMIT", A.COST_CENTER, A.ID, A.PLANT, A.BUDGET_YEAR, A."VERSION", B.BUDGET_YEAR AS B_BUDGET_YEAR, B."VERSION" AS B_VERSION, B.PLANT AS B_PLANT, B.CHARGE_CC AS B_CHARGE_CC, B.YEAR_DATE_USD, ROW_NUMBER() OVER (PARTITION BY A.TOTAL_PRESENT, A."LIMIT", A.COST_CENTER, A.ID, A.PLANT, A.BUDGET_YEAR, A."VERSION" ORDER BY A.ID) AS RowNum FROM CMS.SUM_REPANDMAINT A LEFT JOIN CMS.V_SUM_REPANDMAINT B ON A.BUDGET_YEAR = B.BUDGET_YEAR AND A."VERSION" = B."VERSION" AND A.PLANT = B.PLANT AND A.COST_CENTER = B.CHARGE_CC AND B.USERNAME = '[usr_name]' ) SELECT TOTAL_PRESENT, "LIMIT", COST_CENTER, ID, PLANT, BUDGET_YEAR, "VERSION", BUDGET_YEAR AS B_BUDGET_YEAR, B_VERSION, B_PLANT, B_CHARGE_CC, YEAR_DATE_USD FROM RankedResults WHERE RowNum = 1;

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

المزيد من المعلومات

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

  1. استخدام الـ CTE (Common Table Expression):
    يبدأ الاستعلام بـ CTE باسم RankedResults. يستخدم CTE لإنشاء جدول مؤقت يحتوي على الصفوف من الجدولين SUM_REPANDMAINT و V_SUM_REPANDMAINT مع إضافة عمود إضافي RowNum باستخدام ROW_NUMBER(). هذا يسمح بترقيم الصفوف بناءً على القيم المحددة.

  2. استخدام LEFT JOIN:
    تم استخدام LEFT JOIN للانضمام بين الجدولين SUM_REPANDMAINT و V_SUM_REPANDMAINT. يتم تحديد الشروط للانضمام في القسم WHERE، حيث يتم الانضمام عند تطابق القيم في أعمدة معينة. إن استخدام LEFT JOIN يعني أنه سيتم إرجاع جميع الصفوف من الجدول الأول والصفوف المطابقة من الجدول الثاني.

  3. استخدام PARTITION BY:
    تم استخدام PARTITION BY مع ROW_NUMBER() لتحديد المجموعات التي يتم ترقيمها. في هذا السياق، تم استخدام عدة أعمدة (A.TOTAL_PRESENT، A.”LIMIT”، A.COST_CENTER، A.ID، A.PLANT، A.BUDGET_YEAR، A.”VERSION”) لتحديد المجموعات.

  4. استخدام WHERE RowNum = 1:
    في الاستعلام النهائي، يتم استخدام الشرط WHERE لتحديد الصفوف التي تحتل المرتبة الأولى في كل مجموعة. بمعنى آخر، يتم استرجاع سجل واحد فقط لكل مجموعة من الصفوف المكررة.

  5. تحسين أداء الاستعلام:
    لتحسين أداء الاستعلام، يمكنك التأكد من وجود فهارس على الأعمدة المستخدمة في عبارات الانضمام والبحث، مما يسرع عمليات الاستعلام والانضمام.

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

زر الذهاب إلى الأعلى