我的一个同事写的观点是这样的:
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] 删除。
我来说两句