Questa istruzione SQL deve essere rifattorizzata?
-
06-07-2019 - |
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') )
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 comedatevalue 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