2010-10-28 45 views
7

有关索引大量数据的性能问题。我有一张大表(约3000万行),其中4列索引,以便快速搜索。目前我设置了索引(索引?),然后导入我的数据。这大概需要4个小时,这取决于数据库服务器的速度。首先导入数据,然后执行索引构建会更快/更高效吗?TSql,在数据输入之前或之后建立索引

回答

8

我试图通过说,它会可能“先索引,插入后”会比“插入第一,索引之后”慢,你插入记录到表中聚簇索引,但不能按该索引的自然顺序插入记录。原因在于对于每个插入,数据行本身必须在磁盘上进行排序。

作为示例,请考虑一个uniqueidentifier字段上带有聚集主键的表。 guid的(几乎)随机性意味着可能会在数据的顶部添加一行,导致当前页面中的所有数据都被混洗(也可能是较低页面中的数据),但下一行添加在底部。如果集群开启,比如说一个日期时间列,并且您恰好按照日期顺序添加行,那么记录自然会以正确的顺序插入磁盘,并且不需要昂贵的数据排序/混排操作。

我会支持温斯顿史密斯的“取决于”的答案,但建议您的聚集索引可能是确定哪种策略对当前情况更快的重要因素。你甚至可以尝试没有聚集索引,看看会发生什么。让我知道?

+0

+1了解更多细节和上下文。 – 2010-10-28 13:58:45

+0

正在插入的数据是非常不顺序的,插入后做索引要快得多。感谢您的解释。 – John 2010-11-02 13:45:13

3

索引就位时插入数据会导致DBMS在每行之后更新它们。因此,首先插入数据并在之后创建索引通常会更快。特别是如果有这么多的数据。

(然而,总是有可能出现特殊情况可能会导致不同的性能特征。尝试是肯定知道的唯一途径。)

+0

** @ af **基于什么假设是泛化?最近我尝试了两种方法,发现使用索引进行批量插入要比放下并重新创建要快得多,因为在数百万行的数据集上花费了大约20分钟的时间。 – 2010-10-28 12:59:31

+0

是的,这完全取决于特定的数据,行的顺序和索引。尽管DBMS必须在逐行插入东西时做更多的工作,但如果所有东西都按正确的顺序进行,DBMS可以只写东西,并且永远不会重新排序数据或平衡索引数据结构。这些情况通常是例外情况,而不是常态。这取决于。通常事情并不排队“恰到好处”。 – 2010-10-28 14:11:49

3

这将完全取决于您的特定数据和索引策略。你在这里得到的任何答案都是一个猜测。

要知道确切的唯一方法就是尝试两种方法并进行适当的测量,这不难做到。

相关问题