with
子句在 SQL Server 中如何工作?它真的给了我一些性能提升还是只是有助于制作更具可读性的脚本?
什么时候使用合适?with
在开始使用从句之前,您应该了解什么?
这是我正在谈论的一个例子:
http://www.dotnetspider.com/resources/33984-Use-With-Clause-Sql-Server.aspx
with
子句在 SQL Server 中如何工作?它真的给了我一些性能提升还是只是有助于制作更具可读性的脚本?
什么时候使用合适?with
在开始使用从句之前,您应该了解什么?
这是我正在谈论的一个例子:
http://www.dotnetspider.com/resources/33984-Use-With-Clause-Sql-Server.aspx
我不完全确定性能优势,但我认为在使用子查询导致子查询被执行多次的情况下,它肯定会有所帮助。
除此之外,它绝对可以使代码更具可读性,并且还可以用于多个子查询将是同一代码在不同位置的剪切和粘贴的情况。
使用前你应该知道什么?一个很大的缺点是,当您在视图中有 CTE 时,您无法在该视图上创建聚集索引。这可能是一个很大的痛苦,因为 SQL Server 没有物化视图,并且之前肯定已经咬过我了。
除非您使用递归能力,否则 aCTE
在性能方面并不比简单的内联视图更好。
它只是为您节省了一些打字时间。
优化器可以自由决定是否重新评估它,何时重用它,并且大多数情况下它决定重新评估:
WITH q (uuid) AS
(
SELECT NEWID()
)
SELECT *
FROM q
UNION ALL
SELECT *
FROM q
会给你两个不同的NEWIDs
。
请注意,其他引擎的行为可能不同。
PostgreSQL
,不同SQL Server
的是,物化了CTEs
。
Oracle
支持一个特殊的提示,/*+ MATERIALIZE */
告诉优化器它是否应该实现CTE
。
with
是 SQL 中的一个关键字,它只是将临时结果存储在临时表中。例子:
with a(--here a is the temporary table)
(id)(--id acts as colomn for table a )
as(select colomn_name from table_name )
select * from a