Есть ли какой-либо выигрыш в производительности, когда мы используем лимит - PullRequest
0 голосов
/ 16 декабря 2018

например

    SELECT company_ID, totalRevenue 
FROM `BigQuery.BQdataset.companyperformance` 
ORDER BY totalRevenue LIMIT 10

Единственное различие, которое я вижу между использованием и не использованием LIMIT 10, - это просто различный объем данных, используемых для отображения пользователю.Система по-прежнему упорядочивает все данные, прежде чем выполнить LIMIT.

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Ниже применимо для BigQuery

Не обязательно на 100% технически правильно - но достаточно близко, поэтому я надеюсь, что ниже даст вам представление, почему LIMIT N чрезвычайно важно учитывать в BigQuery

Предположиму вас есть 1 000 000 строк данных и 8 рабочих для обработки запроса, как показано ниже

SELECT * FROM table_with_1000000_rows ORDER BY some_field

Раунд 1. Для сортировки этих данных каждый работник получает 125 000 строк - так что теперь у вас есть 8 отсортированных наборов по 125 000 строк
Раунд 2: Рабочий № 1 отправляет отсортированные данные (125 000 строк) работнику № 2, № 3 отправляет в № 4 и так далее.Итак, теперь у нас есть 4 рабочих, и каждый производит упорядоченный набор из 250 000 строк
Раунд 3: повторяется вышеупомянутая логика, и теперь у нас есть только 2 рабочих, каждый из которых производит упорядоченный список из 500 000 строк
Раунд 4: И, наконец, только один рабочий производитокончательный упорядоченный набор из 1 000 000 строк

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

В заключение: что мы имеем здесь:
а.У нас довольно много данных, передаваемых между работниками - это может быть одним из факторов снижения производительности
b.И у нас есть шанс, что один из работников не сможет обработать объем данных, переданных соответствующему работнику.Это может произойти раньше или позже и обычно проявляется в виде ошибки «Превышены ресурсы…»

Итак, теперь, если у вас есть LIMIT как часть запроса, как показано ниже

SELECT * FROM table_with_1000000_rows ORDER BY some_field LIMIT 10 

Итак,сейчас - 1 тур будет таким же.Но начиная со второго раунда - ТОЛЬКО первые 10 строк будут отправлены другому работнику - таким образом, в каждом раунде после первого - только 20 строк будут обработаны и только первые 10 будут отправлены для дальнейшей обработки. Надеюсь, вы увидите, насколько эти два процесса отличаются друг от друга в терминахобъема данных, передаваемых между работниками, и объема работ, который должен применить каждый работник для сортировки соответствующих данных

Подводя итог:
Без ПРЕДЕЛА 10:
• Перемещены начальные строки (раунд 1):1 000 000;
• Упорядоченные начальные строки (1 раунд): 1 000 000;
• Перемещенные промежуточные строки (2–4 раунд): 1 000 000
• Общее количество упорядоченных строк (2 - 4 раунд): 1 000 000;
• Окончательный результат: 1 000 000 строк

С LIMIT 10:
• Перемещенные начальные строки (раунд 1): 1 000 000;
• Упорядоченные начальные строки (1 раунд): 1 000 000;
• Промежуточныйперемещенные строки (Раунд 2 - 4): 70
• Общее количество объединенных упорядоченных строк (Раунд 2 - 4): 140;
• Окончательный результат: 10 строк

Надеюсь, что числа выше cleaпоказать разницу в производительности, которую вы получаете, используя LIMIT N, а в некоторых случаях даже способность успешно выполнить запрос без ошибки «Resource Exeded ...»

0 голосов
/ 17 декабря 2018

Нет увеличения производительности.У bigQuery все еще есть все записи в таблице.

Вы можете разделить свои данные, чтобы сократить количество записей, которые bigQuery должен прочитать.Это увеличит производительность.Вы можете прочитать больше информации здесь: https://cloud.google.com/bigquery/docs/partitioned-tables

0 голосов
/ 17 декабря 2018

См. Статистическую разницу в пользовательском интерфейсе bigQuery между двумя приведенными ниже запросами

SELECT * FROM `bigquery-public-data.hacker_news.comments` LIMIT 1000

Limit 1000

SELECT * FROM `bigquery-public-data.hacker_news.comments` LIMIT 10000

Limit 10000

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

0 голосов
/ 16 декабря 2018

В этом ответе предполагается, что вы спрашиваете о разнице между следующими двумя вариантами:

ORDER BY totalRevenue
ORDER BY totalRevenue LIMIT 10

Во многих базах данных, если существует подходящий индекс, включающий totalRevenue, запрос LIMIT может прекратить сортировку послепоиск 10 лучших записей.

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

Кроме того, существуетпотенциально большая разница в производительности между ними, если таблица будет большой.В версии LIMIT BigQuery должен отправлять только 10 записей, тогда как в версии, отличной от LIMIT, потенциально может быть отправлено гораздо больше данных.

...