我需要编写一个查询来从表中获取一些数据,并且需要使用concat方法。我最终准备了两个不同的查询,当我们有大量数据时,我不确定哪一个会有更好的性能。
请帮助我了解哪个查询的性能更好,以及为什么。
- 我需要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'
- 将上述查询作为子查询编写,并添加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
两次,即使子查询的成本非常高也可能无关紧要。