如何优化结合了内部连接和 DISTINCT 的 SQL 查询?


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 添加索引。

将联结表移出主查询:

<小时 />
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
;

首先,您应该将DISTINCT替换为WINDOW子句。

此外,您可以稍微重构 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;

最新更新