【问题标题】:Indexes on a table database表数据库上的索引
【发布时间】:2011-05-06 11:06:02
【问题描述】:

我必须在 SQL Server 数据库表中插入 10 亿个代码。 我将为此使用 BULK INSERT。 我的问题是:我应该在插入数据之前还是之后创建索引?我需要最快的选择

【问题讨论】:

  • 为什么不用 100'000 个代码对这两个选项进行基准测试?

标签: sql sql-server indexing


【解决方案1】:

10 亿条记录到一个表中?哎哟。如果您正在处理该级别的数据量并且您必须在论坛上提出这个问题,那么您可能会超出您的元素。您应该在插入后创建索引,但确保在插入后更新表上的统计信息。如果统计信息不是最新的,该索引将对您不利。

【讨论】:

  • “如果您正在处理该级别的数据量并且您必须在论坛上提出这个问题”,这是真的。具有这么多记录的数据库很难正常运行,只有经验丰富的专家才能真正掌握知识。如果这个人没有在某个地方与这种类型的专家一起学习,那么他几乎肯定是在他的头上。
【解决方案2】:

当插入期间表上有索引时,服务器将需要不断地重新排序/分页表以使索引保持最新。如果您删除索引,它可以只添加行而无需担心,然后在您重新创建索引时一次性构建所有索引。

了解Bulk Insert

另请参阅:

bulk insert with or without index

【讨论】:

    【解决方案3】:

    之前创建索引。 BULK INSERT 负责优化索引。

    edit:这似乎只有在输入数据按索引排序时才成立。来自http://msdn.microsoft.com/en-us/library/ms188365.aspx

    ORDER ( { 列 [ ASC | DESC ] } [ ,... n])

    指定数据中的数据如何 文件已排序。批量导入 如果数据可以提高性能 被导入是根据排序的 表上的聚集索引,如果 任何

    【讨论】:

    • 真的吗?在 MsSQL 服务器上预先创建索引是最佳的吗?我遇到的其他引擎证明完全相反。你有任何信息说明为什么会这样吗?我非常有兴趣了解内部结构。
    • 扩展我之前的评论。如果您想将大量数据插入 Postgres,请确保执行以下操作:1. 如果表不存在,则在插入发生的同一事务中创建表(使用 COPY)并且 2. 在之后创建索引数据已插入。在与插入相同的事务中创建表确保引擎将跳过预写日志。任何状况之下;如果表存在与否,您将等到插入后创建索引。
    • 我以为我在文档中读过它。我刚刚重新检查,它似乎只适用于一种特殊情况:批量插入有一个“ORDER”选项,如果输入数据按索引排序,它将提高性能。
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多