Есть ли способ увеличить количество приемников вывода для этапа в BigQuery? - PullRequest
1 голос
/ 09 мая 2020

Когда я попытался улучшить производительность запросов, я обнаружил, что использование слотов было очень низким, при этом только 100 слотов использовались в течение длительного времени (2000 слотов - это предел).

Изучив журнал файла, я обнаружил, что на узком месте «parallelInputs» этапа было всего 80. Однако количество строк ввода было около 100 миллионов, и не было дублированных значений. Поэтому я думаю, что планировщик запросов должен увеличить приемник вывода на этапе перед этапом узкого места.

Есть ли способ побудить планировщика запросов увеличить приемник вывода?

==== ==========================

Я решил проблему с производительностью с помощью метода ответа «UNION».

В моем случае я использовал подзапросы вместо представления, подобного следующему

with slow_stage as (
  ...
), multiple_read as (
select
  *
from slow_stage where MOD(key, 3)=0

union all
select
  *
from slow_stage where MOD(key, 3)=1
...
)

Я ожидал улучшения с тремя удержаниями. Однако улучшение было более чем пятикратным из-за увеличения выходных стоков slow_stage. Раньше у slow_stage было только 80 приемников вывода. После применения метода "UNION" у него было более 1000 приемников вывода.

Я думал, что количество приемников вывода зависит от размера и формы вывода. (Я сослался на «Google BigQuery: The Definitive Guide»). В этом случае я не менял вывод slow_stage, поэтому я не знаю причину значительного улучшения.

1 Ответ

1 голос
/ 10 мая 2020

Существует хитрость, которую вы можете использовать с осторожностью:

Ниже запрос разбивает таблицу yourDataset.yourTable на 16 сегментов по значению col1, это не увеличивает стоимость, потому что BigQuery взимает размер сканируемых таблиц.

Опять же, используйте его с осторожностью, поскольку взлом может оказаться неэффективным в будущем.

CREATE VIEW yourdataset.yourJoinedTable AS (
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '0' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '1' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '2' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '3' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '4' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '5' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '6' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '7' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '8' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = '9' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'a' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'b' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'c' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'd' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'e' UNION ALL
SELECT * FROM yourDataset.yourTable WHERE SUBSTR(col1, 0, 1) = 'f'
);

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