[英]Postgres Left Join with and condition too slow
我有兩張桌子
sleeps
睡眠標識符 | 睡覺時間 | 喚醒時間 |
---|---|---|
141b40f7-688b-43af-8266-3cc4612b8f98 | 2021-11-25 22:27:30 | 2021-11-25 22:16:30 |
e91bd0f8-688b-43af-8266-dsc4612f8490 | 2021-11-24 22:27:30 | 2021-11-24 22:16:30 |
sleepupdates
睡眠標識符 | 睡覺時間 | 喚醒時間 |
---|---|---|
141b40f7-688b-43af-8266-3cc4612b8f98 | 2021-11-25 22:27:30 | 2021-11-25 22:16:30 |
sleepupdates
表可能包含一些 SleepIds,如果包含,我需要選擇WakeupTime (來自sleepudates
而不是sleeps
表)。
我認為左連接應該通過合並來解決這個問題,但看起來它花費了太多時間!
它似乎在根據條件過濾之前掃描左表
select s."SleepId", s."BedTime", s."SleepTime", coalesce(su."WakeupTime", s."WakeupTime") from sleeps s
left join sleepupdates su
on s."SleepId"=su."SleepId"
and s."SleepId"='141b40f7-688b-43af-8266-3cc4612b8f98
我需要上述查詢的幫助。
EXPLAIN ANALYZE
Text Format
explain (analyze,buffers,format text) select s."SleepId", s."BedTime", s."SleepTime", coalesce(su."WakeupTime", s."WakeupTime") from sleeps s
left join sleepupdates su
on s."SleepId"=su."SleepId"
and s."SleepId"='141b40f7-688b-43af-8266-3cc4612b8f98';
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
Hash Right Join (cost=123483.97..130997.74 rows=850932 width=40) (actual time=444.144..628.801 rows=852809 loops=1)
Hash Cond: (su."SleepId" = s."SleepId")
Join Filter: (s."SleepId" = '141b40f7-688b-43af-8266-3cc4612b8f98'::uuid)
Rows Removed by Join Filter: 21396
Buffers: shared hit=98037, temp read=4910 written=4848
-> Seq Scan on sleepupdates su (cost=0.00..559.89 rows=21289 width=24) (actual time=0.005..2.806 rows=21396 loops=1)
Buffers: shared hit=347
-> Hash (cost=106199.32..106199.32 rows=850932 width=40) (actual time=438.068..438.068 rows=852809 loops=1)
Buckets: 65536 Batches: 32 Memory Usage: 2067kB
Buffers: shared hit=97690, temp written=4786
-> Seq Scan on sleeps s (cost=0.00..106199.32 rows=850932 width=40) (actual time=0.007..263.471 rows=852809 loops=1)
Buffers: shared hit=97690
Planning time: 0.237 ms
Execution time: 667.356 ms
(14 rows)
Indexes on sleepupdates
CREATE INDEX "sleepupdates_SleepId_idx"
ON public.sleepupdates USING btree
("SleepId" ASC NULLS LAST)
TABLESPACE pg_default;
-- Index: sleepupdates_SleepId_unique
-- DROP INDEX public."sleepupdates_SleepId_unique";
CREATE UNIQUE INDEX "sleepupdates_SleepId_unique"
ON public.sleepupdates USING btree
("SleepId" ASC NULLS LAST, "Status" COLLATE pg_catalog."default" ASC NULLS LAST)
TABLESPACE pg_default
WHERE "Status" = 'PENDING'::text;
-- Index: sleepupdates_UserId_idx
-- DROP INDEX public."sleepupdates_UserId_idx";
CREATE INDEX "sleepupdates_UserId_idx"
ON public.sleepupdates USING btree
("UserId" ASC NULLS LAST)
TABLESPACE pg_default;
SleepId是sleeps
表中的主鍵
您正在返回每一行睡眠。 s."SleepId"='141b40f7-688b-43af-8266-3cc4612b8f98
條件需要在 WHERE 子句中,而不是在 ON 中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.