sql—首先在cte中加载表,然后查询cte?

egmofgnx  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(350)

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

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传递所有数据而不转换/过滤数据?

wsxa1bj1

wsxa1bj11#

原因是教授完全错了。SQLServer基本上将代码从CTEIN复制到最终查询。这允许优化器优化整个查询,通常是一种很好的方法。
有些数据库实现了CTE——要么一直如此,要么有时如此。在这些数据库中,cte多次引用可能更有效。或者可能不是——重要的优化信息丢失了(比如索引和统计信息)。
没有理由在sql server或任何其他数据库的查询中使用这些CTE。
CTE在sql server中对于结构化查询、减少代码重复和实现递归功能非常有用。然而,它们并不能改善表演效果。

rkttyhzu

rkttyhzu2#

cte可以用于递归地兼容数据集。更清楚地说,它暂时保存数据以便执行少量操作。
举几个例子:
递归比较
选择数据并根据所选数据进行更新

相关问题