当前位置: 首页 > 面试题库 >

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

季骏祥
2023-03-14
问题内容

我有一个复杂的查询,需要在后续查询中使用(实际上是update语句)。我已经尝试过使用CTE和临时表。与临时表方法相比,使用CTE的性能令人恐惧。大概是15秒vs毫秒。为了简化测试,而不是在后续查询中加入CTE
/ Temp表,我仅从中选择*。在这种情况下,它们执行相同的操作。

我已经在后续查询中查看了这两种方法的执行计划,然后只需选择*。使用简单选择时,查询计划大致相同,但是使用后续选择中的联接时,查询计划则不同。具体来说,用于创建和填充临时表的查询计划部分保持不变,而用于创建和填充CTE的查询计划部分随后在带有联接的查询中使用时会发生巨大变化。

我的问题是,为什么在创建CTE和填充CTE的查询计划中,如何在不使用temp表的情况下更改其使用方式呢?而且在什么情况下CTE会比临时表产生更好的性能?

*注意,我也使用了表变量,它与临时表方法相当。

谢谢


问题答案:

您在问一个复杂的问题,所以您会得到一个复杂的答案:这要视情况而定。(我讨厌这样的回应)。

但是,严重的是,它与优化器如何选择数据计划(您已经知道)有关。临时表或变量类似于永久性结构,因为执行计划将执行与首先填充该结构相关的操作,然后在后续操作中使用该结构。CTE不是临时表;它是临时表。在后续操作中使用CTE之前,不会计算CTE的使用情况,因此使用情况会影响计划的优化方式。

CTE是针对可重用性和维护性问题(不一定是性能)而实施的;但是,在许多情况下(例如递归),它们的性能将比传统编码方法更好。



 类似资料:
  • 问题内容: 开放赏金:好吧,老板需要答案,我需要加薪。这似乎不是一个冷缓存问题。 更新: 我没有遵循以下建议。客户统计数据如何得出一组有趣的数字。 #temp 与 @temp INSERT,DELETE和UPDATE语句的数量0对1 受INSERT,DELETE或UPDATE语句影响的行0 vs 7647 SELECT语句数0 vs 0 SELECT语句返回的行0 vs 0 交易数量0对1 最有趣

  • 问题内容: 数百万条记录的哪个更快:永久表 还是 临时表? 我只需要将其用于1500万条记录。处理完成后,我们将删除这些记录。 问题答案: 在您的情况下,我们使用称为临时表的永久表。这是大量进口的常用方法。实际上,我们通常使用两个登台表,一个带有原始数据,另一个带有清理后的数据,这使得研究提要中的问题变得更加容易(它们几乎总是我们客户发现向我们发送垃圾数​​据的新方式和多种方式的结果,但是我们必须

  • 我有以下表格: 以及: 以及: 数据库是PostgreSQL 如何订购table_1按日期列table_2和table_3联接表在Laravel? 这可以用雄辩来完成吗? 编辑:如果可以使用Elounce完成,则预期结果是表1模型的集合,表2和表3的关系由表2和表3中的日期列排序 编辑2: 表1的asc排序的预期结果。添加日期列是为了快速参考,不是必需的。

  • 您好,我有两个表,其中表1是针对产品的,表2是我想使用this SQL更新的类别,但不断出现语法错误 1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,在第4行的“WHERE EXISTS(SELECTproduct.local_delivery,product.none”附近使用正确的语法

  • 问题内容: 我需要多对多的hibernate mapping,需要3个联接。我试图找出没有像这样的中间实体的解决方案。 我的讲师和课程表之间的数据库之间存在多对多关系。一门课程可以由多位讲师授课,而一位讲师可以提供多门课程。 我有预先存储的课程。但是,我需要将课程分配给讲师。分配课程时,我还会存储该课程的容量。 我的数据库图: 我使用hibernate and spring。当课程分配任何讲师时,

  • 问题内容: 我想确认SQL查询 完全等同于FROM子句中的其他排列,例如 或者 只要橙子和奇异果之间的显式LEFT JOIN保持不变即可。根据我在各种文档中所阅读的内容,返回的集合应该完全相同。 我真的只关心查询的结果,而不关心它在实际数据库中的性能。(我使用的是PostgreSQL 8.3,而AFAIK不支持有关连接顺序的优化程序提示,它将尝试自动创建最佳查询计划)。 问题答案: 它是相同的,但