【发布时间】:2014-02-20 19:40:32
【问题描述】:
我读到With 语句的性能在某些情况下比连接好得多。但是,在加入 varchars 时(我通常会避免这种情况),当我用 With 替换加入时,我发现速度有了很大提高
例如,我有三个要加入的表:Customer, CustomerNickname, Address(不是一个真实的例子,但可以解决这个问题)
我通常会使用以下查询来检索数据:
select * from customer c
inner join address a on c.addressid = a.id
left join CustomerNickname cn on cn.originalname = c.name --name and original name are varchars
如果这些表有很多数据,由于 varchar 连接,性能会非常糟糕。但是,如果我将查询替换为:
with Nicknames as (
select * from CustomerNickname
)
select * from customer c
inner join address a on c.addressid = a.id
left join Nicknames cn on cn.originalname = c.name
性能将大大提高。在我的示例中(我没有在此处添加它,因为它太多表)查询从一分钟到一秒。此外,我注意到在原始查询的执行计划中有一个 SORT 运算符,其成本为 95%。这是哪里来的。
那么,两个问题:
为什么 With 这么快?
SORT运算符在执行计划中来自哪里。
【问题讨论】:
-
显示两者的执行计划以及 IO STATISTIC,然后更容易告诉您为什么一个比另一个更快或类似。因为通常归结为优化器如何减少在操作之间移动的数据。
-
@AllanS.Hansen,很遗憾我无法包含此内容,因为我无法再访问查询/数据库了。
标签: sql join common-table-expression with-statement