Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL效率-哪个更快?_Sql_Tsql_Performance - Fatal编程技术网

SQL效率-哪个更快?

SQL效率-哪个更快?,sql,tsql,performance,Sql,Tsql,Performance,我正在进行批量插入,但在插入到实际表之前,我需要做一些检查。目前我正在插入一个临时表,但我刚刚看到可以声明表。所以我的问题是-哪个更快?创建或声明。该表将进行多次选择,并将包含大约200000条记录 DECLARE @tbl1 TABLE ( col1 VARCHAR(10) ) 或 最后,是否可以更改已声明的表 感谢您的支持。@tbl表变量存储在内存中,但如果内存压力很高,它们会被释放 根据设计,@tblvars上不允许使用DDL(无索引、统计等) 常规表是在所连接的数据库中创建的 就性能而

我正在进行批量插入,但在插入到实际表之前,我需要做一些检查。目前我正在插入一个临时表,但我刚刚看到可以声明表。所以我的问题是-哪个更快?创建或声明。该表将进行多次选择,并将包含大约200000条记录

DECLARE @tbl1 TABLE
(
col1 VARCHAR(10)
)

最后,是否可以更改已声明的表


感谢您的支持。

@tbl
表变量存储在内存中,但如果内存压力很高,它们会被释放

根据设计,
@tbl
vars上不允许使用DDL(无索引、统计等)

常规表是在所连接的数据库中创建的

就性能而言,这完全取决于SQL Server的配置方式以及分配给tempdb的资源数量

一般来说,在处理大量记录时,我会选择一个每个连接的临时表,如
#table
,它允许对表变量进行统计和丰富的索引

有时,有一个永久的临时表可能是有意义的,但是您必须特别小心与这种解决方案的并发性


在这里,您可以得到明确答案的唯一方法是在您的环境中进行测量(注意,生产配置通常与开发不同,请注意)

@tbl
表变量存储在内存中,但如果内存压力很高,它们就会被释放

根据设计,
@tbl
vars上不允许使用DDL(无索引、统计等)

常规表是在所连接的数据库中创建的

就性能而言,这完全取决于SQL Server的配置方式以及分配给tempdb的资源数量

一般来说,在处理大量记录时,我会选择一个每个连接的临时表,如
#table
,它允许对表变量进行统计和丰富的索引

有时,有一个永久的临时表可能是有意义的,但是您必须特别小心与这种解决方案的并发性


您在这里获得最终答案的唯一方法是在您的环境中进行测量(请注意,生产的配置通常与开发不同,请注意)

使用大型样本数据集创建两个样本脚本,并使用执行计划。我唯一建议的是,当表变量超出范围时,可以很容易地管理它们,因为它们会被清除,但是永久性的临时表只需要创建一次。创建两个带有大样本数据集的样本脚本,并使用执行计划。我唯一建议的是,当表变量超出范围时,可以很容易地管理它们,但永久性的临时表只需要创建一次。我相当肯定,表变量总是在tempdb上执行I/O。嗯,我读到的大多数资料都说明了这一点——不确定它是否在SQL 2008中发生了更改。@Adam看到了我发布的链接,它来自SQL Server存储团队。表变量总是在tempdb上执行IO,但如果内存压力低,可能会在内存中执行填充。他们永远不会在您当前的数据库上执行IO。那是一本有趣的书。这是我似乎总是不得不在谷歌上提醒自己的行为是什么,所以当我不得不更改表时,是否不可能使用DECLARE。我相当肯定,表变量总是在tempdb上执行I/O。嗯,我读到的大多数资料都说明了这一点——不确定它是否在SQL 2008中发生了更改。@Adam看到了我发布的链接,它来自SQL Server存储团队。表变量总是在tempdb上执行IO,但如果内存压力低,可能会在内存中执行填充。他们永远不会在您当前的数据库上执行IO。那是一本有趣的书。这是我似乎总是不得不谷歌提醒自己的行为是什么,所以当我不得不改变表是不可能使用声明。
CREATE TABLE tbl1
(
col1 VARCHAR(10)
)