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

Posted

技术标签:

【中文标题】SQL Server - 有啥方法可以加快插入 TVF 中的表变量的速度?【英文标题】:SQL Server - Is there any way to speed up inserts into a table variable in a TVF?SQL Server - 有什么方法可以加快插入 TVF 中的表变量的速度? 【发布时间】:2016-02-19 23:33:48 【问题描述】:

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

如果我对临时表尝试相同的操作,插入只需大约一秒钟。

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

有什么方法可以加快插入表变量的速度吗?我使用的是 SQL Server 2012,因此内存优化表变量也不是一个选项。

不胜感激,提前致谢!

编辑(附加信息):

我尝试了一种类似于here 所示的 CTE 方法,并且开销类似于使用临时表方法,现在查询大约需要 8 秒。这些表变量中的三个(每个给出的输出略有不同)如此组合,查询总共需要大约 24 秒,这对于我们使用它的用途来说是完全可以接受的。

【问题讨论】:

向大表中插入数据比在空表中插入相同的数据要花费更多的时间。您的目标表中有多少条记录?顺便说一句,什么是 TVF? TVF = 表值用户定义函数 您的查询是一组 1500 个单独的 INSERT 语句,还是一个带有多个 VALUES 子语句的单个 INSERT,还是其他?你考虑过BULK INSERT吗? 查询获取大约 1500 条记录,这些记录使用如下语法插入:INSERT INTO @Table(Var1, Var2) SELECT Var1, Var2 from ( ... ) query 你是如何测量选择/插入的时间的?您的 TVF 是否最终用于连接?您是否查看过实际的执行计划? 【参考方案1】:

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

-- Disable Index

ALTER INDEX [IXYourIndex] ON YourTable DISABLE
GO

-- Insert Data

-- Enable Index

ALTER INDEX [IXYourIndex] ON YourTable REBUILD
GO

【讨论】:

这个答案与问题有什么关系? @FLICKER 因为每个INSERT 操作都会更新索引,这可能会很昂贵。通过在插入时暂停索引操作可以加快插入速度。然后可以在插入完成后异步执行索引重建操作。 看起来他在将数据插入表变量时遇到问题。表变量不能有索引。我错过了什么吗? @Flicker ,表变量可以将索引作为主键的一部分 我的错。感谢您的信息:)【参考方案2】:

鉴于存储结果表变量的最终目标是执行隔离查询并将它们连接起来以提供输出,因此使用 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

【讨论】:

以上是关于SQL Server - 有啥方法可以加快插入 TVF 中的表变量的速度?的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2005 一个索引多个字段,字段的排列顺序对搜索有啥影响??

在 T-Sql 插入语句中使用 Row Constructor 语法有啥好处?

SQL Server 与 T-SQL 中的 Cast 和 Convert 函数有啥区别? [复制]

在 SQL Server 2005 的查询中与 T-SQL 进行数据比较

在 SQL Server(C# 客户端)中批量插入大量数据的最快方法是啥

sqlserver外键关系有啥用?