Я хочу убедиться, что я не окажу негативного влияния на производительность запросов, основываясь на дизайне схемы для BigQuery. У меня есть две таблицы, которые мне нужно выполнить соединение. Столбец, который я буду использовать для объединения таблиц, может иметь тип INTEGER или STRING. STRING было бы проще в моем случае, так как не требовалось бы никакой новой проверки в нашей базе кода, чтобы гарантировать, что все значения имеют тип INTEGER. Но я не хочу объединяться по типу STRING, если производительность запроса будет значительно хуже, чем при выполнении объединения по столбцу типа INTEGER.
Существует ли большая разница в производительности в BigQuery, когда соединение имеет типSTRING против типа INTEGER?
--- Обновление 10/16 ---
Я провел некоторый базовый анализ, чтобы проверить это, вот результаты:
Использование общедоступного набора данныхтаблица пользователей содержит 10 миллионов строк, а таблица сообщений содержит 31 миллион строк
Присоединение к целому числу: 2.78 sec elapsed, 318.1 MB processed (avg over 10 runs)
Присоединение к строке 6.77 sec elapsed, 137 MB processed (avg over 10 runs)
- присоединение к целочисленному запросу
SELECT count(*)
FROM `bigquery-public-data.stackoverflow.users` u
JOIN `bigquery-public-data.stackoverflow.stackoverflow_posts` p
on u.id = p.owner_user_id
WHERE RAND() < 2
(где добавлен пункт, чтобы избежать кеша)
- объединить по строке
SELECT count(*)
FROM 'bigquery-public-data.stackoverflow.users' u
JOIN 'bigquery-public-data.stackoverflow.stackoverflow_posts' p
on u.display_name = p.owner_display_name
WHERE RAND() < 2
(где добавлен пункт, чтобы избежать кеша)
Удивительно, но JOIN на STRING работает хуже, чем INTEGER.