回答

收藏

SQL 2005 CTE与TEMP在其他表的连接中使用表的性能

技术问答 技术问答 133 人阅读 | 0 人回复 | 2023-09-13

我有一个复杂的查询,需要在后续查询中使用(其实是update语句)。我试过用。CTE与临时表相比。使用临时表法CTE性能可怕。大约15秒vs毫秒。为了简化测试,而不是添加到后续查询中CTE
4 e+ q# l3 r0 C$ z" z/ Temp表,我只从中选择*。在这种情况下,它们执行相同的操作。# y) N) u& O% l( i
我在后续查询中查看了这两种方法的执行计划,然后只需选择*。在使用简单的选择时,查询计划大致相同,但在使用后续选择中的连接时,查询计划是不同的。具体来说,用于创建和填写临时表的查询计划保持不变,用于创建和填写CTE查询计划部分在使用带连接的查询时会发生很大变化。
7 t7 [( {( J7 G  ~% A- X# N我的问题是,为什么要创建它CTE和填充CTE如何在查询计划中不使用temp在表的情况下改变其使用方式?在什么情况下?CTE性能会比临时表更好吗?8 v* g+ A" p( m/ U9 F# G
*请注意,我还使用了与临时表方法相同的表变量。% E, `( g6 w8 @5 l( a& z# b
谢谢
# L% P% C8 r0 h5 Y- q% G                                                               
1 N( o' t. E& \, G8 I* ~* c. y    解决方案:                                                                4 Q5 f; H* e8 g" N( R
                                                                你问一个复杂的问题,所以你会得到一个复杂的答案:这取决于情况。(我讨厌这样的回应)。
# E2 Z# V9 D. P4 M然而,严重的是,它与优化器如何选择数据计划(您已经知道)有关。临时表或变量类似于永久性结构,因为执行计划将执行与先填充结构相关的操作,然后在后续操作中使用结构。CTE不是临时表;是临时表。用于后续操作。CTE以前,不会计算CTE因此,使用会影响计划的优化。
0 u. B; N, q) F4 G& NCTE它是针对可重用性和维护性问题(不一定是性能)而实施的;然而,在许多情况下(如递归),它们的性能将优于传统的编码方法。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则