我必須更新大表(600米行)中的約300行,我試圖使其更快。Redshift更新使用序列掃描非常緩慢
我使用的查詢是有點棘手:
UPDATE my_table
SET name = CASE WHEN (event_name in ('event_1', 'event_2', 'event_3'))
THEN 'deleted' ELSE name END
WHERE uid IN ('id_1', 'id_2')
我嘗試使用EXPLAIN在此查詢和獲取:
XN Seq Scan on my_table (cost=0.00..103935.76 rows=4326 width=9838)
Filter: (((uid)::text = 'id_1'::text) OR ((uid)::text = 'id_2'::text))
我有一個交錯的排序關鍵字,並且uid是一個包括在這個sortkey中的列。 爲什麼查詢看起來像這樣的原因是,在真實的上下文中SET的列數(以及名稱)可能會有所不同,但它可能不會超過10個。 基本思想是我不想要交叉連接(更新規則是特定於列的,我不想將它們混合在一起)。 例如,在將來會有一個查詢,如:
UPDATE my_table
SET name = CASE WHEN (event_name in ("event_1", "event_2", "event_3")) THEN 'deleted' ELSE name END,
address = CASE WHEN (event_name in ("event_1", "event_4")) THEN 'deleted' ELSE address END
WHERE uid IN ("id_1", "id_2")
不管怎樣,回到第一個查詢,它運行了很長一段時間(約45分鐘),並採取100%的CPU。
我試圖檢查更簡單查詢:
explain UPDATE my_table SET name = 'deleted' WHERE uid IN ('id_1', 'id_2')
XN Seq Scan on my_table (cost=0.00..103816.80 rows=4326 width=9821)
Filter: (((uid)::text = 'id_1'::text) OR ((uid)::text = 'id_2'::text))
我不知道還有什麼我可以添加到這個問題,使其更清晰,會很樂意聽到任何意見。
由於CASE語句中的WHERE關鍵字會導致錯誤,所以您的實際查詢必須相當不同。那裏有一個子選擇嗎?另外,桌子上有什麼? – systemjack
啊,確實現在糾正了它。 –
您的查詢對我而言看起來不錯。我自己並沒有很好的交錯排序鍵。在不屬於排序關鍵字的列上進行過濾使用複合排序關鍵字與交錯關鍵字,我仍然獲得了10倍左右的改進。在sortkey列上過濾應該會更好。我們放棄了使用交錯密鑰,直到Redshift將它們整理出來。 – systemjack