我的区域有以下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
答案 0 :(得分:0)
查询性能是一个很大的问题,只需通过查看脚本来解决它。 你可以检查的事情:
每个关系有多少个元组? 尝试分析查询过程,以便了解电机使用的路径。
我无法想到任何减慢这种情况的具体因素。无论如何,这些都是很多人加入的。
干杯。
答案 1 :(得分:0)
向我跳出一个简单的位是COUNT(DISTINCT at.date) AS [Total days]
。在我看来根本不需要。你已经计算了所有缺席,所以你应该能够从已知的天数(可能是SchoolYear
)中减去缺席数,以获得参加的总天数。
同样适用于[Start date]
和[end date]
。如果这些值只是以存储一些重复数据为代价存储在student
表中,那么会更快。这个论点也可以用于缺席的总数。如果这些总数存储在student
表中,那么您根本不需要加入v_AttDailyTermSummary
表。