2016-10-02 4 views
0

У меня есть таблица FACT в 10 миллиардов строк в netezza, и я хочу выполнить ROW_NUMBER(), MAX() и SUM() в одном запросе. Когда я выполняю тот же запрос, выполняется более 3 часов. есть ли способ улучшить производительность запроса. Таблицы распределены по 4 столбцам, которые являются частью раздела (COLA, COLB, COLC, COLD).Как оптимизировать для Windowed Aggregate Partition-By Clause в Netezza

Например образца

SUM(STR_QTY) OVER (
       PARTITION BY 
       COLA 
       ,COLB 
       ,COLC 
       ,COLD 
       ) AS SLS_RTRN_QTY 
, 
SUM(STR_QTY_1) OVER (
       PARTITION BY 
       COLA 
       ,COLB 
       ,COLC 
       ,COLD 
       ) AS VAL_QTY 
,MIN(ITM_FST_DT) OVER (
       PARTITION BY COLA 
       ,COLB 
       ) AS FIRST_DT 
,MAX(ITM_LST_DT) OVER (
       PARTITION BY PARTITION BY COLA 
       ,COLB 
       ) AS LAST_DT 

Edit 1: Первоначальный запрос

SELECT a.* 
FROM (
    SELECT F.DT_KEY AS DT_KEY 
     ,F.COL_KEY AS COL_KEY 
     ,F.PCK_ITM_KEY AS PCK_ITM_KEY 
     ,F.COLC AS COLC 
     ,F.COLD AS COLD 
     ,F.COLA AS COLA 
     ,F.COLB AS COLB 
     ,F.COLC AS COLC 
     ,F.SH_QTY AS SH_QTY 
     ,SUM(F.SLS_QTY) OVER (
      PARTITION BY F.COLD 
      ,F.COLA 
      ,F.COLB 
      ,F.COLC 
      ) AS SLS_QTY 
     ,SUM(F.SLS_RTRN_QTY) OVER (
      PARTITION BY F.COLD 
      ,F.COLA 
      ,F.COLB 
      ,F.COLC 
      ) AS SLS_RTRN_QTY 
     ,SUM(F.PCHSE_QTY) OVER (
      PARTITION BY F.COLD 
      ,F.COLA 
      ,F.COLB 
      ,F.COLC 
      ) AS PCHSE_QTY 

     ,MAX(F.LST_ML_DT) OVER (
      PARTITION BY F.COLA 
      ,F.COLC 
      ) AS LST_ML_DT 
     ,F.LST_MODFD_DTTM AS LST_MODFD_DTTM 
     ,ROW_NUMBER() OVER (
      PARTITION BY F.COLD 
      ,F.COLA 
      ,F.COLB 
      ,F.COLC 
      ,F.COLE ORDER BY F.DT_KEY DESC 
      ) AS RNK 
    FROM FCT_ITEM F 
    ) a 
WHERE a.RNK = 1; 

ответ

0

Этот запрос приведет к тому, вся таблица будет перераспределена на COLA и COLB. Если набор столбцов распределения является подмножеством столбцов раздела, то у вас не будет дорогого перераспределения.

Как правило, используйте минимальное количество столбцов в разделе распределения, сохраняя при этом равномерное распределение. Если бы только COLA или COLB предоставили даже распределение, перейдите к одному из них.

+0

В последнее время я наблюдал странное поведение с нашей машиной. Этот запрос использовался для прекращения работы (~ 1 ч), когда система была заполнена на 70%. Есть ли связь между растущей производительностью запросов данных. В настоящее время система Netezza добралась до своей емкости (с нашей текущей лицензией 50%). – NzGuy

+0

Если вы имеете в виду, что у вас есть система Growth-on-Demand, в которой вы имеете право на 50% емкости хранилища, это не является жестким пределом, установленным системой. Однако, когда вы перераспределяете всю таблицу для ответа на запрос, это вызывает много временного, обычно ненужного давления на чтение и чтение в системе, поскольку оно будет перемещать миллиарды строк вокруг SPU для ответа на вопрос. Таким образом, рост данных может определенно быть проблемой. – ScottMcG

+0

Когда есть таблица с 4 столбцами распределения, 9 раз из 10, это было ошибкой и ее необходимо переоценить. – ScottMcG