سؤال

ولدي استعلام معقد إلى حد ما مع ما يقرب من 100K الصفوف.

ويعمل الاستعلام في 13 ثانية في SQL Server اكسبرس (تعمل على مربع ديف بلدي)

ونفس الاستعلام مع نفس فهرسة وجداول يأخذ أكثر 15+ دقائق لتشغيل على الخلية 5.1 (تعمل على مربع الإنتاج بلدي - أكثر من ذلك بكثير قوية واختبارها مع الموارد 100٪) وأحيانا الاستعلام تعطل جهاز مع من خطأ الذاكرة.

وماذا أفعل الخطأ في الخلية؟ لماذا يستغرق وقتا طويلا؟

select e8.*
from table_a e8
inner join (
    select max(e6.id) as id, e6.category, e6.entity, e6.service_date
    from (
        select e4.* 
        from table_a e4
        inner join (
            select max(e2.id) as id, e3.rank, e2.entity, e2.provider_id, e2.service_date
            from table_a e2
            inner join (
                select min(e1.rank) as rank, e1.entity, e1.provider_id, e1.service_date
                from table_a e1
                where e1.site_id is not null
                group by e1.entity, e1.provider_id, e1.service_date 
            ) as e3
            on e2.rank= e3.rank
            and e2.entity = e3.entity
            and e2.provider_id = e3.provider_id
            and e2.service_date = e3.service_date
            and e2.rank= e3.rank
            group by e2.entity, e2.provider_id, e2.service_date, e3.rank
        ) e5
        on e4.id = e5.id
        and e4.rank= e5.rank                            
    ) e6
    group by e6.category, e6.entity, e6.service_date 
) e7
on e8.id = e7.id and e7.category = e8.category
هل كانت مفيدة؟

المحلول

وهذه الإجابة حاولت أصلا للنشر على سؤال المحذوفة التي لم تشر إلى أنه مشكلة مع الخلية. أنا لا تزال تمضي قدما واستخدام SQL Server لريفاكتور الاستعلام باستخدام CTEs ومن ثم تحويل إلى الاستعلامات المتداخلة (إن وجدت تبقى). عذرا عن التنسيق، أرسلت جيف اتوود لي النص الأصلي نشر واضطررت إلى إعادة صياغة من جديد.

ومن الصعب الاستغناء عن البيانات والنتائج المتوقعة وأسماء جيدة، ولكن أود أن تحويل جميع الاستعلامات المتداخلة في CTEs، رصها، تسميتها مجدية وريفاكتور - بدءا باستثناء الأعمدة التي لم تكن تستخدم. إزالة الأعمدة لن يؤدي إلى تحسين، لأن محسن ذكي جدا - ولكن سوف تعطيك القدرة على تحسين الاستعلام الخاص بك - وربما العوملة بعض أو كل CTEs. لست متأكدا ما تقوم به التعليمات البرمجية الخاصة بك، ولكن قد تجد RANK جديدة () - نوع من الوظائف المفيدة، لأنه يبدو أنك تستخدم نوع تسعى ظهر نمط مع ينضم الذاتي كل هذه

.

وهكذا تبدأ من هنا بدلا من ذلك. لقد ألقيت نظرة على التحسينات E7 بالنسبة لك، والأعمدة غير المستخدمة من E7 قد يشير إما خلل أو التفكير غير مكتملة حول إمكانيات التجمع، ولكن إذا كانت هذه الأعمدة ليست ضرورية حقا، فإن هذا قد هزيلة كل في طريق العودة من خلال المنطق الخاص في E6، E5 وE3. إذا كان التجمع في E7 هو الصحيح ثم يمكنك القضاء على كل شيء ولكن ماكس (الهوية) في النتائج والصلة. لا استطيع ان ارى لماذا عملتم متعددة MAX (معرف) لكل فئة، لأن هذا من شأنه مضاعفة النتائج الخاصة بك عند الانضمام، وبالتالي فإن MAX (معرف) يجب أن تكون فريدة من نوعها ضمن هذه الفئة، وفي هذه الحالة الفئة هي زائدة عن الحاجة في الانضمام.

WITH e3 AS (
select min(e1.rank) as rank,
e1.entity,
e1.provider_id,
e1.service_date
from table_a e1
where e1.site_id is not null
group by e1.entity, e1.provider_id, e1.service_date
)

,e5 AS (
select max(e2.id) as id,
e3.rank,
e2.entity,
e2.provider_id,
e2.service_date
from table_a e2
inner join e3
on e2.rank= e3.rank
and e2.entity = e3.entity
and e2.provider_id = e3.provider_id
and e2.service_date = e3.service_date
and e2.rank= e3.rank
group by e2.entity, e2.provider_id, e2.service_date, e3.rank
)

,e6 AS (
select e4.* -- switch from * to only the columns you are actually using
from table_a e4
inner join e5
on e4.id = e5.id
and e4.rank= e5.rank
)

,e7 AS (
select max(e6.id) as id, e6.category -- unused, e6.entity, e6.service_date
from e6
group by e6.category, e6.entity, e6.service_date
-- This instead
-- select max(e6.id) as id
-- from e6
-- group by e6.category, e6.entity, e6.service_date
)

select e8.*
from table_a e8
inner join e7
on e8.id = e7.id
and e7.category = e8.category
-- THIS INSTEAD on e8.id = e7.id

نصائح أخرى

و100،000 الصفوف يجب أن لا تأخذ 13 ثانية إذا كانت مؤشرات كفاءة المتاحة. وأظن ويرجع ذلك إلى حقيقة أن الخادم SQL لديه أكثر قوة محسن الاستعلام من الخلية الفرق. ما الخلية لديها أكثر بناء على أمر من محلل SQL من على محسن.

وستحتاج إلى توفير الكثير مزيد من المعلومات - المخططات الكاملة لجميع الجداول المشاركة، وقائمة كاملة من الفهارس على كل، بالنسبة للمبتدئين

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

وانها تريد ان تكون مثيرة للاهتمام لشرح الخطة مع كل من لنرى ما هي الاختلافات. لست متأكدا ما اذا كان لمقارنة التفاح والبرتقال، ولكن سأكون غريبة.

وأنا لا أعرف إذا كان هذا يمكن أن تساعد ، ولكن هذا وكانت الإصابة الأولى على البحث عن "محسن الاستعلام الخلية".

ووالوحيدة قاعدة بيانات مفتوحة المصدر وأنا أعلم أن الذين لديهم CTEs هو فايربيرد ( HTTP : //www.firebirdsql.org/rlsnotesh/rlsnotes210.html#rnfb210-cte)

وسوف بوستجرس ديك في 8.4 أعتقد

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