我有一个动态构建的查询,其中的 where 子句如下所示:
where column in ('a', 'a', 'a', 'b')
实际数据要长很多,而且有很多重复项,如上面的示例中a
重复了 3 次。
使用具有大量值(其中许多值是重复的)的非常大WHERE
的子句是否有潜在的性能影响?IN
我有一个动态构建的查询,其中的 where 子句如下所示:
where column in ('a', 'a', 'a', 'b')
实际数据要长很多,而且有很多重复项,如上面的示例中a
重复了 3 次。
使用具有大量值(其中许多值是重复的)的非常大WHERE
的子句是否有潜在的性能影响?IN
这很容易测试。
启用“实际”执行计划,然后运行:
结果非常清楚地表明 SQL Server
IN (...)
在执行查询之前从子句中删除了重复项。请注意,如果其中
IN (...)
包含足够多的重复项,则查询的性能可能比不存在这些重复项时更差。性能不佳的原因可能包括:IN
子句的项目列表。IN
查询优化器花费的时间显然会随着子句中项目的增加而有所增加。IN
如果通过网络发送查询,如果需要编译、发送和接收多个 TCP 数据包,子句中的一长串项目可能会导致更高的延迟。如果查询被非常频繁地发送到服务器,上面列出的项目将被混合。
如果列表足够大,单是文本的大小就会导致其他方面的性能问题,例如编译时间(只是解析内容)和通过网络发送查询。因此,仅仅因为执行计划没有显示它,并不意味着这些额外的值不会对性能产生影响。