Рекомендации по проектированию таблиц BigQuery: сочетание разбиения даты и шардинга? - PullRequest
0 голосов
/ 24 марта 2020

Мы находимся в процессе миграции нашего локального Oracle дБ в облако. Самый большой проект - переместить нашу таблицу фактов, которая отслеживает транзакции клиентов.

Краткий вопрос : Какой лучший способ разделить / разделить таблицу фактов в BigQuery, когда вы не можете использовать дату поле для разделения из-за ограничения в 4000 разделов? Цель состоит в том, чтобы максимизировать производительность запросов и минимизировать затраты.


Подробный вопрос Я не хочу дублировать таблицу в BigQuery, потому что я хочу, чтобы она была оптимизирована для BigQuery. Итак, я изучал разделение, разделение и кластеризацию. Также рассматривает денормализацию, но это другой вопрос.

В нашем Oracle db мы просто делим на целую дату YYYYMMDD. Я не верю, что мы можем сделать это в BigQuery, однако из-за того, что таблица может иметь только 4000 разделов. Если мы разделим по дням, наша таблица может содержать данные только за чуть менее 11 (4000/365) лет - что намного ниже того, что нам нужно в настоящее время для миграции.

Конечно, есть и другие поля, которые мы может разделить помимо даты (например, местоположение сайта), но я считаю, что дата может быть лучше.

Ниже приведены варианты, которые я рассматриваю. Допустим, таблица содержит столбец datetime order_date и целочисленную версию даты order_date_id

  1. Shard by year (ie все заказы с order_date в 2001 go в my_table_2001, разбить каждую таблицу на order_date
  2. Нет шардинга, иметь одну большую таблицу, создать целочисленный столбец для года (order_year) и использовать его для столбца раздела
  3. Шард другим столбец (например, местоположение сайта), затем разделить на order_year
  4. Shard на order_year и другой столбец (например, местоположение сайта), разделить на order_date

Если я собираюсь разделять таблицы на части, я определенно хочу использовать столбец datetime для разделения, чтобы я мог использовать подстановочные знаки для запроса всех разделенных таблиц. Я обнаружил, что целочисленные диапазоны для разбиения не позволяют использовать подстановочные знаки.

Также важно отметить, что бизнес-пользователи могут постоянно запрашивать данные для больших диапазонов дат, если не все доступные данные.

1 Ответ

0 голосов
/ 25 марта 2020

Можно рассмотреть использование таблицы разделов целочисленного диапазона: https://cloud.google.com/bigquery/docs/creating-integer-range-partitions

Это недавно выпущенная функция GA. Вы можете разбить свою целочисленную дату (ГГГГММДД) на два столбца: ГГГГММ и ДД и сделать разделение на ГГГГММ таким образом, чтобы у вас было 4000/12 = 333 разбиения. Если вам нужно сделать запрос на один день, вы можете установить предложение where в вашем запросе. Чтобы сэкономить на стоимости запроса, рекомендуется выбирать только интересующие столбцы и устанавливать предложение where (когда это возможно).

...