SQL - CTE与VIEW

Bla*_*ckM 12 sql sql-server common-table-expression sql-view

我在这里的问题是,是什么区别CTEViewSQL.我的意思是在哪种情况下我应该使用CTE和哪种情况View.我知道两者都是某种虚拟表,但我不能区分它们的用途.

我在这里发现了一个类似的问题,但它是关于性能的.

更新1:

例如:我有一个填充了trades(tbl_trade)的数据库.我需要从3.5百万条记录中选择当前时间到当前时间打开的交易然后操纵数据(在虚拟表上使用不同的查询 - 这看起来像View).这里的问题是我想要一个SUM3-4列,然后我需要SUM一些列并创建一个带有结果的虚拟列(看起来像CTE).

例如:tbl_trade有列:profit,bonusexpenses.我需要的SUM(profit),SUM(bonus),SUM(expenses)和新的一列total,这将是等于SUM(profit)+ SUM(bonus)+ SUM(expenses).

PS.重新运行查询SUM不是一个选项,因为我已经有了结果.

提前致谢!

Anu*_*thi 20

视图可以编入索引,但CTE不能.所以这是一个重点.

CTE工作优秀,tree hierarchy即递归

此外,在处理复杂查询时请考虑视图.视图是数据库上的物理对象(但不是物理上存储数据),可以用于多个查询,从而提供灵活性和集中式方法.另一方面,CTE是临时的,将在使用时创建; 这就是为什么他们被称为inline view.

更新

根据您更新的问题,观点将是正确的选择.在CTE中处理350万行将在TempDb上产生额外的开销,这最终会降低SQL Server的性能.请记住,CTE是一次性视图,因此不存储统计信息,也无法创建索引.它就像一个子查询.

  • “与视图相比,CTE 在处理大量数据时效果不佳”,事实并非如此。除非视图已建立索引,否则 CTE 和视图之间没有区别。 (2认同)

Ion*_*nic 7

Plan Optimizer将对两者的解释完全相同.这只是一个不同的事情.

视图可以单独使用.它可以将复杂语句封装到更简单的查询中.

如果CTE主要用于编写更清晰的代码,例如程序/视图中的冗余较少.您也可以使用CTE进行递归查询,这是一个非常强大的功能!

我希望这有助于澄清事情.


zed*_*xus 5

选择CTE的原因之一:如果要进行分层查询,请使用CTE。可以递归调用CTE。视图不能递归调用。