SQL Server 2008:大容量插入需要花费很长时间

SQL Server 2008:大容量插入需要花费很长时间,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个txt文件(以制表符分隔),它几乎有1200条记录。我正在执行一个大容量插入操作,以将数据从.txt文件获取到一个表中,该表(结构)已在数据库中创建。 我不知道为什么批量插入要花很长时间。关于在何处/何处/如何检查导致此操作花费永久时间的原因有何建议?谢谢我以前也这样做过,而且过去效果很好。有什么原因吗 BULK INSERT DataFromatltemp FROM '\\abcd\Admin\temp\Copyatltemp07.txt' WITH ( FIELDTERMI

我有一个txt文件(以制表符分隔),它几乎有1200条记录。我正在执行一个大容量插入操作,以将数据从.txt文件获取到一个表中,该表(结构)已在数据库中创建。 我不知道为什么批量插入要花很长时间。关于在何处/何处/如何检查导致此操作花费永久时间的原因有何建议?谢谢我以前也这样做过,而且过去效果很好。有什么原因吗

BULK INSERT DataFromatltemp
 FROM '\\abcd\Admin\temp\Copyatltemp07.txt'
 WITH
 (
  FIELDTERMINATOR = '\t',
  ROWTERMINATOR = '\n'
 )
GO

几乎所有与RDBMS和性能相关的内容都取决于一系列变量,但您可以先看一些提示:

  • 数据库:确保您的数据库使用简单恢复模式
  • 目标表:清除所有约束(包括检查、外键)
  • 目标表:删除所有索引
  • 目标表:确保未被任何其他进程锁定
  • 源文件:确保未被任何其他进程锁定
    我希望这些提示能有所帮助。

    此表上是否有任何已打开的事务?检查是否阻止SPID。您可能有一个长时间运行的查询阻止了您的插入。不,这个表是未动的,我创建它只是为了我的使用。谢谢。永远定义:)?也许您的数据库必须增长它的数据库文件,因为增长大小设置为1MB。检查数据库选项、文件组以及文件和日志文件的增长参数。是否可以将数据库置于单用户模式并运行插入。如果它运行得很快(或者至少不是永远),这是一个阻塞问题,因此您需要分析哪些其他进程可能会影响针对DB运行的插入。我还建议将文本文件放在本地共享上,可能是远程路径导致了一些延迟单恢复模式?清除约束并删除索引?为什么要删除所有索引来执行大容量插入?@Diego,我建议使用“简单恢复模式”是为了不记录大容量操作(这可能会导致不必要的磁盘开销)。在目标表上删除索引和外键的原因也是为了避免磁盘开销。也许我的建议不足以解决尼莫的问题,但你应该重新考虑把它们称为错误。这是错误的。不应在生产环境中使用单一恢复模型。清除所有约束并删除所有索引是一个糟糕的建议。插入时的数据完整性如何?没有提到删除和重新创建索引所需的时间?谢谢大家的建议。我找到了答案。我使用语法SELECT*从tblOld将DataFromatltemp表创建为tblNew,其中1=2意味着我从现有表复制了表的结构。然后我删除了旧表,但是新表“DataFromatltemp”对旧的已删除表(可能是?)有一些引用。当我删除“DataFromatltemp”并用其他名称重新创建它,然后运行大容量插入操作时,它工作正常。用了2秒钟就找到了我的1192条记录。再次感谢您抽出时间。我从你的讨论中学到了一些新东西@Diego,你是在暗示ETL暂存数据库中的表应该有外键和索引吗?这应该是常识,但如果您需要另一种意见,请使用msdn:“最佳实践……是在数据集市中禁用外键约束,并在加载过程中依靠ETL管理一致性。”[