Sql server 2008 优化包含3个表和联接的sql查询
我有公立学校的成绩数据。我规范化了数据库并创建了三个表,即分数表、学校表和学生表。我想写一个查询来获得每个学校的通行证。在这里,我粘贴了一个查询,用于获取考试中出现的学生总数,我将以同样的方式获得通过的学生Sql server 2008 优化包含3个表和联接的sql查询,sql-server-2008,optimization,Sql Server 2008,Optimization,我有公立学校的成绩数据。我规范化了数据库并创建了三个表,即分数表、学校表和学生表。我想写一个查询来获得每个学校的通行证。在这里,我粘贴了一个查询,用于获取考试中出现的学生总数,我将以同样的方式获得通过的学生 SELECT a.Year_id , school_code , count(a.Marks_id) AS TotalAppeared FROM Marks_Table a JOIN Master_Student ms ON ms.Student
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
如何优化此查询您可以从SSM中检查执行计划,并查看是否缺少任何可以加快结果速度的索引。除此之外,如果不需要最后的数据,可以使用(nolock)添加到联接中。查看此链接以了解其他提示。我看不到您的数据,有些表名不在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
你的问题本身很好。如果可能的话,在使用集群的所有表上创建索引,在连接列上创建索引,在其他列上创建非集群的索引。SQL是声明性的。内部联接是交换的和结合的。SQL Server查询优化程序可以根据统计信息在OP中重新排列查询。发布实际执行计划。