在 where 条件中使用 OR 时的 SQL Scan 与 Seek

问题描述 投票:0回答:1

考虑 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
sql-server t-sql query-optimization
1个回答
0
投票

Paul White 对以下问题的回答似乎对此进行了解释,并确认 SQL 无法提出具有 OR 标准的 UNION 计划。 https://dba.stackexchange.com/questions/289578/table-scan-instead-of-index-seeks-happening-when-where-clause-filters-across-mul

© www.soinside.com 2019 - 2024. All rights reserved.