Ниже применимо для 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 ...»