0

我有公立学校的成绩数据。我标准化数据库并创建了三个表,即标记表、学校表和学生表。我想编写查询以获得每所学校的通过。在这里,我粘贴了让学生总数出现在考试中的查询,以同样的方式我会得到通过的学生。

     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             

如何优化此查询

4

3 回答 3

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 
于 2013-06-10T13:12:08.103 回答
1

您的查询本身很好。在您使用集群的所有表上创建索引,如果可能,在 JOINing 列上创建索引,在其他列上创建非集群索引。

于 2013-06-10T13:16:42.293 回答
0

您可以从 SSMS 检查执行计划,并查看是否有任何缺失的索引可以加快结果。除此之外,如果您不需要最后的数据,您可以将 with(nolock) 添加到连接中。检查此链接以获取其他提示http://web.synametrics.com/top10performancetips.htm

于 2013-06-10T12:21:31.373 回答