【问题标题】:Why are CTE faster than joins为什么 CTE 比连接快
【发布时间】: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


【解决方案1】:

查询将 varchar 连接到 varchar,因此将执行扫描操作。即使使用索引,这也相当昂贵。 Why does Mysql use a full table scan for table A when joining another table B? 我怀疑 CTE 在服务器的 RAM 中保留了一个动态集,因此速度要快得多。 (CTE 的整个结果集从磁盘加载到 RAM 中,未排序)。

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 2011-11-10
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2017-06-17
    • 2013-07-11
    相关资源
    最近更新 更多