Sql 我有一个使用';其中(X)中的[值]';将更多值添加到运行时中是否会增加?

Sql 我有一个使用';其中(X)中的[值]';将更多值添加到运行时中是否会增加?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个查询,它在(X)中使用了一个“WHERE[value];”例如: SELECT [col1] , [col2] , [value] FROM Table WHERE [value] IN ('X','Y') 我的问题是,如果我在IN中添加一个“Z”,这会增加查询运行时间吗 我在测试这一点时遇到的问题是,只有我们的生产环境包含足够的数据,以满足相关需求;我们的测试环境中没有足够的数据来明确区别。由于涉及的数据量很大,我也无法在生产环境中自由地对其进行测试,因

我有一个查询,它在(X)中使用了一个“WHERE[value];”例如:

SELECT
      [col1]
    , [col2]
    , [value]
FROM Table 
WHERE [value] IN ('X','Y')
我的问题是,如果我在IN中添加一个“Z”,这会增加查询运行时间吗

我在测试这一点时遇到的问题是,只有我们的生产环境包含足够的数据,以满足相关需求;我们的测试环境中没有足够的数据来明确区别。由于涉及的数据量很大,我也无法在生产环境中自由地对其进行测试,因此在开始尝试测试查询之前,我想从理论上了解一下预期结果

in子句中的值均为文本值;没有数字。[value]列是VARCHAR2类型

如果在IN中添加一个“Z”,这会增加查询运行时间吗

对。即使有索引,这个新值也意味着新的查找,可能需要加载更多的数据

此外,即使使用索引,优化器也可能选择执行
全表扫描
而不是
索引扫描
,主要是当
IN
值预计在大多数行中,或者如果表中的数据很少

通常,您应该相信优化器。如果速度太慢,您可以尝试在单独的查询中拆分
中的
值,然后
合并所有结果。优化器可能会对每个查询执行
索引扫描。我无法确认此更改是否会改善查询运行时。我只是说将
全表扫描
更改为
索引扫描

如果在IN中添加一个“Z”,这会增加查询运行时间吗

对。即使有索引,这个新值也意味着新的查找,可能需要加载更多的数据

此外,即使使用索引,优化器也可能选择执行
全表扫描
而不是
索引扫描
,主要是当
IN
值预计在大多数行中,或者如果表中的数据很少


通常,您应该相信优化器。如果速度太慢,您可以尝试在单独的查询中拆分
中的
值,然后
合并所有结果。优化器可能会对每个查询执行
索引扫描。我无法确认此更改是否会改善查询运行时。我只是说将
全表扫描
更改为
索引扫描

需要为
in
子句中的每个值做一些工作。一个例外是,如果所有行都匹配
'X'
'Y'
,那么就没有额外的工作要做。在一种临界情况下,编译器处理稍微大一点的查询所需的额外工作仅为一微秒左右

这额外的工作重要吗?可能不会。它不会将查询的运行时间增加50%。查询的时间安排将由读取数据页而不是比较决定。当然,在差异明显的地方,列表可能会变得足够大,但我不认为两到三项会有很大的区别。如果有差异,可能是因为返回了更多的行

一些数据库(但据我所知不是SQL Server)将通过为常量元素创建二叉树结构来优化
查找中的
。如果SQL Server做到了这一点,那么附加项的问题就更少了。您可以通过将项目放入带有索引的临时表来模拟此行为,以最大限度地提高性能


不过,我的猜测是,这个问题的动机是过早的优化。当然,了解查询的执行方式对于让应用程序正常工作非常重要。
列表中
项目数量的少量增加不太可能产生很大的差异。

需要为
in
子句中的每个值做一些工作。一个例外是,如果所有行都匹配
'X'
'Y'
,那么就没有额外的工作要做。在一种临界情况下,编译器处理稍微大一点的查询所需的额外工作仅为一微秒左右

这额外的工作重要吗?可能不会。它不会将查询的运行时间增加50%。查询的时间安排将由读取数据页而不是比较决定。当然,在差异明显的地方,列表可能会变得足够大,但我不认为两到三项会有很大的区别。如果有差异,可能是因为返回了更多的行

一些数据库(但据我所知不是SQL Server)将通过为常量元素创建二叉树结构来优化
查找中的
。如果SQL Server做到了这一点,那么附加项的问题就更少了。您可以通过将项目放入带有索引的临时表来模拟此行为,以最大限度地提高性能


不过,我的猜测是,这个问题的动机是过早的优化。当然,了解查询的执行方式对于让应用程序正常工作非常重要。
列表中
项的数量稍微增加不太可能会产生很大的变化。

如果您开始担心这一点(可能是因为值列表可能很长),那么您应该将查询更改为JOIN,而不是使用in()@juergend。您的意思是他应该这样加入<代码>内部连接(值('X'),('Y'))作为T([value]关于…
?如果是这样,我不认为会有什么不同。SQL Server无论如何都会按照它想要的方式编译它。@EvaldasBuinauskas:不,我认为这些值来自某个地方。如果是另一个表,则对该表进行连接,如果不是,则将它们放在一个表中并对其进行连接。
Value
columnIf有索引吗你开始工作了