この質問に対する答えが「依存」ではないことを願っています。
クラスデータの要約であるレポートを書かなければなりません。各クラスには、成績、出席などの集計された学生データが含まれています。成績などのこのデータの一部は、採点されたすべての課題の集計データです。
クエリは機能しますが、約 15 個のテーブルを結合する維持不可能なモンスターを作成したことに気付きました。派生テーブルを使用してクエリを書き直した場合、パフォーマンスが向上しますか?
実際には、派生テーブルを使用することでパフォーマンスが向上しました。私はかなり悪い質問をしたことに気づきました。小さなスニペットをあげましょう...
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
;
パフォーマンスに関しては、インデックスを追加することで改善できます。参加は超高速になります。
保守性(および読みやすさ)に関しては、派生テーブルが役立つ可能性があります。また、ロジックを分離するためにビューを作成することもできます。
さらに、集計データを使用してテーブルを作成することを検討してから、単純なselect * from summary