SQL Server 内联查询是不是在后台创建临时表

Posted

技术标签:

【中文标题】SQL Server 内联查询是不是在后台创建临时表【英文标题】:Do SQL Server inline queries create temp tables under the hoodSQL Server 内联查询是否在后台创建临时表 【发布时间】:2017-03-21 03:13:45 【问题描述】:

最近我遇到了一个问题,即在执行动态 SELECT INTO #TempTable ... 查询时遇到了 8060 行限制。该临时表又用于更大的 JOIN 和 PIVOT 操作。当我遇到行限制问题时,我在较大的查询中添加了 SELECT 查询作为内联查询(两者都是动态 SQL 查询),但仍然遇到 8060 行限制的问题,所以想知道内联查询是否会创建临时或其他类型的执行期间的表。

我看到的错误如下所示,

"无法创建大于允许的大小 XXXX 的行 最大行大小为 8060"

【问题讨论】:

【参考方案1】:

SQL Server 可以使用一种称为Spooling 的技术,其中它在tempdb 中创建一个类似于临时表的结构。

它会这样做,一般来说,它有一个需要多次使用的中间结果,并且它认为存储和检索此数据的成本将低于重新生成中间结果的成本.

可能能够通过为您的查询生成Estimated Execution Plan 来识别正在发生这种情况。遗憾的是,无法保证估计的计划与查询生成的实际计划相同。

【讨论】:

它是假脱机,可悲的是它无法关闭:(【参考方案2】:

大多数情况下,这清楚地表明您的数据库/表设计有问题。

您可以将您尝试运行的查询添加到您的帖子中吗?

More information about this particular error can also be found here.

【讨论】:

不一定是数据库或表设计有问题的明确指针。这通常是一个明确的指针,表明您的查询可以改进。检查@Damien_The_Unbeliever 的答案。 您是正确的,问题很可能存在于查询本身中。但我指的是在我所见的大多数情况下,查询变得臃肿和混乱,因为数据库开发人员需要使用奇怪而复杂的构造来弥补整个数据库的次优表设计(s)。因为 OP 指的是大型连接和透视操作,但没有包含实际查询,所以我假设这里就是这种情况。 另外,我不认为您在执行计划中看到的假脱机操作与 OP 得到的错误有任何关系。 OP 应该发布实际查询,以便我们给出充分的答案,而不是让我们所有人都猜测可能导致此问题的原因。 虽然我很欣赏您对此的想法,但由于我的工作性质,我无法发布查询,但只能说明生成的动态列报告的一部分,因此它与基础表或设计。

以上是关于SQL Server 内联查询是不是在后台创建临时表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server进阶表表达式

sql with(允许数据库将查询作为内联视图/临时表进行处理

在SQL Server的子查询视图内联函数等数据库对象中,不应该单独使用ORDER BY语句

sqlserver 创建视图失败,原因:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

sql server 临时表

如何在 SQL SERVER 中将内联 SQL 查询转换为 JOINS 以减少加载时间