我的问题是 SQL 中CTE
和View
之间的区别是什么。我的意思是在哪种情况下我应该使用CTE
以及View
使用哪种情况。我知道两者都是某种虚拟表格,但我无法区分它们的用途。
我发现了一个类似的问题here,但它与性能有关。
更新1:
例如:我有一个充满交易的数据库(tbl_trade
)。我需要从3.5百万条记录中选择当前时间到当前时间打开的交易然后操纵数据(在虚拟表上使用不同的查询 - 这看起来像View)。这里的问题是我需要一个3-4列的SUM
然后我需要SUM
一些列并创建一个带有结果的虚拟列(看起来像CTE)。
例如:tbl_trade
包含列:profit
,bonus
和expenses
。
我需要SUM(profit)
,SUM(bonus)
,SUM(expenses)
和新列total
,它们将等于SUM(profit)
+ SUM(bonus)
+ SUM(expenses)
PS。重新运行SUM
的查询不是一个选项,因为我已经有了结果。
提前致谢!
答案 0 :(得分:19)
可以对视图编制索引,但CTE不能。所以这是一个重点。
CTE在tree hierarchy
上的工作非常出色,即递归
此外,在处理复杂查询时请考虑视图。视图是数据库上的物理对象(但不是物理上存储数据),可以用于多个查询,从而提供灵活性和集中式方法。另一方面,CTE是临时的,将在使用时创建;这就是为什么他们被称为inline view
。
<强>更新强>
根据您更新的问题,观点将是正确的选择。在CTE中处理350万行将在TempDb上产生额外的开销,这最终会降低SQL Server的性能。请记住,CTE是一次性视图,因此不存储统计信息,也无法创建索引。它就像一个子查询。
答案 1 :(得分:7)
Plan Optimizer将对两者的解释完全相同。这只是另一回事。
可以在其上使用视图。它可以将复杂语句封装到更简单的查询中。
CTE主要用于编写更清晰的代码,例如程序/视图中的冗余度较低。您也可以使用CTE进行递归查询,这是一个非常强大的功能!
我希望这有助于澄清事情。
答案 2 :(得分:4)
选择CTE的原因之一:如果您正在进行分层查询,请使用CTE。 CTE可以递归调用。视图不能递归调用。
答案 3 :(得分:0)
CTE 仅在查询运行时存在于内存中。查询运行后,丢弃CTE;除非我们再次定义它,否则它不能用于下一个 SQL 查询。尽管如此,在主查询和任何子查询中可能会多次引用同一个 CTE。
视图是存储的 SQL 查询,每次您在另一个查询中引用它时都会执行该查询。请注意,视图不存储特定查询的输出——它存储查询本身。
关于 SQL 视图要记住的关键是,与 CTE 相比,视图是数据库中的物理对象并存储在磁盘上。但是,视图仅存储查询,而不存储查询返回的数据。每次在查询中引用视图时都会计算数据。