如何解决加入查询在第一次设置时很快,但在另一次设置时要慢得多
我们有两个 Postgres 设置。第一个 (v11) 在 AWS RDS 上,第二个 (v12) 在 OVH CloudDB 上。两者都包含完全相同的索引和表。两者都有 1GB 的 RAM 和 1 个 vcpu。
执行此查询时:
EXPLAIN (
analyze on,buffers on,verbose on)
SELECT
"User"."id","User"."firstName","User"."lastName","User"."phone","User"."biography","User"."email",COUNT("skills"."id") AS "skillsCount",COUNT("languagesList"."id") AS "languagesCount",COUNT("certificates"."id") AS "certificatesCount",COUNT("mobility"."id") AS "mobilityCount",COUNT("studies"."id") AS "studiesCount",COUNT("experience"."id") AS "experienceCount",COUNT("address"."id") AS "addressCount",COUNT (disTINCT "chatMessages".id) AS "chatMessagesCount",json_agg(
CASE
WHEN
appointments.id IS NULL
THEN
NULL
ELSE
json_build_object('id',appointments.id,'validations',json_build_array(json_build_object('managerId',"appointments -> validations"."managerId",'validated',"appointments -> validations".validated)),'recruiterUser',json_build_object('id',"appointments -> recruiterUser".id,'firstName',"appointments -> recruiterUser"."firstName",'lastName',"appointments -> recruiterUser"."lastName",'company',"appointments -> recruiterUser -> company".id,'title',"appointments -> recruiterUser -> company".title)),'day',appointments.day,'time',appointments.time,'status',appointments.status)
END
) AS "meetings",json_agg(
CASE
WHEN
applications.id IS NULL
THEN
NULL
ELSE
json_build_object('id',applications.id,'job',"applications -> job".id,"applications -> job".title),"applications -> validations"."managerId","applications -> validations".validated)),'cv',"applications -> cv".id,'cvFile',"applications -> cv"."cvFile"))
END
) AS "Applications",json_agg(
CASE
WHEN
visits.id IS NULL
THEN
NULL
ELSE
json_build_object('id',visits.id,visits.time,'jobBoard',json_build_object('anonymized',"visits -> jobBoard".anonymized,'subdomain',"visits -> jobBoard".subdomain))
END
) AS "Visits","validations"."id" AS "validations.id","validations"."validated" AS "validations.validated","validations"."jobBoardId" AS "validations.jobBoardId"
FROM
"Users" AS "User"
INNER JOIN
"UserVisits" AS "visits"
ON "User"."id" = "visits"."userId"
INNER JOIN
"JobBoards" AS "visits -> jobBoard"
ON "visits"."jobBoardId" = "visits -> jobBoard"."id"
AND "visits -> jobBoard"."creator" = 769
LEFT OUTER JOIN
(
"JobApplications" AS "applications"
INNER JOIN
"Jobs" AS "applications -> job"
ON "applications"."jobId" = "applications -> job"."id"
LEFT OUTER JOIN
"UsersCV" AS "applications -> cv"
ON "applications"."cvId" = "applications -> cv"."id"
LEFT OUTER JOIN
"JobApplicationsValidations" AS "applications -> validations"
ON "applications"."id" = "applications -> validations"."applicationId"
)
ON "User"."id" = "applications"."userId"
LEFT OUTER JOIN
(
"Appointments" AS "appointments"
INNER JOIN
"Users" AS "appointments -> recruiterUser"
ON "appointments"."recruiter" = "appointments -> recruiterUser"."id"
INNER JOIN
"Companies" AS "appointments -> recruiterUser -> company"
ON "appointments -> recruiterUser"."companyId" = "appointments -> recruiterUser -> company"."id"
LEFT OUTER JOIN
"AppointmentsValidations" AS "appointments -> validations"
ON "appointments"."id" = "appointments -> validations"."appointmentId"
)
ON "User"."id" = "appointments"."candidate"
AND "appointments"."type" = 'meeting'
LEFT OUTER JOIN
"ChatMessages" AS "chatMessages"
ON "User"."id" = "chatMessages"."userId"
AND NOT ("chatMessages"."userId" = 769)
LEFT OUTER JOIN
"CandidateSkills" AS "skills"
ON "User"."id" = "skills"."userId"
LEFT OUTER JOIN
"CandidateLanguage" AS "languagesList"
ON "User"."id" = "languagesList"."userId"
LEFT OUTER JOIN
"CandidateCertificates" AS "certificates"
ON "User"."id" = "certificates"."userId"
LEFT OUTER JOIN
"Candidatemobility" AS "mobility"
ON "User"."id" = "mobility"."userId"
LEFT OUTER JOIN
"CandidateDiplomas" AS "studies"
ON "User"."id" = "studies"."userId"
LEFT OUTER JOIN
"CandidateExperience" AS "experience"
ON "User"."id" = "experience"."userId"
LEFT OUTER JOIN
"Address" AS "address"
ON "User"."id" = "address"."userId"
LEFT OUTER JOIN
"UserValidations" AS "validations"
ON "User"."id" = "validations"."userId"
AND "validations"."managerId" = 769
WHERE
"User"."roleId" = ANY ('{5}')
GROUP BY
"User"."id","visits"."time","validations"."id"
ORDER BY
"User"."lastName" ASC LIMIT 50 OFFSET '0';
查询在我们的 AWS 设置中占用了大约 730 毫秒(这对于我们要完成的任务来说很好)。然而,当在 OVH 上运行时,它需要大约 3500 毫秒.. 太慢了!
以下是两个查询的 EXPLAIN 结果:
什么可能导致这种情况?这是资源问题还是我的代码问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。