3 回答
TA贡献1842条经验 获得超22个赞
使用IN运算符编写查询时,有一些注意事项,它们可能会影响性能。
首先,大多数数据库通常在内部重写IN子句以使用OR逻辑连接符。因此col IN ('a','b','c')被重写为:(COL = 'a') OR (COL = 'b') or (COL = 'c')。假设您在上有一个索引,则这两个查询的执行计划可能等效col。
其次,当对可变数量的参数使用IN或OR时,每次参数更改时,都将导致数据库不得不重新解析查询并重建执行计划。为查询建立执行计划可能是一个昂贵的步骤。大多数数据库使用EXACT查询文本作为键来缓存它们运行的查询的执行计划。如果执行类似的查询,但谓词中的参数值不同,则很可能导致数据库花费大量时间来解析和构建执行计划。这就是为什么强烈建议将绑定变量作为确保最佳查询性能的一种方式。
第三,许多数据库对它们可以执行的查询的复杂性有一个限制-这些限制之一是谓词中可以包含的逻辑连接词的数量。在您的情况下,几十个值不太可能达到数据库的内置限制,但是如果您希望将数百或数千个值传递给IN子句,则肯定会发生。在这种情况下,数据库将简单地取消查询请求。
第四,在谓词中包含IN和OR的查询不能总是在并行环境中最佳地重写。在许多情况下,没有应用并行服务器优化-MSDN对如何优化并行查询进行了不错的介绍。通常,尽管如此,使用UNION ALL运算符的查询在大多数数据库中都是微不足道的-并在可能的情况下首选逻辑连接符(例如OR和IN)。
- 3 回答
- 0 关注
- 1544 浏览
添加回答
举报
