Domanda

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') ) 
È stato utile?

Soluzione

Factoring non di subquery:

  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 

Utilizzo del factoring di subquery:

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 

Sono equivalenti.

Per quanto posso vedere, non c'è molta ottimizzazione da ottenere. La prossima cosa da guardare sarebbero gli indici ...

Altri suggerimenti

Suggerirei quanto segue:

  • Invece di usare un n IN, usa un join interno (probabilmente non un miglioramento delle prestazioni, ma l'istruzione sembra " più bella ")
  • Ciò ti consentirebbe di sbarazzarti di DISTINCT su view_supplier (di nuovo, probabilmente senza differenze di prestazioni)
  • è necessario il DISTINCT su view_supplier? Esistono alcuni ID che possono essere le chiavi per supplier_site.
  • NOT IN potrebbe essere un problema di prestazioni .. puoi cambiarlo in qualcos'altro come <'X - LG' o giù di lì?
  • se le viste sono più che semplici " alias " per le tabelle / colonne di base, ci possono essere modi di usare le tabelle sottostanti.
  • Un'altra cosa da guardare sarebbero gli indici.
  • YEAR è una colonna calcolata? Se è solo YEAR(datevalue) potrebbe essere più veloce usare qualcosa come datevalue between <Jan1st> and <Dec31>

La maggior parte di questi cambiamenti sarebbe cosmetica, le aree su cui concentrarsi sarebbero determinate dai problemi che vedi con la dichiarazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top