Teradata中CTE和Volatile表之间的差异

Teradata中CTE和Volatile表之间的差异,teradata,common-table-expression,Teradata,Common Table Expression,有谁能解释一下公共表表达式(CTE)表和易失性表之间的区别,在哪种情况下它们的性能更好 因为我们可以创建和删除易失性表作为SQL的一部分,而CTE在与易失性表相比时的性能会更好?它们几乎不可比较,因为它们是如此不同的对象 Volatile表是存储实际数据的实际表。它与常规表一样创建,但使用VOLATILE关键字(和其他gotcha)。会话结束时,它和其中存储的所有数据都会消失 另一方面,CTE更像一个视图。它不存储任何数据。你可以把它看作是一个象征,代表着它所定义的一切 例如: WITH CTE

有谁能解释一下公共表表达式(CTE)表和易失性表之间的区别,在哪种情况下它们的性能更好


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

它们几乎不可比较,因为它们是如此不同的对象

Volatile表是存储实际数据的实际表。它与常规表一样创建,但使用VOLATILE关键字(和其他gotcha)。会话结束时,它和其中存储的所有数据都会消失

另一方面,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”替换为挂在它旁边的select语句

所以,当你问哪个会表现更好。。。如果不知道您试图使用易失性表与CTE的确切情况,就无法回答这个问题


请记住,在查询易失性表之前,必须先创建并加载数据。CTE只是一个视图。。。因此,如果通过CTE进行查询的时间比创建、加载和查询volatile表的时间长,那么。。。跟着CTE走。如果您要在一个过程中反复访问同一组数据,并且需要一个临时存储该数据集的位置,那么使用volatile表

您好,内维尔,谢谢您的回复,您能告诉我,每当我们在SQL部分中引用CTE时,整个SQL都将被重新执行??几乎是的。同样,您可以将cte名称/别名细分为其中定义的任何内容,以便更好地理解它可能如何执行。它实际上只用于代码可读性和代码维护