优化sql查询,涉及3个表和连接

时间:2013-06-10 12:07:33

标签: 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_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             

如何优化此查询

3 个答案:

答案 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