2

此 SQL 查询是否有性能损失?

select fullname, address from (select (name + ' ' + lastname) as fullname, address from mytable) as tab

与之比较:

select (name + ' ' + lastname) as fullname, address from mytable

也许你会想.. 为什么我要这样做,原因是因为 SQL Server 不允许在 group by 中使用别名,所以使用签名子查询我可以这样做

select fullname, address from (select (name + ' ' + lastname) as fullname, address from mytable) as tab group by fullname

代替

select (name + ' ' + lastname) as fullname, address from mytable group by name + ' ' + lastname

这只是一个示例,其中 alias is 和 alias 的基本连接,但连接更复杂,将其重写为 group 子句真的很难看。

4

3 回答 3

3

子查询本身不太可能导致性能问题。查询计划器可能会重新排列查询,使其最终根本不是子查询。查看性能计划将揭示查询实际发生的情况。

可能是性能问题是您正在对计算值进行分组。这意味着数据库不能使用任何索引进行分组,因此它必须创建所有值然后对它们进行排序。

如果可能,您应该对计算中使用的值进行分组,例如:

select name + ' ' + lastname as fullname
from mytable
group by name, lastname
于 2013-01-29T13:48:59.223 回答
0

提高性能的一种选择可能是创建一个计算列,其中包含名为 fullname 的 Persisted 关键字。

ALTER TABLE dbo.[yourtable] ADD
fullname AS (firstname+' '+lastname) PERSISTED
GO
--instead of SELECT firstname + ' ' + lastname, address FROM dbo.[yourtable]     
SELECT fullname, address 
FROM dbo.[yourtable]
于 2013-01-29T14:09:43.157 回答
0

我不确定我是否完全理解您的问题,但总的来说,子查询会对性能产生负面影响,应该避免。为什么不使用CONCAT语法?

select CONCAT(name, ' ', lastname) as fullname, address from mytable group by CONCAT(name, ' ', lastname);

根据您的情况和复杂性,您可能还想查看GROUP_CONCAT

于 2013-01-29T13:47:43.593 回答