Sql 我有一个使用';其中(X)中的[值]';将更多值添加到运行时中是否会增加?
我有一个查询,它在(X)中使用了一个“WHERE[value];”例如: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”,这会增加查询运行时间吗 我在测试这一点时遇到的问题是,只有我们的生产环境包含足够的数据,以满足相关需求;我们的测试环境中没有足够的数据来明确区别。由于涉及的数据量很大,我也无法在生产环境中自由地对其进行测试,因
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有索引吗你开始工作了