Оптимизировать запрос с объединением - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно оптимизировать следующий запрос, для его выполнения требуется слишком много времени

SELECT Devis.Numero_Devis, 
       contrat.Numero_contrat, 
       Devis.Id_Devis, 
       contrat.ID_contrat 
FROM   (SELECT ID_contrat          AS Id_Devis, 
               Numero_contrat AS Numero_Devis 
        FROM   [sch_DM_LMI].Fact_IU_contrat AS contrat 
        WHERE  ( Code_Statut_Contrat = 'D' )) AS Devis 
       LEFT OUTER JOIN [sch_DM_LMI].Fact_IU_contrat AS contrat 
                    ON Devis.Numero_Devis = contrat.Numero_contrat 
                       contratD contrat.Code_Statut_Contrat = '1' 
UNION 
SELECT 'Inconnu'                              AS Numero_Devis, 
       'Inconnu'                              AS Numero_contrat, 
       '00000000-0000-0000-0000-000000000000' AS Id_Devis, 
       '00000000-0000-0000-0000-000000000000' AS ID_contrat 

Я создал следующий индекс

CREATE NONCLUSTERED INDEX idx_Devis
ON [sch_DM_LMI].[Fact_IU_contrat] ([Code_Statut_Contrat])
INCLUDE ([ID_contrat],[Numero_contrat])

Вот план выполнения:

enter image description here Как его оптимизировать?

1 Ответ

1 голос
/ 28 мая 2020

Я бы посоветовал написать такой запрос:

SELECT 'Inconnu'                              AS Numero_Devis, 
       'Inconnu'                              AS Numero_contrat, 
       '00000000-0000-0000-0000-000000000000' AS Id_Devis, 
       '00000000-0000-0000-0000-000000000000' AS ID_contrat
UNION ALL  -- NOT UNION    
SELECT Devis.Numero_contrat, 
       contrat.Numero_contrat, 
       Devis.ID_contrat, 
       contrat.ID_contrat 
FROM [sch_DM_LMI].Fact_IU_contrat devis LEFT JOIN
     [sch_DM_LMI].Fact_IU_contrat contrat 
     ON contrat.Numero_contrat = Devis.Numero_contrat AND
        contrat.Code_Statut_Contrat = '1' 
WHERE devis.Code_Statut_Contrat = 'D';

Единственное важное изменение здесь - это изменение на UNION ALL.

Тогда для этого запроса вам нужны индексы Fact_IU_contrat(Code_Statut_Contrat, Numero_contrat) и Fact_IU_contrat(Numero_contrat, Code_Statut_Contrat) - да, оба. Вы также можете включить id_contrat в оба индекса.

...