我正在获得州立学校的结果数据。我规范化数据库并创建了三个表,即标记表,学校表和学生表。我想编写查询以获得每所学校的通过。在这里,我粘贴了查询以获得全部学生参加考试,同样地,我将通过学生。
SELECT a.Year_id
, school_code
, count(a.Marks_id) AS TotalAppeared
FROM
Marks_Table a
JOIN Master_Student ms
ON ms.Student_id = a.Student_id
JOIN Master_School mss
ON mss.school_id = ms.School_code_int
WHERE
CANDIDATE_TYPE = 'RF'
AND TOTAL_MARKS != 0
AND school_code = 'AS0180'
AND a.Year_id BETWEEN 5 AND 9
GROUP BY
a.Year_id
, SCHOOL_CODE
如何优化此查询
答案 0 :(得分:1)
我看不到你的数据和一些表名不在where子句中,但没有帮助。您的查询可能是颠倒的;最小数量的行来自学校,然后是学生(我猜)在标记之前。
我快速查询的基本原理是提前过滤,因此通常会使最少的行进行过滤。猜测你的数据;这个原则可能会更快。如果不是,那么运行执行计划并分析表/索引应该可以帮助你进一步前进。
SELECT a.Year_id
, school_code
, count(a.Marks_id) AS TotalAppeared
FROM
(
Select
*
Master_School mss
Where
school_code = 'AS0180'
) mss
Join
Master_Student ms
ON mss.school_id = ms.School_code_int
and CANDIDATE_TYPE = 'RF'
Join
Marks_Table a
ON ms.Student_id = a.Student_id
AND TOTAL_MARKS != 0
and a.Year_id BETWEEN 5 AND 9
GROUP BY
a.Year_id
, SCHOOL_CODE
答案 1 :(得分:1)
您的查询本身就很好。在正在使用Clustered的所有表上创建索引,如果可能,在JOINing列上创建索引,而在其他列上使用nonclustered。
答案 2 :(得分:0)
您可以从SSMS检查执行计划,看看是否有任何可能加速结果的缺失索引。除此之外,如果您不需要最后一个数据,可以使用(nolock)添加到连接。请查看此链接以获取其他提示http://web.synametrics.com/top10performancetips.htm。