【问题标题】:Index and Insert Operations索引和插入操作
【发布时间】:2009-11-13 23:27:11
【问题描述】:

我有一份工作需要处理大约 10 万条记录。此作业截断目标表,然后在这些表中“一次一个”插入所有记录,而不是批量插入。

我需要知道插入这些记录时索引将如何产生影响?在工作期间创建索引的成本是否会超过使用它们的好处?

在这种情况下是否有任何最佳实践或优化提示?

【问题讨论】:

    标签: sql sql-server sql-server-2005 performance


    【解决方案1】:

    这类问题只能逐案回答。但是,以下一般注意事项可能会有所帮助:

    • 除非插入的某些数据来自其他查找等,否则在 INSERT 期间没有索引是有用的(即对于这个操作,索引当然可能对其他会话/用户下的其他查询有用......)
    • [另一方面...] 表上存在索引会减慢 INSERT(或更一般的 UPDATE 或 DELETE)操作
    • 添加新记录的顺序可能很重要
    • 如果表是聚集索引,需要特别注意
    • 决定是在 INSERT 操作之前删除索引(全部还是部分),很大程度上取决于记录的相对数量(添加还是容易插入)
    • INSERT 操作通常会引入索引碎片,这本身就是一个额外的诱因,可能会在数据加载之前删除索引,然后重建它(它们)。

    一般来说,添加 100,000 条记录对于 MS-SQL 来说是“小土豆”,除非有特殊情况,例如异常宽的记录,或者存在许多(并且可能定义不明确的)各种性质的约束,SQL Server 应该在大多数硬件配置中,只需几分钟而不是几小时即可处理此负载。

    【讨论】:

      【解决方案2】:

      这个问题的答案非常不同,具体取决于您所讨论的索引是否是集群的。聚集索引强制 SQL Server 以排序顺序存储数据,因此,如果您尝试插入一条未排序到聚集索引末尾底部的记录,您的插入可能会导致您的数据显着重新洗牌,因为您的许多记录被移动以便为您的新记录腾出空间。

      非聚集索引没有这个问题;服务器所要做的就是跟踪新记录的存储位置。因此,如果您的索引是聚集索引(大多数聚集索引是主键,但这不是必需的;运行“sp_helpindex [TABLENAME]”以确定),您几乎肯定最好在所有插入后添加索引完成。

      关于非聚集索引上的插入性能,我实际上无法告诉你;以我的经验,放缓还不足以担心。在这种情况下,一次执行所有插入的开销将大大超过索引开销。

      编辑:由于您可以截断整个表,就性能而言,您几乎肯定最好在执行所有插入之前删除(或 NOCHECKing)您的索引和约束,然后将它们添加回结尾。

      【讨论】:

        【解决方案3】:

        insert 语句是唯一不能直接从索引中受益的操作,因为它没有 where 子句。

        索引表越多执行越慢。

        如果表上有索引,数据库必须确保通过这些索引也可以找到新条目。出于这个原因,它必须将新条目添加到该表上的每个索引中。因此,索引的数量是插入语句成本的乘数。

        Check here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-26
          • 2012-06-22
          • 1970-01-01
          • 1970-01-01
          • 2019-06-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多