我们有一个名为" mealevent ";它在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选择不使用它在寻求谓词?我可以强制它在查找谓词中使用它吗?
任何建议都是非常感谢的。
您需要翻转索引中键列的顺序。服务器不能先使用范围谓词再使用相等谓词,必须先使用相等谓词
应该是(CONSUMER_ID, MEAL_EVENT_DATE)
原因很简单:当服务器查找MEAL_EVENT_DATE
的索引时,它没有一个确切的键要查找,它需要一个键的范围。然后,在这些键中,它不能从一个键跳到下一个键以获得单个CONSUMER_ID
。
但是如果CONSUMER_ID
是第一个,那么服务器可以直接查找该键,然后在该键中可以查找MEAL_EVENT_DATE
的范围。