Если таблица большая, но объем данных, обновляемых за день, невелик, вы можете разбить и / или разбить таблицу на столбцы last_updated_date
. Существуют некоторые крайние случаи, например, первая сегодняшняя проверка должна фильтровать для last_updated_date
как сегодняшнего или вчерашнего дня.
В зависимости от того, насколько скромен этот объем данных, обновляемых в течение дня, даже многократно запрашивая всю таблицу целиком. день может быть доступным, потому что механизм BQ будет сканировать только один дневной раздел.
PS Подробное объяснение
Я мог бы добавить столбец отметки времени last_updated, чтобы отслеживать этот путь
Из этого я сделал вывод, что столбца last_updated
еще нет (поэтому проверка Оператор for-updates в настоящее время не может различать guish между обновленными и не обновленными строками), но вы можете изменить операторы таблицы UPDATE, чтобы этот столбец был добавлен во вновь измененные строки.
Поэтому Я предположил, что вы можете изменить обновления дальше, чтобы установить дополнительный столбец last_updated_date
, который будет содержать часть даты временной отметки, хранящейся в столбце last_updated
.
, но затем многократно запрашивать всю таблицу день
Отсюда я сделал вывод, что в течение дня происходит несколько проверок.
, но обновляемые данные могут быть за любой период времени
Конечно, но как только строка будет обновлена, независимо от того, сколько ей лет, она получит два новых столбца last_updated
и last_updated_date
- если оба столбца уже не были добавлено предыдущим обновлением, и в этом случае два столбца будут обновлены, а не добавлены. Если между проверками обновлений имеется несколько обновлений в одной и той же строке, то последнее обновление все же сделает строку доступной для обнаружения при проверках, использующих лог c, описанную ниже.
Проверка для Оператор обновления будет (концептуально, а не буквально):
фильтровать строки для обеспечения last_updated_date=today AND last_updated>last_checked
. Дата и время предыдущей проверки обновлений будут храниться в last_checked
, и место хранения этого фрагмента данных (таблица, долговременная конфигурация) зависит от реализации.
обнаружение, является ли текущая проверка первая сегодняшняя проверка. Если это так, то дополнительно ищите last_updated_date=yesterday AND last_updated>last_checked
.
Примечание 1 Если таблица разделена и / или кластеризована в столбце last_updated_date
, то вышеупомянутые проверки обновлений не вызовут сканирование таблицы. И с учетом «скромного» предположения, сделанного в самом начале моего ответа, проверки удовлетворят ваш третий пункт.
Примечание 2 Недостатком этого подхода является то, что при проверках обновлений не будут обнаружены строки, которые были обновлены до того, как были изменены операторы таблицы UPDATE, чтобы включить два дополнительных столбца. (Такие строки будут в разделе __NULL__
со строками, которые никогда не обновлялись.) Но я предполагаю, что до внесения изменений в операторы UPDATE невозможно будет различить guish между обновленными строками и не обновленными все равно.
Примечание 3 Это объяснительная концепция. В реальной реализации вам может понадобиться один дополнительный столбец вместо двух. И вам нужно будет проверить, какой подход работает лучше: разбиение или кластеризация (с разбиением на поддельный столбец) или и то, и другое.
Подробное объяснение исходного (например, выше PS ) заканчивается здесь.
Примечание 4
только кластеризация помогает повысить производительность
С точки зрения предотвращения сканирования таблиц и достижения сокращения использования данных / затраты, одна кластеризация (с поддельным разделением) может быть такой же мощной, как и разделение.
Примечание 5 В упомянутом вами комментарии уже есть некоторые разделы. Я бы посоветовал проверить, является ли существующее разделение обязательным, можно ли его заменить кластеризацией.