Вычислительная эффективность - ввод / вывод - PullRequest
0 голосов
/ 08 мая 2019

Если у меня есть два запроса, почему второй запрос более вычислительно эффективен (просто с точки зрения ввода-вывода), чем первый:

Первый запрос возвращает только восемь полей, выполняется за 1,1 секунды и обрабатывает 115,6 МБ. Вторая, однако, возвращает более миллиона записей, но выполняется всего за 3,4 с и обращается только к 8,2 Мб.

Я действительно пытаюсь понять написание запросов более эффективно, поскольку я начинаю использовать существенно большие пулы данных. Спасибо!

SELECT
  *
FROM
  `table1`
LIMIT
  10;
SELECT
  id
FROM
  `table1`

1 Ответ

2 голосов
/ 08 мая 2019

BigQuery - это в основном столбчатая база данных (это не совсем так, но это полезное приближение). То есть он хранит каждый столбец отдельно. Таким образом, доступ к одному столбцу требует только нахождения и чтения этого одного столбца. Для доступа к нескольким столбцам требуется найти все эти столбцы и прочитать их - даже если вам нужно только одно значение.

Это не только функция производительности. Количество столбцов также определяет фактурирование. Для пользователей других баз данных может быть действительно удивительно, когда:

select t.*
from t
limit 10;

в конечном итоге стоит $ 10 или $ 100, потому что t действительно большой и широкий. Но:

select count(id)
from t;

почти ничего не стоит.

В качестве другого примечания: когда вы обращаетесь к таблице несколько раз в запросе, вы платите только за доступ один раз. Так что самостоятельные объединения не дороже, чем выбор прямо из таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...