表与临时表性能

Man*_*980 10 sql t-sql sql-server sql-server-2008

数百万条记录的速度更快:永久表还是临时表?

我只能将其用于1500万条记录.处理完成后,我们删除这些记录.

HLG*_*GEM 15

在您的情况下,我们使用称为临时表的永久表.这是大量进口的常用方法.事实上,我们通常使用两个临时表,其中一个包含原始数据,另一个包含清理数据,这使得使用Feed的研究问题变得更容易(它们几乎总是由于我们的客户发现向我们发送垃圾数​​据的新方式和变化方式,但是我们必须能够证明这一点).另外,您可以避免出现问题,例如必须增加临时数据库或者为其他想要使用临时数据库的用户造成问题,但必须等待它为您增长等等.

您也可以使用SSIS并跳过临时表,但我发现无需重新加载50,000,000表即可返回并进行研究,这非常有帮助.

  • +1表示在发生错误时看到分阶段数据的额外好处 - "您也可以使用SSIS并跳过临时表,但我发现无需重新加载即可返回研究50,000,000桌子非常有帮助." (2认同)

Pet*_*hia 12

如果不使用tempdb,请确保您使用的数据库的恢复模型未设置为"完全".这将导致这些50M行插入的大量开销.

理想情况下,如果可能,您应该在RAID 10上使用临时数据库,简单恢复模型,并提前调整大小以便为所有操作提供足够的空间.关闭自动增长.

使用INSERT ... WITH(TABLOCK)来避免行级日志记录:

INSERT INTO StagingTable WITH (TABLOCK) (.....)
SELECT .....
Run Code Online (Sandbox Code Playgroud)

同样对于BULK INSERT.如果删除并重新创建,请插入之前创建聚簇索引.如果不能,请先插入一个表,然后从中插入具有正确聚类的另一个表,并截​​断第一个表.如果可能,请避免BULK INSERT上的小批量.仔细阅读BULK INSERT文档,因为您可以使用错误的选项破坏性能.

避免INSERT ... EXEC.记录每一行.

避免更新,除非您需要计算运行总计.通常,从一个表插入另一个表然后截断第一个表比在适当的位置更新更便宜.运行总计算是例外,因为它们可以使用UPDATE和变量来累积行之间的值.

避免除控制结构之外的任何表变量,因为它们会阻止并行化.不要将50M行表连接到表变量,而是使用临时表.

迭代时不要害怕游标.使用游标变量,并使用STATIC关键字对聚集索引前面的低基数列进行声明.使用它将大表切成更易于管理的块.

不要试图在任何一个声明中做太多.