BigQuery: почему запросы из временной таблицы занимают в 20 с лишним раз больше времени, чем отдельные агрегаты по всему набору данных? - PullRequest
0 голосов
/ 07 мая 2018

Таблица dataset.transactions содержит ~ 5.000.000 записей.

1) Этот запрос занимает ~ 3 секунды:

SELECT *
  FROM dataset.transactions
  WHERE customer = 'c1' AND year = 2017

2) Этот запрос занимает около 10 секунд:

SELECT
  salesrep_id AS id,
  date AS lastUsedForFplDate,
  fpl AS individual_fpl,
  ANY_VALUE(salesrep_name) AS salesrep_name,
  ANY_VALUE(customer) AS customer
FROM dataset.transactions VT1
  WHERE date = (
    SELECT
      MAX(date)
    FROM dataset.transactions VT2
    WHERE
      VT1.salesrep_id = VT2.salesrep_id
  )
GROUP BY
  salesrep_id,
  date,
  fpl

3) Принимая во внимание, что это занимает более 200 секунд (пробовал несколько раз, отменял каждый раз через 200 секунд):

WITH transactions AS (
  SELECT *
  FROM dataset.transactions
  WHERE customer = 'c1' AND year = 2017
)

SELECT
  salesrep_id AS id,
  date AS lastUsedForFplDate,
  fpl AS individual_fpl,
  ANY_VALUE(salesrep_name) AS salesrep_name,
  ANY_VALUE(customer) AS customer
FROM transactions VT1
  WHERE date = (
    SELECT
      MAX(date)
    FROM transactions VT2
    WHERE
      VT1.salesrep_id = VT2.salesrep_id
  )
GROUP BY
  salesrep_id,
  date,
  fpl

Третий запрос состоит из двух запросов выше, за исключением того, что # 2 использует вывод # 1 в качестве источника.

Почему это занимает так много времени?

1 Ответ

0 голосов
/ 19 мая 2018

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

Результатом использования самосоединения является то, что оно потенциально удваивает количество выходных строк. Это увеличение выходных данных может привести к снижению производительности.

Вместо самостоятельного объединения рекомендуется использовать оконную (аналитическую) функцию , чтобы уменьшить количество дополнительных байтов, генерируемых запросом.

Упрощенный синтаксис аналитических функций следующий:

analytic_function_name ( [ argument_list ] )
  OVER (
    [ PARTITION BY partition_expression_list ]
    [ ORDER BY expression [{ ASC | DESC }] [, ...] ]
    [ window_frame_clause ]
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...