我的一个同事写了这样的观点:
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传递所有数据而不转换/过滤数据?
2条答案
按热度按时间wsxa1bj11#
原因是教授完全错了。SQLServer基本上将代码从CTEIN复制到最终查询。这允许优化器优化整个查询,通常是一种很好的方法。
有些数据库实现了CTE——要么一直如此,要么有时如此。在这些数据库中,cte多次引用可能更有效。或者可能不是——重要的优化信息丢失了(比如索引和统计信息)。
没有理由在sql server或任何其他数据库的查询中使用这些CTE。
CTE在sql server中对于结构化查询、减少代码重复和实现递归功能非常有用。然而,它们并不能改善表演效果。
rkttyhzu2#
cte可以用于递归地兼容数据集。更清楚地说,它暂时保存数据以便执行少量操作。
举几个例子:
递归比较
选择数据并根据所选数据进行更新