【问题标题】:Diff between CTE and Volatile tables in TeradataTeradata 中 CTE 表和易失性表之间的差异
【发布时间】:2016-05-01 05:08:29
【问题描述】:

谁能解释一下 Common Table Expression (CTE)Tables 和 Volatile 表之间的区别,它们在哪种情况下表现更好。

因为我们可以创建和删除易失性表作为 SQL 的一部分,与易失性表相比,CTE 的性能究竟会更好吗?

【问题讨论】:

标签: teradata common-table-expression


【解决方案1】:

它们几乎没有可比性,因为它们是如此不同的对象。

易失性表是存储实际数据的实际表。它像普通表一样创建,但使用 VOLATILE 关键字(和其他陷阱)。当会话结束时,它和存储在其中的所有数据都会消失。

另一方面,CTE 更像是视图。它不存储任何数据。您可以将其视为代表其中定义的任何内容的符号。

例如:

WITH CTE myCTE (SELECT * FROM sometable WHERE id=3)
SELECT * 
FROM myCTE
WHERE myCTE.name in (SELECT max(name) FROM myCTE);

和以下一样:

WITH CTE myCTE ()
SELECT * 
FROM (SELECT * FROM sometable WHERE id=3) myCTE
WHERE myCTE.name in (SELECT max(name) FROM (SELECT * FROM sometable WHERE id=3) myCTE);

我们只是将符号“myCTE”替换为悬挂在其旁边的选择语句。

因此,当您询问哪个性能更好时...如果不知道您尝试使用易失性表与 CTE 的确切情况,就无法回答这个问题。

请记住,Volatile 表必须在被查询之前创建并加载数据。 CTE 只是一个视图……因此,如果通过 CTE 查询所需的时间比创建、加载和查询 volatile 表所需的时间长,那么……请使用 CTE。如果您要在一个过程中一遍又一遍地重复访问同一组数据,并且您需要一个临时存储该数据集的地方,那么请使用 volatile 表。

【讨论】:

  • 嗨,Nevill,感谢您的回复,您能否澄清一下,每当我们在 SQL 部分中引用 CTE 时,整个 SQL 都会重新执行??
  • 差不多,是的。同样,您可以将 cte 名称/别名替换为其中定义的任何内容,以更好地了解它的执行方式。真的只是为了代码可读性和代码维护。
猜你喜欢
  • 2016-01-18
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2016-02-22
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多