微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

加入查询在第一次设置时很快,但在另一次设置时要慢得多

如何解决加入查询在第一次设置时很快,但在另一次设置时要慢得多

我们有两个 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 结果:

AWS OVH

什么可能导致这种情况?这是资源问题还是我的代码问题?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。