【发布时间】:2018-01-23 05:28:35
【问题描述】:
我有这个简单的内部连接查询,它的执行计划主表有大约 34K 条记录,明细表有大约 51K 条记录。但是这个简单的查询建议使用include 添加一个索引(包含我在选择中包含的所有主列)。我没想到这可能是原因和补救措施。
DECLARE
@StartDrInvDate Date ='2017-06-01',
@EndDrInvDate Date='2017-08-31'
SELECT
Mastertbl.DrInvoiceID,
Mastertbl.DrInvoiceNo,
Mastertbl.DistributorInvNo,
PreparedBy,
detailtbl.BatchNo, detailtbl.Discount,
detailtbl.TradePrice, detailtbl.IssuedUnits,
detailtbl.FreeUnits
FROM
scmDrInvoices Mastertbl
INNER JOIN
scmDrInvoiceDetails detailtbl ON Mastertbl.DrInvoiceID = detailtbl.DrInvoiceID
WHERE
(Mastertbl.DrInvDate BETWEEN @StartDrInvDate AND @EndDrInvDate)
我真正的好奇是为什么它建议使用这个索引 - 我通常不会在较大的表中看到这种行为
【问题讨论】:
-
如果您对当前的性能感到满意,那么您可以放心地忽略该建议。
-
仅仅因为 SQL Server 要求这样做并不意味着您应该创建它。它基于它在该特定查询上使用的执行计划进行假设。尝试在 Mastertbl.DrInvoiceID 上添加非聚集索引并包含 Mastertbl.DrInvDate。查看查询并在其上播放索引:)
-
@Serg 这个查询实际上是较大查询的一部分,它需要一些时间,当我删除所有其他连接时,该查询建议这个索引,我只剩下这个,仍然建议相同的索引跨度>
-
如果性能是一个问题,我肯定会尝试遵循建议。为什么优化器不建议覆盖其他查询的索引完全取决于这些查询。
标签: sql sql-server sql-server-2012 query-performance sql-execution-plan