【问题标题】:What's the benefit of doing temporary tables (#table) instead of persistent tables (table)?做临时表(#table)而不是持久表(table)有什么好处?
【发布时间】:2011-09-29 13:28:11
【问题描述】:

我能想到两个主要好处:

  1. 避免并发问题,如果您有许多进程创建/删除表,您可能会遇到麻烦,因为一个进程试图创建一个已经存在的表。
  2. 性能,我想创建临时表(带#)比常规表性能更高。

还有其他原因吗,我的任何原因是假的吗?

【问题讨论】:

    标签: sql-server-2005 temp-tables


    【解决方案1】:

    您无法比较临时表和持久表:

    • 持久表保存您的数据并且可以被任何进程使用。
    • 临时的被丢弃,#one 仅对该连接可见

    您可以使用临时表来后台处理结果以进行进一步处理等。

    两种类型的表在性能(无论哪种方式)上几乎没有区别。

    您不应该一直删除和创建表...任何依赖于此的应用程序都在做错事,尤其是太多的 SQL 调用。

    【讨论】:

    • 我知道并且我同意删除和创建持久表是错误的。我想知道是什么让#tables 与众不同。这是他们的主要区别范围......
    • Scope 并且它们在 tempdb 中。您的问题专门询问了并发性和性能,这两者都不是真的
    • 那你没有持久性,完全没有并发
    【解决方案2】:

    (1)临时表是在 SQL Server TEMPDB 数据库中创建的,因此需要更多的 IO 资源和锁定。表变量和派生表是在内存中创建的。

    (2)临时表通常对于可以使用并行处理的大量数据表现更好,而表变量最适合用于并行处理的少量数据(我使用 100 行或更少行的经验法则)不会显着提高性能。

    (3)您不能使用存储过程将数据插入到表变量或派生表中。例如,以下将起作用:INSERT INTO #MyTempTable EXEC dbo.GetPolicies_sp 而以下将产生错误:INSERT INTO @MyTableVariable EXEC dbo.GetPolicies_sp。

    (4)派生表只能从 SELECT 语句创建,但可以在 Insert、Update 或 Delete 语句中使用。

    (5) 按作用域持久性排序,临时表的作用域扩展最远,其次是表变量,最后是派生表。

    【讨论】:

    • 这只是从互联网上剪切和粘贴的,我不相信1)是正确的。
    • 对不起,这是从我的博客中剪切和粘贴的,这个百分比是正确的。你能给我任何与这个主题无关的观点吗?
    【解决方案3】:

    1) 表变量的生命周期仅在它运行的事务期间。如果我们先执行 DECLARE 语句,然后尝试将记录插入到 @temp 表变量中,我们会收到错误,因为表变量已经不存在了。如果我们在一个事务中声明并插入记录到@temp,然后尝试查询表,结果是一样的。如果您注意到,我们需要针对#temp 执行 DROP TABLE 语句。这是因为该表一直存在到会话结束或该表被删除为止。

    2) 表变量有一定的明确限制。

    -表变量不能有非聚集索引 - 不能在表变量中创建约束 -您不能在表变量列上创建默认值 - 不能针对表变量创建统计信息 - 与临时表的相似之处包括:

    与临时表的相似之处包括:

    -在 tempdb 中实例化 - 可以在表变量和临时表上创建聚集索引 - 两者都记录在事务日志中 - 就像使用临时表和常规表一样,用户可以对表变量执行所有数据修改语言 (DML) 查询:SELECT、INSERT、UPDATE 和 DELETE。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多