0

この質問に対する答えが「依存」ではないことを願っています。

クラスデータの要約であるレポートを書かなければなりません。各クラスには、成績、出席などの集計された学生データが含まれています。成績などのこのデータの一部は、採点されたすべての課題の集計データです。

クエリは機能しますが、約 15 個のテーブルを結合する維持不可能なモンスターを作成したことに気付きました。派生テーブルを使用してクエリを書き直した場合、パフォーマンスが向上しますか?

4

2 に答える 2

0

実際には、派生テーブルを使用することでパフォーマンスが向上しました。私はかなり悪い質問をしたことに気づきました。小さなスニペットをあげましょう...

JOIN後に集計します。コスト.937

DECLARE @0 INT = 141;

SELECT u.id, u.first_name, u.last_name, 
    CAST(CAST(COUNT(haid.mastered_date) AS DECIMAL) / CAST(COUNT(sa.id) AS DECIMAL) * 100 AS DECIMAL(4, 1)) AS mastery_perc
FROM reporting_saved_reports r
JOIN reporting_saved_reports_sections sr ON sr.report_id = r.id
JOIN ums_ae_instructor_section_order_user isou ON isou.instructor_section_id = sr.section_id
JOIN ums_users u ON u.id = isou.user_id
JOIN reporting_states sa ON sa.tutor_id = r.Tutor_Id
    AND sa.business_type IN ('B', r.business_type)
    AND sa.haid = 'Y'
LEFT JOIN reporting_wrapup_haid haid ON haid.tutor_id = r.Tutor_Id
    AND haid.section_id = isou.instructor_section_id
    AND haid.user_id = isou.user_id
    AND haid.state_id = sa.id
    AND haid.mastered_date BETWEEN r.from_date AND r.to_date
WHERE r.id = @0
GROUP BY u.id, u.first_name, u.last_name
ORDER BY u.last_name, u.first_name
;

前に派生テーブルで集約してから、結合します。コスト.546

DECLARE @0 INT = 141;

WITH wr AS (
    SELECT r.id AS report_id, r.Tutor_Id, r.from_date, r.to_date, r.business_type, sr.section_id, isou.user_id
    FROM reporting_saved_reports r
    JOIN reporting_saved_reports_sections sr ON sr.report_id = r.id
    JOIN ums_ae_instructor_section_order_user isou ON isou.instructor_section_id = sr.section_id
    WHERE r.id = @0
)
SELECT dual.user_id, dual.first_name, dual.last_name,
    CAST(CAST(haid.mastered_count AS DECIMAL) / CAST(dual.state_count AS DECIMAL) * 100 AS DECIMAL(4, 1)) AS mastery_perc
FROM (
    SELECT wr.user_id, u.first_name, u.last_name, COUNT(sa.id) AS state_count
    FROM ums_users u
    JOIN wr ON wr.user_id = u.id
    JOIN reporting_states sa ON sa.tutor_id = wr.Tutor_Id
        AND sa.business_type IN ('B', wr.business_type)
        AND sa.haid = 'Y'
    GROUP BY wr.user_id, u.first_name, u.last_name
) dual
LEFT JOIN (
    SELECT haid.user_id, COUNT(haid.mastered_date) AS mastered_count
    FROM reporting_wrapup_haid haid
    JOIN wr ON wr.Tutor_Id = haid.tutor_id
        AND wr.section_id = haid.section_id
        AND wr.user_id = haid.user_id
        AND haid.mastered_date <= wr.to_date
    GROUP BY haid.user_id
) haid ON haid.user_id = dual.user_id
ORDER BY dual.last_name, dual.first_name
;
于 2012-12-17T15:42:34.017 に答える
0

パフォーマンスに関しては、インデックスを追加することで改善できます。参加は超高速になります。

保守性(および読みやすさ)に関しては、派生テーブルが役立つ可能性があります。また、ロジックを分離するためにビューを作成することもできます。

さらに、集計データを使用してテーブルを作成することを検討してから、単純なselect * from summary

于 2012-12-17T05:03:30.173 に答える