在Postgres數據庫,下面的兩個查詢相當於性能?每個人都說「聯接總是比子查詢更快」,但查詢規劃器是否將子查詢優化爲聯合幕後?更新與子查詢與加入更新 - 哪一個更好的性能
查詢1:
UPDATE table_a
SET col_1 = 'a fixed value'
WHERE col_2 IN (
SELECT col_2 FROM table_b
);
解釋計劃:
Update on table_a (cost=0.00..9316.10 rows=1 width=827) -> Nested Loop Semi Join (cost=0.00..9316.10 rows=1 width=827) -> Seq Scan on table_a (cost=0.00..9287.20 rows=1 width=821) -> Index Scan using idx_table_b on table_b (cost=0.00..14.45 rows=1 width=14) Index Cond: (col_2 = (table_a.col_2)::numeric)
問題2:
UPDATE table_a ta
SET col_1 = 'a fixed value'
FROM table_b tb
WHERE ta.col_2 = tb.col_2;
解釋計劃:
Update on table_a ta (cost=0.00..9301.67 rows=1 width=827) -> Nested Loop (cost=0.00..9301.67 rows=1 width=827) -> Seq Scan on table_a ta (cost=0.00..9287.20 rows=1 width=821) -> Index Scan using idx_table_b on table_b tb (cost=0.00..14.45 rows=1 width=14) Index Cond: (col_2 = (ta.col_2)::numeric)
我相信他們是在結果當量(請提醒我,如果我錯了)。我已經嘗試了幾個解釋計劃具有大量的數據集。看起來它們在性能上是等價的,無論是在更新整個表格時還是將table_a.col_2
限制爲一個小子集時。
我想確定我不會錯過什麼。如果它們相同,你會選擇哪一個?爲什麼?
它們在功能上是否相同?在第一種情況下,只有匹配的行將被更新,其他行將保留其值。在第二種情況下,不匹配的行將變爲NULL NULL – hashbrown
@hashbrown **錯誤。**我剛測試它 - 非匹配的行將不會**變爲NULL。您必須對第三種可能的結構感到困惑:'UPDATE table_a SET col_1 =(SELECT'固定值'FROM table_b where table_a.col_2 = table_b.col_2')'。在這個構造中,是的,不匹配的行將**變爲NULL,並且col_2必須是唯一的。 – ADTC
如果你一直在看解釋輸出,請包括它!此外,請提供有用的表格定義和虛擬數據以匹配您的查詢,所以我們不必製作這些東西。 –