SQL Server-有没有任何方法可以加快插入TVF中的表变量的速度?

SQL Server-有没有任何方法可以加快插入TVF中的表变量的速度?,sql,sql-server,sql-server-2012,table-variable,Sql,Sql Server,Sql Server 2012,Table Variable,我有一个大约在6秒钟内运行的查询。目前,它输出大约1500条记录,然后将这些记录插入到表变量中。插入表格需要7秒钟的时间 如果我对一个临时表做同样的尝试,插入只需要大约一秒钟 问题是查询被放置在TVF中(该函数有很多依赖项,因此将其转换为存储过程并不是最理想的解决方案),因此我不能使用临时表 有没有办法加快表变量的插入速度?我使用的是SQL Server 2012,因此内存优化的表变量也不是一个选项 如有任何建议,将不胜感激,提前感谢 编辑(其他信息): 我尝试了一种类似于图中所示的CTE方法,

我有一个大约在6秒钟内运行的查询。目前,它输出大约1500条记录,然后将这些记录插入到表变量中。插入表格需要7秒钟的时间

如果我对一个临时表做同样的尝试,插入只需要大约一秒钟

问题是查询被放置在TVF中(该函数有很多依赖项,因此将其转换为存储过程并不是最理想的解决方案),因此我不能使用临时表

有没有办法加快表变量的插入速度?我使用的是SQL Server 2012,因此内存优化的表变量也不是一个选项

如有任何建议,将不胜感激,提前感谢

编辑(其他信息):


我尝试了一种类似于图中所示的CTE方法,其开销类似于使用临时表方法,现在查询大约需要8秒钟。其中有三个表变量(每个变量的输出略有不同)组合在一起,查询总共需要24秒左右,这对于我们使用它的目的来说是可以接受的。

您可以在大容量插入之前停止索引创建,并在插入之后重新启用它们

-- Disable Index

ALTER INDEX [IXYourIndex] ON YourTable DISABLE
GO

-- Insert Data

-- Enable Index

ALTER INDEX [IXYourIndex] ON YourTable REBUILD
GO

考虑到存储结果表变量的最终目标是执行独立的查询并将它们连接起来以提供输出,以下使用CTE的方法的查询开销时间与临时表相同(甚至更快):

;WITH CTE1 as
(
    --Query 1 (took 6 seconds)
),
CTE2 as
(
    --Query 2 (took 6 seconds)
),
CTE3 as
(
    --Query 3 (took 8 seconds)
)
SELECT cte1.fielda, cte2.fieldb, cte3.fieldc, ...
FROM cte1
JOIN cte2 on cte1.fieldx = cte2.fieldx
JOIN cte3 on cte1.fieldx = cte3.fieldx

-- Total duration 20 seconds
-- Took 39 seconds previously

将数据插入一个大表比将相同的数据插入一个空表要花费更多的时间。目标表中有多少条记录?顺便说一句,什么是TVF?TVF=表值用户定义函数您的查询是一组1500个独立的
INSERT
语句,还是一个带有多个
值的
INSERT
子语句,或者其他什么?您是否考虑过大容量插入
?该查询获取大约1500条记录,这些记录是使用以下语法插入的:INSERT INTO@Table(Var1,Var2)SELECT Var1,Var2 from(…)查询您是如何测量SELECT/INSERT的时间的?您的TVF最终用于连接吗?你看过实际执行计划了吗?这个答案与这个问题有什么关系?@flickle因为每次
INSERT
操作都会更新索引,这可能会很昂贵。通过在插入时暂停索引操作,可以加快插入速度。插入完成后,可以异步执行索引重建操作。看起来他在将数据插入表变量时遇到了问题。表变量不能有索引。我遗漏了什么吗?@Flicker,表变量可以将索引作为主键My bad的一部分。感谢提供信息:)