Оптимизация производительности запроса по области продукта - PullRequest
0 голосов
/ 15 февраля 2019

Я хотел бы создавать следующую таблицу каждый день, чтобы хранить некоторые сводные данные о производительности страниц веб-сайта.Однако объем данных за каждый день составляет более 15 миллионов строк.

Какие шаги можно предпринять для повышения производительности?Я намереваюсь сохранить их в виде сегментированных таблиц, но я хотел бы еще улучшить, могу ли я вкладывать данные в каждую таблицу для дальнейшего повышения производительности?Каков наилучший способ сделать это?

SELECT
device.devicecategory AS device,
hits_product.productListName AS list_name,
UPPER(hits_product.productSKU) AS SKU,
AVG(hits_product.productListPosition) AS avg_plp_position

FROM `mindful-agency-136314.43786551.ga_sessions_20*` AS t
  CROSS JOIN UNNEST(hits) AS hits
  CROSS JOIN UNNEST(hits.product) AS hits_product
WHERE parse_date('%y%m%d', _table_suffix) between 
DATE_sub(current_date(), interval 1 day) and
DATE_sub(current_date(), interval 1 day)

AND hits_product.productListName != "(not set)"
GROUP BY 
device,
list_name,
SKU

1 Ответ

0 голосов
/ 15 февраля 2019

Поскольку вы используете productSku и productListName в качестве измерений / групп, перекрестное соединение с массивом product невозможно.

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

Однако вы должны четко понимать, хотите ли вы видеть клики в списке или показы в списке, используя hits.product.isImpression и hits.product.isClick.Я не вижу различий там.Может быть, фильтр для WHERE hits_product.isImpression в случае представления списка?

Вместо осколков вы можете рассмотреть возможность добавления поля даты и PARTITION BY date, а также CLUSTER BY list_name.См. Оператор INSERT для обновления и Синтаксис DDL для запуска таблицы.Это более производительно, чем осколки, когда дело доходит до запроса таблицы позже.

Запуск таблицы может выглядеть примерно так:

CREATE TABLE `x.y.z` 
PARTITION BY date
CLUSTER BY list_name
AS (
  SELECT
    PARSE_DATE('%Y%m%d',date) AS date,
    device.devicecategory AS device,
    hits_product.productListName AS list_name,
    UPPER(hits_product.productSKU) AS SKU,
    AVG(IF(hits_product.isClick, hits_product.productListPosition, NULL)) AS avg_plp_click_position,
    AVG(IF(hits_product.isImpression, hits_product.productListPosition, NULL)) AS avg_plp_view_position
  FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20*` AS t
    CROSS JOIN UNNEST(hits) AS hits
    CROSS JOIN UNNEST(hits.product) AS hits_product
  WHERE
    parse_date('%y%m%d', _table_suffix) 
    between 
      DATE_sub(current_date(), interval 1 day) 
      and DATE_sub(current_date(), interval 1 day)

  AND hits_product.productListName != "(not set)"
  GROUP BY 
    date,
    device,
    list_name,
    SKU
)

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

...