如何优化结合内部联接和distinct的sql查询?

tzcvj98z  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(321)
SELECT DISTINCT af.ID, af.nom_flux, st.chemin_stockage, af.hash_flux 
FROM signature sig  
INNER JOIN stockage st ON st.id_flux = sig.id_flux AND st.date_statut_stockage >= sysdate - 100
INNER JOIN allotissement_flux af ON af.ID = sig.id_flux  
WHERE sig.date_statut_signature >= sysdate - 100
AND sig.statut_signature = 'A_SIGNER'
AND st.statut_stockage = 'OUI'
AND sig.nb_appel_service_signature < 4 ;

上面的查询返回5222行,在本地运行只需0.63秒。我想知道它是不是尽可能快,或者我是否可以进一步调整它,因为这个数据集将随着时间的推移快速增长。
我在速度不变的情况下尝试过的事情:
1-更改联接顺序,从最小表联接到最大表。
2-向af.id添加索引。

cygmwpex

cygmwpex1#

将连接表移出主查询:

SELECT af.ID, af.nom_flux, st.chemin_stockage, af.hash_flux 
FROM JOIN stockage st 
INNER JOIN allotissement_flux af 
   ON EXISTS ( SELECT *
        FROM signature sig
        WHERE st.id_flux = sig.id_flux
        AND af.ID = sig.id_flux
        AND sig.statut_signature = 'A_SIGNER'
        AND sig.nb_appel_service_signature < 4 
        AND sig.date_statut_signature >= sysdate - 100
        )
WHERE st.statut_stockage = 'OUI'
AND st.date_statut_stockage >= sysdate - 100
        ;
omvjsjqw

omvjsjqw2#

首先,你应该替换 DISTINCTWINDOW 条款。
此外,还可以对sql进行一些重构,以提高其性能。因为您没有从中选取任何列 signature 但是,您正在基于此表筛选某些记录。让我们在连接自身时应用这些过滤器。它可能会带来一些改善执行时间。
示例sql-

SELECT ID, nom_flux, chemin_stockage, hash_flux FROM (SELECT af.ID, af.nom_flux, st.chemin_stockage, af.hash_flux, rank() over (partition by af.ID, af.nom_flux, st.chemin_stockage, af.hash_flux order by af.ID) as rrank
FROM allotissement_flux af   
INNER JOIN stockage st ON st.id_flux = sig.id_flux AND st.date_statut_stockage >= sysdate - 100 AND st.statut_stockage = 'OUI'
INNER JOIN signature sig ON af.ID = sig.id_flux  AND sig.date_statut_signature >= sysdate - 100 AND sig.statut_signature = 'A_SIGNER' AND sig.nb_appel_service_signature < 4)) WHERE rrank = 1;

相关问题