Я использую Firebase Extension Stream Firestore для BigQuery для экспорта своих данных в BQ. Он отлично работает, и я использую его уже пару лет. Однако размер таблицы начинает увеличиваться, что приводит к увеличению стоимости моих запросов. У меня есть следующие таблицы, созданные этим и npx @firebaseextensions/fs-bq-schema-views:
Один запрос SELECT из таблицы mytable_schema_latest теперь обрабатывает 3,2 ГБ.
Варианты, которые я могу придумать:
Я хочу использовать вариант 1 — удалить старые строки, поскольку это кажется самым простым. Есть ли рекомендуемый способ или какое-либо руководство о том, как это сделать?
Я хочу удалить только старые исторические изменения, произошедшие до определенной даты, после которой документ был обновлен.
Также может быть хорошей идеей скопировать их в историческую таблицу перед их удалением на случай, если они понадобятся мне в будущем.
Обновление от 28 марта 2024 г.: Я заметил, что в последней версии расширения появился новый параметр. Информации мало, но может это поможет?
Исключить старые полезные данные. Если этот параметр включен, строки таблицы никогда не будут содержать старые данные (снимок документа до обновления), которых должно быть больше производительность и избежать потенциальных ограничений ресурсов.
Обновление 2 мая 2024 г.: Я использовал предложение Грега ниже, и оно сработало хорошо. Хотя из-за возможности дублирования document_id мне пришлось использовать document_name, который представляет собой полный путь к документу и на самом деле уникален.
DELETE FROM your_dataset.your_table_changelog
WHERE STRUCT(document_name, timestamp) NOT IN (
SELECT AS STRUCT document_name, MAX(timestamp) AS timestamp
FROM your_dataset.your_table_changelog
GROUP BY document_name
)
Обновление 06.05.2024:
Оказывается, мне нужно было добавить где внизу, поскольку я получал ошибку: UPDATE or DELETE statement over table ... would affect rows in the streaming buffer, which is not supported
DELETE FROM your_dataset.your_table_changelog
WHERE STRUCT(document_name, timestamp) NOT IN (
SELECT AS STRUCT document_name, MAX(timestamp) AS timestamp
FROM your_dataset.your_table_changelog
GROUP BY document_name
)
AND timestamp < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 45 MINUTE)

Чтобы создать «резервную копию» данной таблицы, вы можете просто запустить запрос, а затем использовать СОХРАНИТЬ РЕЗУЛЬТАТЫ >> Таблица BigQuery для сохранения в новую таблицу. Теперь у вас есть «резервная копия», и если что-то пойдет не так, вы сможете восстановить ее из этой новой таблицы.
Я думаю, что следующий оператор SQL может удалить для вас «старые» строки:
DELETE FROM your_dataset.your_table
WHERE STRUCT(document_name, timestamp) NOT IN (
SELECT AS STRUCT document_id, MAX(timestamp) AS timestamp
FROM your_dataset.your_table
GROUP BY document_name
)
@MadMac - обновлен код в моем ответе согласно вашему комментарию
Я попробовал это и провел хорошее тестирование, и, похоже, оно работает хорошо. Однако для использования document_name и document_id требуется одно изменение. Смотрите мое обновление выше. Измените это, и я приму ответ.