Удалите старые строки в журнале изменений для расширения Firestore в BigQuery

Я использую Firebase Extension Stream Firestore для BigQuery для экспорта своих данных в BQ. Он отлично работает, и я использую его уже пару лет. Однако размер таблицы начинает увеличиваться, что приводит к увеличению стоимости моих запросов. У меня есть следующие таблицы, созданные этим и npx @firebaseextensions/fs-bq-schema-views:

  • mytable_raw_changelog (1 327 594 строки)
  • mytable_raw_latest (55 329 строк)
  • mytable_schema_changelog (1 332 454 строки)
  • mytable_schema_latest (55 745 строк, запрос 3,2 ГБ)

Один запрос SELECT из таблицы mytable_schema_latest теперь обрабатывает 3,2 ГБ.

Варианты, которые я могу придумать:

  1. Удалите старые строки из _changelog, которые больше не нужны.
  2. Добавьте разделение времени с помощью конфигурации расширения Firebase BQ.
  3. Создайте задание для копирования mytable_schema_latest в другую таблицу для запроса (без исторических изменений).

Я хочу использовать вариант 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)

См.: https://stackoverflow.com/a/53495209/10222449

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы создать «резервную копию» данной таблицы, вы можете просто запустить запрос, а затем использовать СОХРАНИТЬ РЕЗУЛЬТАТЫ >> Таблица 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
  )

Я попробовал это и провел хорошее тестирование, и, похоже, оно работает хорошо. Однако для использования document_name и document_id требуется одно изменение. Смотрите мое обновление выше. Измените это, и я приму ответ.

MadMac 02.05.2024 05:12

@MadMac - обновлен код в моем ответе согласно вашему комментарию

Greg Fenton 04.05.2024 06:31

Другие вопросы по теме

Похожие вопросы