Mon cas d'utilisation est de récupérer des factures pour un client et un code de format pour chaque facture trouvée par une jointure à une table customer_list
qui se joint à une table de codes généralisée pour élaborer le code de format. Une version simplifiée de ma requête suit, qui fonctionne correctement, mais la sous-requête retournerait environ 5k de lignes, je dois me demander comment cela pourrait être optimisé pour que la sous-requête ne contienne pas autant de lignes.Comment puis-je optimiser un select imbriqué?
select i.invoice_number,
f.format_code
from invoices i
left join (
select gc.code_1 as format_code,
ls.account
from gen_codes gc,
customer_list ls
where gc.code_name = 'invoice-format'
and gc.code_1 <> ''
and ls.list_type = gc.code_value
) f on account = i.account
or account = i.billing_account
where i.account = :accountNumber
NOTE: Pas toutes les factures ont un code de format, ce qui est bien et pourquoi je joue une jointure gauche.
MISE À JOUR: Une requête similaire sans l'aide d'une sélection interne serait de la forme suivante:
select i.invoice_number,
f.code_1 as format_code
from invoices i
left join customer_list ls on
(account = i.account or account = i.billing_account) and ls.list_type in (
select code_value
from gen_codes
where code_name = 'invoice-format'
and code_1 <> ''
)
left join gen_codes f on code_value = ls.list_type
and code_name = 'invoice-format'
and code_1 <> ''
Je sens cette dernière version peut être plus efficace car il n'y a que deux enregistrements douzaine de gen_codes
avec la requête correspondante tandis que customer_list
contient ~ un demi-million d'enregistrements avec ~ 5k correspondant dans la première version.
Pour m'aider à mieux comprendre les instructions select internes, comment les moteurs SQL interprètent-ils cela? Est-ce qu'ils exécutent le select interne avant l'instruction select externe? Et si oui, ce résultat est réutilisé pour le reste de la sélection, de sorte qu'il n'a été exécuté qu'une seule fois? –