首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL Server 2017插入到临时表变量的速度非常慢,但不是2014年

基础概念

SQL Server中的临时表分为两种类型:本地临时表(以单个#开头)和全局临时表(以双##开头)。临时表变量(如@table_variable)则是一种在内存中存储数据的特殊类型,它们在会话范围内存在,并且不会像物理表那样产生磁盘I/O。

相关优势

  1. 内存使用:临时表变量通常存储在内存中,因此访问速度较快。
  2. 生命周期:临时表变量的生命周期仅限于当前会话,这使得它们在处理临时数据时更加安全。
  3. 锁定和并发:由于临时表变量不会像物理表那样产生锁定,因此在高并发环境下性能更好。

类型

  • 本地临时表:仅在创建它们的会话中可见,会话结束时自动删除。
  • 全局临时表:在所有会话中可见,但只有创建它们的会话和当前正在访问它们的会话才能看到它们,最后一个访问它们的会话结束后自动删除。
  • 临时表变量:在内存中存储,生命周期仅限于当前会话。

应用场景

临时表和临时表变量常用于以下场景:

  • 存储中间结果:在执行复杂查询时,可以将中间结果存储在临时表或临时表变量中,以便后续处理。
  • 批量操作:在进行大量数据插入、更新或删除操作时,可以使用临时表来提高性能。
  • 会话级数据存储:在需要存储会话级数据时,可以使用临时表变量。

问题分析

SQL Server 2017插入到临时表变量的速度非常慢,可能是由于以下原因:

  1. 内存限制:如果系统内存不足,临时表变量可能无法充分利用内存,导致性能下降。
  2. 数据量过大:如果插入的数据量非常大,临时表变量的性能可能会受到影响。
  3. 索引和统计信息:临时表变量不会像物理表那样自动创建索引和统计信息,这可能导致查询性能下降。
  4. SQL Server配置:SQL Server的配置参数可能会影响临时表变量的性能。

解决方法

  1. 增加内存:确保SQL Server有足够的内存可用。
  2. 分批插入:如果数据量过大,可以尝试分批插入数据。
  3. 手动创建索引:对于临时表变量,可以手动创建索引以提高查询性能。
  4. 优化SQL Server配置:调整SQL Server的配置参数,以优化临时表变量的性能。

示例代码

代码语言:txt
复制
-- 创建临时表变量
DECLARE @table_variable TABLE (
    ID INT PRIMARY KEY,
    Name NVARCHAR(100)
);

-- 分批插入数据
DECLARE @BatchSize INT = 1000;
DECLARE @Offset INT = 0;

WHILE (1=1)
BEGIN
    INSERT INTO @table_variable (ID, Name)
    SELECT TOP (@BatchSize) ID, Name
    FROM SourceTable
    WHERE ID > @Offset
    ORDER BY ID;

    SET @Offset = SCOPE_IDENTITY();

    IF @@ROWCOUNT < @BatchSize BREAK;
END

参考链接

通过以上方法,可以有效解决SQL Server 2017插入到临时表变量速度慢的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL 处理海量数据时一些优化查询速度方法

在参与实际项目中,当 MySQL 数据量达到百万级时,普通 SQL 查询效率呈直线下降,而且如果 where 中查询条件较多时,其查询速度无法容忍。...查询速度原因 1、没有索引或者没有用到索引(这是查询最常见问题,是程序设计缺陷) 2、I/O 吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。...因为 SQL 只有在运行时才会解析局部变量优化程序不能将访问计划选择运行时;它必须在编译时进行选择。然而,如果在编译时简历访问计划,变量值还是未知,因而无法作为索引选择输入项。...如果变量包含大量数据,请注意索引非常有限(只有主键索引)。 21、避免频繁创建和删除临时,以减少系统资源消耗。...23、在新建临时时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统资源,应先 create

2.4K50

52条SQL语句性能优化

存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29,下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...37,避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。...对于支持事务InnoDB类型来说,影响速度主要原因是AUTOCOMMIT默认设置是打开,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度

80210
  • 52 条 SQL 语句性能优化策略

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29、下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...37、避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。...49、选择合适存储引擎: myisam:应用时以读和插入操作为主,只有少量更新和删除,并且对事务完整性,并发性要求不是很高

    64260

    Mysql性能优化一:SQL语句性能优化

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29,下列SQL条件语句中列都建有恰当索引,执行速度非常:  SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒)  SELECT...37,避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。...对于支持事务InnoDB类型来说,影响速度主要原因是AUTOCOMMIT默认设置是打开,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度

    1.9K21

    实用排坑帖:SQL语句性能优化操作策略大全

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29、下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...37、避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。...对于支持事务InnoDB类型来说,影响速度主要原因是AUTOCOMMIT默认设置是打开,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度

    85121

    后端程序员必备:SQL高性能优化方案!50条优化,建议马上收藏!

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中 SQL 语句,是控制流语言集合,速度当然快。...29、下列 SQL 条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no, 1, 4) = '5378' --...37、避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替。...大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在 TempDb 数据库中,因此临时操作需要跨数据库通信,速度自然。...对于支持事务 InnoDB类 型来说,影响速度主要原因是 AUTOCOMMIT 默认设置是打开,而且程序没有显式调用 BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度

    1.1K01

    52 条 SQL 语句性能优化策略,建议收藏!

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29 下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...37 避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。...对于支持事务InnoDB类型来说,影响速度主要原因是AUTOCOMMIT默认设置是打开,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度

    92900

    52 条SQL语句性能优化策略

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29 下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...37 避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。...对于支持事务InnoDB类型来说,影响速度主要原因是AUTOCOMMIT默认设置是打开,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度

    55430

    SQL优化

    常见简化规则如下:不要有超过5个以上连接(JOIN),考虑使用临时变量存放中间结果。少用子查询,视图嵌套不要过深,一般视图嵌套不要超过2个为宜。...存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。...下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然

    69920

    mysql数据库优化大全

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29,下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...37,避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...7.如果在 where 子句中使用参数,也会导致全扫描。因为SQL只有在运行时才会解析局部变量优化程序不能将访问计划选择推迟到运行时;它必须在编译时进行选择。...如果变量包含大量数据,请注意索引非常有限(只有主键索引)。 21.避免频繁创建和删除临时,以减少系统资源消耗。

    1.1K20

    分析MySQL数据库各项优化指标

    默认情况下,MySQL数据库并不启动查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启查询日志会或多或少带来一定性能影响。...其他需注意是在编程时,由于用MySQL语句调用数据库时,在每次之执行语句前,会做一个临时变量用来打开数据库,所以你在使用MySQL语句时候,记得在每次调用完MySQL之后就关闭MySQL临时变量。...因此,MySQL数据库对临时配置是,只有256MB以下临时才能全部放内存,超过就会用到硬盘临时,可以通过使用两个命令查看临时相关信息。...盲目的增加Sort_buffer_size并不一定能提高速度。...这个时候就要分析相应SQL语句了,比如从查询日志中找到SQL,然后进行优化与分析。

    1.5K20

    SQL优化意义是什么?你用过哪些优化方式

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29,下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...37,避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。...如果变量包含大量数据,请注意索引非常有限(只有主键索引)。 21.避免频繁创建和删除临时,以减少系统资源消耗。

    1.4K20

    面试官:熟悉SQL优化吗?我只知道20种,其实远不止...

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中 SQL 语句,是控制流语言集合,速度当然快。...29、下列 SQL 条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no, 1, 4) = '5378' --13...37、避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替。...大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在 TempDb 数据库中,因此临时操作需要跨数据库通信,速度自然。...对于支持事务 InnoDB类 型来说,影响速度主要原因是 AUTOCOMMIT 默认设置是打开,而且程序没有显式调用 BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度

    49750

    MySQL性能优化总结

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29,下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒) SELECT...37,避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。...如果变量包含大量数据,请注意索引非常有限(只有主键索引)。 21.避免频繁创建和删除临时,以减少系统资源消耗。

    65210

    两则数据库优化分析与解决

    我们建议方法是,查询和插入要分开,并且ORACLE SQL SERVER ,PG都有良好临时机制,尤其是SESSION 基别的。...MYSQL 也是有临时大概率是不使用,这与他使用方式有关,当然要使用看具体情况。...,则插入就会被锁,所以造成经常出现无法忍受问题,尤其是循环次数很多情况下。...这里给出解决方法 1 采用 ORACLE 临时 SESSION级别的,那每次将数据先插入临时,然后在将临时数据 insert into 最终中,这样降低insert into select...,就是不要他插入,防止扣款或放款重复,问题是如果批量插入,一条插不进去,整体都ROLLBACK ,这可不是一件不美好事情,而后期程序员改为一条条数据插入,那其实是一件更不美好事情,低效,对数据库压力明显增高

    72910

    必会这15个Mysql优化问题,面试官、DBA都要高看你一眼,速度收藏

    就可以查询记录SQL 使用工具 在勇哥给大家开发软件中,也提供了图形化界面来一键帮助大家快速实现上述功能。...下载SQL日志文件本地 最后关闭数据库Mysql查询 着重注意:生产SQL最好在使用时,才去开启,用完后关闭,避免日志记录影响业务性能 SET GLOBAL slow_query_log...存储文件大小多2.8M左右,因此在读取int类型存储时文件大,读速度相比读tinyint。...内部临时SQL 语句优化过程中非常重要,MySQL 中很多操作都要依赖于内部临时来进行优化操作。...索引优化 1、合理添加索引列 大多数人对应索引理解层次都在“索引可以加快查询速度”,然而这句话勇哥要补充下半句“索引可以加快查询速度,也可以减慢数据插入或修改速度”。

    68730

    SQL Server优化50法

    28、如果要插入二进制值Image列,使用存储过程,千万不要用内嵌INsert来插入(不知JAVA是否)。...30、在必要时对全局或者局部临时创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量资源。他创建同是实际一样。 31、不要建没有作用事务例如产生报表时,浪费资源。...这样的话如果是经常要用临时请使用实,或者临时变量。 37、一般在GROUP BY 和HAVING字句之前就能剔除多余行,所以尽量不要用它们来做剔除行工作。...,Table 类型变量临时好。...存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。

    2.1K70

    84-我对网传一些看法

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中 SQL 语句,是控制流语言集合,速度当然快。...tiger: 根据实际需要重建索引, 大部分索引并不需要定期重建; 重建索引不需要重新编译存储过程. 29、下列 SQL 条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM...37、避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替。...大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在 TempDb 数据库中,因此临时操作需要跨数据库通信,速度自然。...对于支持事务 InnoDB类 型来说,影响速度主要原因是 AUTOCOMMIT 默认设置是打开,而且程序没有显式调用 BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度

    54020

    Java面试手册:数据库 ①

    尽量用join代替子查询: 虽然 Join 性能并不佳,和子查询相比有非常性能优势。...避免使用临时: 除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替; 大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...,速度自然。..., Supplier FROM product 用变量代替临时: 如果变量包含大量数据,请注意索引非常有限(只有主键索引)。...在新建临时时,如果一次性插入数据量很大,可以使用 select into 代替 create table,避免造成大量log,以提高速度; 如果数据量不大,为了缓和系统资源,应先create table

    69920

    DataGrip激活码,亲测有效。DataGrip2021.2

    存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29、下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒)...37、避免使用临时,除非却有需要,否则应尽量避免使用临时,相反,可以使用变量代替;大多数时候(99%),变量驻扎在内存中,因此速度临时更快,临时驻扎在TempDb数据库中,因此临时操作需要跨数据库通信...存储过程是编译好、优化过、并且被组织一个执行规划里、且存储在数据库中SQL语句,是控制流语言集合,速度当然快。反复执行动态SQL,可以使用临时存储过程,该过程(临时)被放在Tempdb中。...29、下列SQL条件语句中列都建有恰当索引,执行速度非常: SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒)

    30.1K20
    领券