Мне нужно обновить около 300 строк в большой таблице (600 м строк), и я пытаюсь сделать это быстрее.Redshift UPDATE использует Seq Scan очень медленно
Запроса Я использую немного сложнее:
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))
У меня есть перемежающаяся SortKey и UID является один столбцов, включенных в этот файл. Причина, по которой запрос выглядит так, заключается в том, что в реальном контексте количество столбцов в 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))
Я не знаю, что еще я могу добавить к вопросу, чтобы сделать его более ясным, был бы рад услышать любые советы.
Фактический запрос должен быть совершенно иным, поскольку ключевое слово WHERE в операторе CASE приведет к ошибке. Есть ли там суб-выбор? Кроме того, что такое distkey на столе? – systemjack
Ах, действительно, исправил это сейчас. –
Ваш запрос выглядит хорошо для меня. Мне не повезло с чередующимися ключами сортировки. Фильтрация на столбце, не являющемся частью ключа сортировки, по-прежнему имеет около 10-кратное улучшение, используя составной ключ сортировки или чередующийся. Фильтрация в столбце sortkey должна быть еще лучше. Мы отказались от использования чередующихся ключей, пока Redshift не разобрал их. – systemjack