ZidaMedlem sedan juni 20108 inlägg Har stött på följande fråga som är riktigt långsam. Hur kan den smidigast optimeras på bästa sätt? Tacksam om någon har tid att hjälpa till :)
SELECT (SELECT COUNT(tblRegistrations.regId) FROM tblRegistrations WHERE tblRegistrations.regId IN (SELECT tblRegistrations.regId FROM tblRegistrations WHERE tblregistrations.regCourseId = tblCourses.courseId AND tblRegistrations.regTransactionStatus <> 'Failed')) AS regCount, tblCourses.courseId, tblCourses.centerId, tblCourses.courseName, tblCourses.courseDayTime, tblCourses.courseActive FROM tblCourses INNER JOIN tblCenter ON tblCourses.centerId = tblCenter.centerId WHERE courseExpire >= '" + currentDate + "' AND tblCenter.siteId = 2 GROUP BY tblCourses.courseId ORDER BY tblCourses.courseSortOrder
CompusaMedlem sedan jan. 20023 327 inlägg Rent spontant skulle jag testa med EXISTS istället för IN (se nedan):
SELECT
(
SELECT
COUNT(tblRegistrations.regId)
FROM
tblRegistrations
WHERE [b]EXISTS[/b]
(
SELECT
[b]*[/b]
FROM
tblRegistrations
WHERE
tblregistrations.regCourseId = tblCourses.courseId AND tblRegistrations.regTransactionStatus <> 'Failed')
)
AS regCount, tblCourses.courseId, tblCourses.centerId, tblCourses.courseName, tblCourses.courseDayTime, tblCourses.courseActive
FROM
tblCourses
INNER JOIN
tblCenter ON tblCourses.centerId = tblCenter.centerId
WHERE
courseExpire >= '" + currentDate + "' AND tblCenter.siteId = 2
GROUP BY
tblCourses.courseId
ORDER BY
tblCourses.courseSortOrder
ZidaMedlem sedan juni 20108 inlägg Tack för ett snabbt svar!
Dessvärre verkar det inte hjälpa, nu står den bara och väntar och laddar inte alls. Alternativt tar många gånger så lång tid som tidigare (och då var det redan långsamt)
Någon annan idé?
Hej och välkommen till webForum, Zida. Två tips:
För att göra koden mer läsbar, både för dig och andra, dela gärna upp den på flera rader. Sen en liten "wF-hemlighet". Det finns BBCode-taggar för att syntaxfärga kod, som synes nedan. Klicka på citera för att se hur jag gjorde.
Så här ser din ursprungskod ut efter lite omformatering:
SELECT (
SELECT COUNT(tblRegistrations.regId)
FROM tblRegistrations
WHERE tblRegistrations.regId IN (
SELECT tblRegistrations.regId
FROM tblRegistrations
WHERE tblregistrations.regCourseId = tblCourses.courseId
AND tblRegistrations.regTransactionStatus <> 'Failed'
)) AS regCount,
tblCourses.courseId, tblCourses.centerId, tblCourses.courseName,tblCourses.courseDayTime, tblCourses.courseActive
FROM tblCourses
INNER JOIN tblCenter ON tblCourses.centerId = tblCenter.centerId
WHERE courseExpire >= '" + currentDate + "' AND tblCenter.siteId = 2
GROUP BY tblCourses.courseId
ORDER BY tblCourses.courseSortOrder
Hursomhaver, din beräkning är ett klockrent fall för en LEFT JOIN. En LEFT skiljer sig från en INNER i det att den JOIN-operationen tillåts ha 0 träffar, och då får COUNTen värdet 0.
SELECT
COUNT(tblRegistrations.regId), tblCourses.courseId, tblCourses.centerId,
tblCourses.courseName,tblCourses.courseDayTime, tblCourses.courseActive
FROM tblCourses
INNER JOIN tblCenter ON tblCourses.centerId = tblCenter.centerId
LEFT JOIN tblRegistrations ON tblregistrations.regCourseId = tblCourses.courseId
AND tblRegistrations.regTransactionStatus <> 'Failed'
WHERE courseExpire >= '" + currentDate + "' AND tblCenter.siteId = 2
GROUP BY tblCourses.courseId
ORDER BY tblCourses.courseSortOrder