concat方法的SQL Server性能



我需要编写一个查询来从表中获取一些数据,并且需要使用concat方法。我最终准备了两个不同的查询,当我们有大量数据时,我不确定哪一个会有更好的性能。

请帮助我了解哪个查询的性能更好,以及为什么。

  1. 我需要concat两次,一次用于显示,另一次用于where条件:
select 
id, concat(boolean_value, long_value, string_value, double_value) as Value  
from 
table 
where 
concat(boolean_value, long_value, string_value, double_value) = 'XX'
  1. 将上述查询作为子查询编写,并添加where条件
Select * 
from 
(select 
id, concat(boolean_value, long_value, string_value, double_value) as Value          
from 
table) as output 
where 
Value = 'XX'

注意:这是示例查询,实际查询将有多个联接,并且需要从不同表的多列进行连接

SQL数据库表示正在生成的结果集。您似乎在问是否存在常见的表达式消除——也就是说,concat()是否只执行一次。

使用子查询比使用重复表达式的版本更有可能实现此操作。但SQL Server可能足够聪明,只对其进行一次评估。

如果你想保证单次评估,那么我认为cross apply可以做到:

select t.id, v.value
from table t cross apply
(values (concat( boolean_value, long_value, string_value, double_value))
) as Value
where v.value = 'XX';

然而,我想问一下,为什么要比较concat()结果,而不是基列。比较基列将允许优化器利用索引、分区和统计信息。

您可以在两个查询上运行EXPLAIN,以了解SQL Server的想法。我认为第一个版本会更好,因为与第二个版本不同,它不强制SQL Server实现中间表。关于SQL Server在第一个版本中是否必须实际评估CONCAT两次,即使子查询的成本非常高也可能无关紧要。

最新更新