sql - 使用联合优化查询
问题描述
我必须优化以下查询,执行时间太长
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])
这里是执行计划:
解决方案
我建议这样编写查询:
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
在两个索引中。
推荐阅读
- html - 水平滚动(暂停)轮播
- c++ - 为什么在 std::string 中使用自定义分配器时没有调用 allocate() 和 deallocate()?
- angular - AWS Lambda + Angular Web 应用程序抛出“错误:找不到模块'@vendia/serverless-express'”
- angular - 对于 Angular 11,如何记住以前的状态,例如滚动位置和路线更改数据?
- prolog - 纯 Prolog 方案 Quine
- javascript - 用户登录 PHP 时是否可以显示按钮?
- python - 执行时 ModuleNotFoundError 但 IntelliJ 未显示错误
- javascript - 发送 AJAX 函数列表项从第一个列表拖放到第二个列表
- html - 在 Canvas 中制作根据纵横比缩小的响应式浏览器窗口
- node.js - 如何在猫鼬中为特定用户角色创建对象?