清理SQL查询

时间:2013-12-04 19:24:16

标签: sql

我的区域有以下SQL查询,它看起来很长,对我来说。我不确定我是否包含了所有需要的信息,因为我不是正常的SQL人员,但是告诉他们我会从一个帮助我很多PHP等的在线资源中得到一些帮助。问题在于它需要很长时间才能运行。在下面的代码中是否有任何不良做法,如果更改将有助于加快查询。

USE newburgh 
SELECT DISTINCT  sh.name, 
       sh.number, 
       s.studentnumber, 
       s.lastname, 
       s.firstname, 
       s.grade, 
       s.gender, 
       s.raceethnicity, 
       ad.term1Absences + ad.term2absences + ad.term3Absences + ad.term4Absences AS [Total Absences], 
       ad.term1Tardies + ad.term2Tardies + ad.term3Tardies + ad.term4Tardies AS [Total Tardies],
       CASE p.code 
         WHEN '5806' THEN 'R' 
         WHEN '5817' THEN 'F' 
         ELSE ' ' END AS 'Free/Red Lunch', 
       CASE pp.name 
         WHEN 'Document' THEN 'Yes' 
         ELSE ' ' END AS 'Document', 
       at.code, 
       at.description, 
       MIN(at.date) AS [Start date], 
       MAX(at.date) AS [End date], 
       COUNT(DISTINCT at.date) AS [Total days]
FROM dbo.student s 
  LEFT OUTER JOIN dbo.v_AttendanceDetail at 
    ON s.personID = at.personID 
    AND s.calendarID = at.calendarID 
  LEFT OUTER JOIN dbo.v_ProgramParticipation p 
    ON s.personID = p.personID 
    AND p.code IN ('5817', '5806') 
    AND p.endDate IS NULL 
  LEFT OUTER JOIN dbo.v_ProgramParticipation pp 
    ON s.personID = pp.personID 
    AND pp.name = 'Document' 
    AND pp.endDate IS NULL 
  LEFT OUTER JOIN dbo.SchoolYear sy 
    ON s.endYear = sy.endYear 
  LEFT OUTER JOIN dbo.v_SchoolCurrent sh 
    ON s.schoolID = sh.schoolid 
  LEFT OUTER JOIN  dbo.v_AttDailyTermSummary ad 
    ON s.personID = ad.personID 
    AND s.calendarID = ad.calendarid
WHERE sh.name = (@Location) 
  AND sy.label IN (@Year) 
  AND at.code IN ('80', '81', '82', '83', '84', '85', '86', '87', '88', '89')
GROUP BY sh.name, sh.number, s.studentNumber, s.lastName, s.firstName, s.grade,    
   s.gender, s.raceEthnicity, at.code, at.description, p.code, pp.name, ad.term1Absences,   
   ad.term2Absences, ad.term3Absences, ad.term4Absences, ad.term1Tardies,   ad.term2Tardies, 
   ad.term3Tardies, ad.term4Tardies
ORDER BY s.studentnumber, at.code

2 个答案:

答案 0 :(得分:0)

查询性能是一个很大的问题,只需通过查看脚本来解决它。 你可以检查的事情:

  • 您的所有加入选项是主键还是至少已编入索引?
  • 此查询返回了多少元组?

每个关系有多少个元组? 尝试分析查询过程,以便了解电机使用的路径。

我无法想到任何减慢这种情况的具体因素。无论如何,这些都是很多人加入的。

干杯。

答案 1 :(得分:0)

向我跳出一个简单的位是COUNT(DISTINCT at.date) AS [Total days]。在我看来根本不需要。你已经计算了所有缺席,所以你应该能够从已知的天数(可能是SchoolYear)中减去缺席数,以获得参加的总天数。

同样适用于[Start date][end date]。如果这些值只是以存储一些重复数据为代价存储在student表中,那么会更快。这个论点也可以用于缺席的总数。如果这些总数存储在student表中,那么您根本不需要加入v_AttDailyTermSummary表。