未出现在 Seek Predicate 上的列

Column not appearing on Seek Predicate

我们有一个名为“MealEvent”的 table,它在 EventDate、ConsumerId 和其他一些列上有一个索引。我有一个性能不佳的查询,它有一个像这样的 ON 子句(me2 是 MealEvent):

ON me2.CONSUMER_ID=fe.CONSUMER_ID and me2.MEAL_EVENT_DATE between fe.START_DATE and fe.END_DATE

当我查看执行计划时,我在 Predicate 中看到了 ConsumerId,而不是 Seek Predicate。我想知道为什么 SQL Server 选择不在 Seek Predicate 中使用它?我可以强制它在Seek Predicate中使用它吗?

非常感谢任何建议。

您需要翻转索引中键列的顺序。服务器不能使用范围谓词然后使用相等谓词,相等必须在前

应该是(CONSUMER_ID, MEAL_EVENT_DATE).

原因很简单:当服务器为MEAL_EVENT_DATE寻找索引时,它没有一个确切的键来查找,它想要一个键的范围.然后,它不能在这些键中从一个键跳到下一个键以获得单个 CONSUMER_ID.

但是如果CONSUMER_ID是第一个,那么服务器可以直接查找那个key,然后在那个范围内可以查找MEAL_EVENT_DATE.