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中重新排列查询。发布实际执行计划。