gpt4 book ai didi

sql - IN 参数的数量是否会改变查询的执行计划?

转载 作者:行者123 更新时间:2023-12-05 03:24:28 24 4
gpt4 key购买 nike

让我们考虑这些查询:

select * from person where com_code in (1, 2, 3, 4)
select * from person where com_code in (1, 2, 2, 2)
select * from person where com_code in (1, 2, 3)
select * from person where com_code in (0,1,2,3,4,5,6,7,8,9,10,11,12,13)

他们是否有不同的执行计划存储在 Oracle 的内存中?换句话说,IN参数的数量是否改变了执行计划?是否会有一个针对 1 个参数的执行计划,另一个针对 2 个参数的执行计划,等等?

最佳答案

Will there be an execution plan for 1 parameter, another one for 2 parameters, etc.?

SQL 引擎将检查查询的文本并查看它是否与现有查询相同:

  • 如果相同,则将使用现有计划。
  • 如果有任何不同,它将解析新查询并生成新计划。

对于您的示例,无论参数数量如何,每个查询都会有一个执行计划,因为每个查询的查询文本都不同。所以对于 4 个不同的查询会有 4 个不同的执行计划。


如果你使用绑定(bind)参数:

select * from person where com_code in (:a, :b, :c, :d);

然后您传入 1234 或者您传入 2 222 那么 SQL 引擎将看到第二个查询的文本与第一个相同,并且,假设表统计信息未更改,将为第二个查询重新使用第一个查询的执行计划(即使绑定(bind)变量不同)。

如果您改变绑定(bind)参数的数量,则会生成不同的执行计划以匹配过滤器的数量。


如果您不使用绑定(bind)参数,则 SQL 引擎将不得不在每次更改时解析查询文本,并且可能不会生成相同的查询计划。

例如:

select * from person where com_code in (2, 2, 2, 2);

将被 SQL 引擎重写为:

select * from person where com_code = 2;

并且会生成一个不同的解释计划来:

select * from person where com_code in (1, 2, 3, 4);

db<> fiddle here (记得展开解释计划以查看完整的详细信息)

关于sql - IN 参数的数量是否会改变查询的执行计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72305288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com