ومع ذلك، يجب تنفيذ الاستعلام الفرعي لحساب الرتب لكل موضوع في جدول المنشورات بالكامل، بغض النظر عن عدد الرتب التي يتم تحديثها فعليًا.
يستغرق هذا الاستعلام الفرعي حوالي 40 ثانية للتنفيذ، ثم يتم تضمينه داخل حلقة متداخلة يجب تشغيلها للدمج قبل حتى الوصول إلى جملة WHERE. يبدو أن هذا هو السبب في ارتفاع تكلفة الاستعلام بشكل كبير.
SELECT id, percent_rank()
OVER (PARTITION BY topic_id ORDER BY SCORE DESC) as percent_rank
FROM posts
لقد نظرت إلى الكود والآن فهمت. يتم تنفيذ هذا الاستعلام بشكل متكرر حتى يتم مسح جميع المنشورات التي تحتاج إلى تحديث رتبتها، لذا عندما كنت أراقب عمليات SQL، كنت أرى العديد من عمليات التشغيل المختلفة لهذا الاستعلام على مدار الساعات حيث ينتهي تشغيل واحد ويبدأ آخر.
ومع ذلك، لا يبدو أن LIMIT يساعد حقًا في تعقيد الاستعلام إلى حد كبير. في الواقع، اكتشفت أنه إذا زدت الحد إلى 200000، فإن خطة الاستعلام تتحسن بشكل ملحوظ.
مع 20000، أرى حلقة متداخلة ضخمة بتكلفة تقارب 200 مليون: