WITH就像一个临时表或只是一个别名

时间:2014-08-15 02:28:19

标签: sql-server common-table-expression query-performance

我有一个UNION ALL查询,两个查询有很多共同之处。我正在使用WITH来处理公共部分(区别在于第一个与一个表连接,第二个查询与另一个表连接 - 我需要结果的联合。)

我的问题是:

  • 使用WITH(就像临时表一样)是否存在性能差异?
  • WITH只是一个别名,它将被计算两次?
  • SQL Server足够聪明,可以感知两个查询中有很多常见内容,使用WITH会不会有任何区别?
  • 如果不是WITH而是使用了表值函数或视图,那会更好吗?

1 个答案:

答案 0 :(得分:0)

这是我对公共表表达式(CTE)与DB2上的临时表的关系的理解。 CTE是使用WITH关键字创建的。

当您使用CTE时,选择运行时可能无法完全实现。 DB2可以自由地优化表的哪一部分实现以运行查询。

我发现临时表通常更快。我怀疑这是因为我可以在临时表上添加索引。这也减少了最终查询的大小,因此优化器可以更轻松地找到良好的执行路径。

如果我有点懒,我会使用CTE,并且不想创建临时表,或者我想利用它没有实现整个表的事实。

当我使用临时表时,我会小心添加限定符,这样我就不会构建一个大于必要的表。