Требуется ли рефакторинг этого оператора SQL? - PullRequest
0 голосов
/ 28 октября 2009
SELECT DISTINCT group_id
       , supplier_id
       , supplier_name
       , site_division_id
       , site_division_name 
FROM view_supplier_site 
WHERE supplier_id IN (SELECT DISTINCT supplier_id 
                      FROM view_supplier 
                      WHERE YEAR IN (2008, 2009) 
                      AND received_quantity > 0 
                      AND COE_SUPPLIER NOT IN ('X - LG', 'Y - LG', 'Z - LG') ) 

Ответы [ 2 ]

4 голосов
/ 28 октября 2009

Факторинг без подзапроса:

  SELECT vss.group_id, 
         vss.supplier_id, 
         vss.supplier_name, 
         vss.site_division_id, 
         vss.site_division_name 
    FROM view_supplier_site vss
    JOIN (SELECT vs.supplier_id
            FROM view_supplier vs
           WHERE vs.year IN (2008, 2009)  
             AND vs.received_quantity > 0 
             AND vs.coe_supplier NOT IN ('X - LG', 'Y - LG', 'Z - LG')
        GROUP BY vs.supplier_id) s ON s.supplier_id = vss.supplier_id
GROUP BY vss.group_id, vss.supplier_id, vss.supplier_name, vss.site_division_id, vss.site_division_name 

Использование факторинга подзапроса:

WITH suppliers AS (
    SELECT vs.supplier_id
      FROM view_supplier vs
     WHERE vs.year IN (2008, 2009)  
       AND vs.received_quantity > 0 
       AND vs.coe_supplier NOT IN ('X - LG', 'Y - LG', 'Z - LG')
  GROUP BY vs.supplier_id)
  SELECT vss.group_id, 
         vss.supplier_id, 
         vss.supplier_name, 
         vss.site_division_id, 
         vss.site_division_name 
    FROM view_supplier_site vss
    JOIN suppliers s ON s.supplier_id = vss.supplier_id
GROUP BY vss.group_id, vss.supplier_id, vss.supplier_name, vss.site_division_id, vss.site_division_name 

Они эквивалентны.

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

1 голос
/ 28 октября 2009

Я бы предложил следующее:

  • Вместо использования n IN используйте внутреннее соединение (возможно, не улучшение производительности, но выражение выглядит «лучше»)
  • Это позволит вам избавиться от DISTINCT для view_supplier (опять же, вероятно, без разницы в производительности)
  • нужен ли DISTINCT для view_supplier? Есть несколько идентификаторов, которые могут быть ключами для supplier_site.
  • NOT IN может быть проблема с производительностью ... можете ли вы изменить это на что-то еще, например <'X - LG' или около того?
  • если представления представляют собой нечто большее, чем просто "псевдонимы" для базовых таблиц / столбцов, могут быть способы использования базовых таблиц.
  • Еще одна вещь, на которую стоит обратить внимание, это индексы.
  • Является ли ГОД рассчитанным столбцом? Если это просто YEAR(datevalue), может быть быстрее использовать что-то вроде datevalue between <Jan1st> and <Dec31>

Большинство этих изменений будут косметическими, области, на которых следует сосредоточиться, будут определяться проблемами, которые вы видите в заявлении.

...