Нужна помощь во избежании представления, которое используется в (внутреннем) соединении несколько раз в запросе - PullRequest
1 голос
/ 05 апреля 2019

У нас есть запрос, который использует несколько внутренних соединений Теперь здесь мы выполняем внутреннее соединение с одним и тем же представлением несколько раз. это как тип иерархии join

Это приводит к увеличению времени выполнения запроса.

Запрос

    Select field1, field2 ... few fields
    FROM 
    CUST_MART.v_CPM AS P 
    JOIN CUST_MART.V_CPM_MART_HIER AS C ON p.prod_cl = c.prod_cl 
    AND g.lvl = c.lvl 
    JOIN CUST_MART.V_CPM_MART_CLASS AS D0 ON c.prod_cl_0 = d0.prod_cl 
    AND c.lvl_0 = d0.lvl 
    JOIN CUST_MART.V_CPM_MART_CLASS AS D2 ON c.prod_cl_2 = d2.prod_cl 
    AND c.lvl_2 = d2.lvl 
    JOIN CUST_MART.V_CPM_MART_CLASS AS D3 ON c.prod_cl_3 = d3.prod_cl 
    AND c.lvl_3 = d3.lvl 
    JOIN CUST_MART.V_CPM_MART_CLASS AS D6 ON c.prod_cl_6 = d6.prod_cl 
    AND c.lvl_6 = d6.lvl 
    JOIN CUST_MART.v_CPM_upc AS V on p.skt = v.skt

Будет ли этот запрос работать -

    Select field1, field2 ... few fields
    FROM 
    CUST_MART.v_CPM AS P 
    JOIN CUST_MART.V_CPM_MART_HIER AS C ON p.prod_cl = c.prod_cl 
    AND g.lvl = c.lvl 
    JOIN CUST_MART.V_CPM_MART_CLASS AS D0 ON c.prod_cl_0 = d0.prod_cl 
    AND c.lvl_0 = d0.lvl 
    AND c.prod_cl_2 = d0.prod_cl 
    AND c.lvl_2 = d0.lvl 
    AND c.prod_cl_3 = d0.prod_cl 
    AND c.lvl_3 = d0.lvl 
    AND c.prod_cl_6 = d0.prod_cl 
    AND c.lvl_6 = d0.lvl 
    JOIN CUST_MART.v_CPM_upc AS V on p.skt = v.skt 

Запрос

  • Будет ли работать мой переписанный запрос?
  • Я не могу запустить на Prod, поэтому не могу проверить это с существующими данными
  • Этот запрос занимает 4 часа и выполняется ежедневно, поэтому необходимо исправить этот запрос
  • есть ли другой подход, который я могу рассмотреть

1 Ответ

1 голос
/ 05 апреля 2019

Нет, ваш переписанный запрос не будет работать. Учтите это JOIN:

JOIN CUST_MART.V_CPM_MART_CLASS D0
ON c.prod_cl_0 = d0.prod_cl AND
   c.lvl_0 = d0.lvl AND
   c.prod_cl_2 = d0.prod_cl AND
   c.lvl_2 = d0.lvl AND
   c.prod_cl_3 = d0.prod_cl AND
   c.lvl_3 = d0.lvl AND
   c.prod_cl_6 = d0.prod_cl AND
   c.lvl_6 = d0.lvl 

Это соответствует только когда:

c.lvl_0 = c.lvl_1 = c.lvl_2 = c.lvl_3 = c.lvl_6

Это условие отсутствует в исходном запросе. Я предполагаю, что это никогда не соответствует вашим данным.

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