先在 CTE 中加载表,然后查询 CTE?

亨罗夫

我的一个同事写的观点是这样的:

Create view myview as 

    with CTE as (
    select * from tableA)
    ,CTE2 as (
    select * from TableB)
    
    Select * from CTE
    UNION ALL
    Select * from CTE2

他说他的教授教他这个是因为“东西会被加载到 RAM 中,而且速度要快得多”。不幸的是,教授不再能够解释这一点。我认为以下工作至少同样好,并避免了代码中不必要的复杂性。

Create view myview as
    Select * from TableA
    UNION ALL
    Select * from TableB

我错过了什么吗?我知道那个教授,他非常好,所以我假设他有很好的理由教他的学生写出这样的所有查询。我在这里错过了什么吗?编写通过 CTE 传递所有数据而不对其进行转换/过滤的查询的充分理由是什么?

戈登·利诺夫

原因是教授完全错了。SQL Server 基本上将代码从 CTE 复制到最终查询中。这允许优化器优化整个查询,并且通常是一种很好的方法。

一些数据库实现了 CTE——无论是一直还是有时。在这些数据库中,一个 CTE 引用不止一次可能更有效。也可能不是——重要的优化信息丢失了(例如索引和统计信息)。

对于 SQL Server 或任何其他数据库,没有理由在此查询中使用这些 CTE。

CTE 在 SQL Server 中对于构造查询、减少代码重复和实现递归功能非常有用。但是,它们并没有提供性能方面的改进。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章