J'utilise SQL SERVER 2008 R2
Je viens de trouver APPLY dans SQL et j'ai adoré la résolution des problèmes de requête dans de nombreux cas,
La plupart des tables que j’utilisais joignaient à gauche pour obtenir le résultat, j’ai pu entrer dans une application externe.
J'ai peu de données dans mes tables de base de données locales et après le déploiement, le code est censé fonctionner sur des données au moins 20 fois plus grandes.
Je crains que l’application externe ne prenne plus de temps que les deux conditions de jointure restantes pour une grande quantité de données,
Quelqu'un peut-il dire exactement comment fonctionne exactement et comment cela affectera les performances dans des données très volumineuses, Si possible, des relations proportionnelles avec la taille de chaque tableau, telles que proportionnelles à n1 ^ 1 ou n1 ^ 2 ... où n1 est le nombre de lignes du tableau 1.
Voici la requête avec 2 jointures à gauche
select EC.*,DPD.* from Table1 eC left join
(
select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
group by member_id,parent_gid,child_gid,LOB,group_gid
) DPD2 on DPD2.parent_gid = Ec.parent_gid
AND DPD2.child_gid = EC.child_gid
AND DPD2.member_id = EC.member_id
AND DPD2.LOB = EC.default_lob
AND DPD2.group_gid = EC.group_gid
left join
Table2 dpd on dpd.parent_gid = dpd2.parent_gid
and dpd.child_gid = dpd2.child_gid
and dpd.member_id = dpd2.member_id
and dpd.group_gid = dpd2.group_gid
and dpd.LOB = dpd2.LOB
and dpd.table2_sid = dpd2.mdsid
Voici la requête avec outer apply
select * from Table1 ec
OUTER APPLY (
select top 1 grace_begin_date,retroactive_begin_date,Isretroactive
from Table2 DPD
where DPD.parent_gid = Ec.parent_gid
AND DPD.child_gid = EC.child_gid
AND DPD.member_id = EC.member_id
AND DPD.LOB = EC.default_lob
AND DPD.group_gid = EC.group_gid
order by DPD.table2_sid desc
) DPD
la source