Если у меня есть два запроса, почему кажется, что второй запрос более эффективен в вычислительном отношении (только с точки зрения ввода-вывода), чем первый:
Первый запрос возвращает только восемь полей, выполняется за 1,1 секунды и обрабатывает 115,6 МБ. Второй, однако, возвращает более миллиона записей, но выполняется всего за 3,4 секунды и имеет доступ только к 8,2 МБ.
Я действительно пытаюсь понять, как писать запросы более эффективно, поскольку я начинаю использовать значительно большие пулы данных. Спасибо!
SELECT
*
FROM
`table1`
LIMIT
10;
SELECT
id
FROM
`table1`


BigQuery — это в основном столбцовая база данных (это не совсем так, но это полезное приближение). То есть он хранит каждый столбец отдельно. Таким образом, для доступа к одному столбцу требуется только найти и прочитать этот один столбец. Для доступа к нескольким столбцам требуется найти все эти столбцы и прочитать их, даже если вам нужно только одно значение.
Это не только функция производительности. Количество столбцов также определяет биллинг. Для пользователей других баз данных может быть действительно удивительно, когда:
select t.*
from t
limit 10;
в конечном итоге стоит 10 или 100 долларов, потому что t действительно большой и широкий. Но:
select count(id)
from t;
почти ничего не стоит.
Еще одно замечание: когда вы несколько раз ссылаетесь на таблицу в запросе, вы платите за доступ только один раз. Таким образом, самообъединения не дороже, чем выбор непосредственно из таблицы.