#sql #google-bigquery
#sql #google-bigquery
Вопрос:
Я хочу проверить, содержит ли столбец определенное значение, и остановиться при первом совпадении, если true.
В настоящее время я использую:
select count(*) from <table> where <column> = <value>
А затем проверьте, является ли возвращаемое значение нулевым или ненулевым. Но если имеется несколько миллионов строк, а значение находится в первой строке, этот запрос все равно обработает все строки.
Я нашел что-то, что использует TOP
, но эта команда, похоже, недоступна в большом запросе. Я тоже пробовал LIMIT
, но это обрабатывает то же самое о данных, просто усекает возвращаемое значение.
Я ожидаю операцию с поведением, аналогичным поведению any( )
в python, которая остановится, как только будет найдено совпадение, вместо проверки всех значений итерации.
Ответ №1:
BigQuery — это параллельная база данных, в которой одновременно выполняется множество потоков. В общем, я бы рекомендовал написать запрос следующим образом:
select 1
from <table>
where <column> = <value>
limit 1;
Это не повлечет дополнительных накладных расходов на агрегирование, которые могут быть значительными, если в таблице много повторяющихся значений.
Однако эти два запроса, вероятно, будут иметь одинаковую продолжительность. BigQuery — не лучшая база данных для «поиска иголок в стогах сена». Он предназначен для обработки огромных объемов данных.
Комментарии:
1. спасибо, насколько я могу судить, это обработает тот же объем данных, что и то, что я изначально опубликовал? Так что я предполагаю, что это общий совет по запросу, а не решение. Повторите ваш комментарий о поиске игл, возможно, в этом случае нет решения? Я предположил, что это будет, если мне нужно обработать весь столбец, тогда я сделаю это, хотя, я думаю
2. @baxx . , , С вас будет взиматься плата за все данные в таблице. Обойти это невозможно, если вы не используете разделы. Сколько на самом деле прочитано, это другой вопрос.
3. спасибо, это немного сбивает с толку, так как я не знаю, достаточно ли я знаю, чтобы закрыть вопрос, учитывая, что я хотел что-то, что останавливалось бы при первом совпадении, в результате чего конкретный запрос обрабатывал бы меньше данных. Если есть какая-либо информация, которую я могу добавить или что я попытаюсь сделать, возможно, из вашего ответа должно быть ясно, что это невозможно, и я просто упускаю суть
4. @baxx . , , Данные, которые будут взиматься, определяются до запуска запроса.
5. хорошо, конечно, но если я смогу обрабатывать меньше, то, независимо от платы, это может быть быстрее для пользователя, и на этот вопрос еще предстоит ответить. Хотя знание того, что независимо от объема обрабатываемых данных плата одинакова, является полезной информацией, так что спасибо
Ответ №2:
Если целью здесь является сокращение «обрабатываемых данных», в BigQuery могут сработать следующие подходы:
- Разбиение таблицы на
column
, или - Кластеризация таблицы с помощью
column
, или - (если в таблице много дубликатов) создайте материализованное представление сбоку и попробуйте запросить это представление, например
CREATE MATERIALIZED VIEW AS
SELECT distinct <column> FROM <table>