考虑 AdventureWorks 数据库中的以下两个查询。 where 条件完全针对索引列。如果您使用 OR 条件,则两个表都会进行全表扫描。在第二种情况下,条件被拆分为两个联合查询。在第二种情况下,两个表都进行索引查找。有人可以解释为什么 SQL 不能/不会优化第一个查询来执行索引查找吗? 有没有办法告诉 SQL 进行查找而无需重写为 UNION? (我尝试过索引提示但没有成功)
SELECT *
FROM [AdventureWorks2022].[Sales].[SalesOrderHeader] hdr
JOIN [AdventureWorks2022].[Sales].[SalesOrderDetail] dtl ON hdr.SalesOrderID = dtl.SalesOrderID
WHERE hdr.SalesOrderID = 43659 OR dtl.SalesOrderDetailID = 43659
----
SELECT *
FROM [AdventureWorks2022].[Sales].[SalesOrderHeader] hdr
JOIN [AdventureWorks2022].[Sales].[SalesOrderDetail] dtl ON hdr.SalesOrderID = dtl.SalesOrderID
WHERE hdr.SalesOrderID = 43659
UNION
SELECT *
FROM [AdventureWorks2022].[Sales].[SalesOrderHeader] hdr
JOIN [AdventureWorks2022].[Sales].[SalesOrderDetail] dtl ON hdr.SalesOrderID = dtl.SalesOrderID
WHERE dtl.SalesOrderDetailID = 43659
Paul White 对以下问题的回答似乎对此进行了解释,并确认 SQL 无法提出具有 OR 标准的 UNION 计划。 https://dba.stackexchange.com/questions/289578/table-scan-instead-of-index-seeks-happening-when-where-clause-filters-across-mul