我们的系统中有一个查询,它使用的逻辑读取量存在问题。查询经常运行(一天几次),但它本质上是报告(即收集数据,它不是事务性的)。
在让几个人看过之后,我们正在考虑几个不同的选择。
使用 OPTION (FORCE ORDER) 和一些 MERGE JOIN 提示让优化器更有效地处理数据(至少在已测试的数据上)。
使用临时表来分解查询,这样优化器就不会处理非常大的查询,从而可以更有效地处理它。
我们真的没有选择进行重大模式更改或任何事情,调整查询是这个问题的集合点。
查询提示选项的性能比其他选项好一点,但在这一点上,这两个选项的性能都是可以接受的。
那么问题来了,你更喜欢哪一个?查询提示被认为有点危险,因为我们正在覆盖优化器等。临时表解决方案需要写出到 tempdb 等。
过去,我们已经能够在较大的报告查询中使用临时表来获得巨大的性能提升,但这通常是针对运行频率低于此查询的查询。