有关索引大量数据的性能问题。我有一张大表(约3000万行),其中4列索引,以便快速搜索。目前我设置了索引(索引?),然后导入我的数据。这大概需要4个小时,这取决于数据库服务器的速度。首先导入数据,然后执行索引构建会更快/更高效吗?TSql,在数据输入之前或之后建立索引
回答
我试图通过说,它会可能“先索引,插入后”会比“插入第一,索引之后”慢,你插入记录到表中聚簇索引,但不能按该索引的自然顺序插入记录。原因在于对于每个插入,数据行本身必须在磁盘上进行排序。
作为示例,请考虑一个uniqueidentifier字段上带有聚集主键的表。 guid的(几乎)随机性意味着可能会在数据的顶部添加一行,导致当前页面中的所有数据都被混洗(也可能是较低页面中的数据),但下一行添加在底部。如果集群开启,比如说一个日期时间列,并且您恰好按照日期顺序添加行,那么记录自然会以正确的顺序插入磁盘,并且不需要昂贵的数据排序/混排操作。
我会支持温斯顿史密斯的“取决于”的答案,但建议您的聚集索引可能是确定哪种策略对当前情况更快的重要因素。你甚至可以尝试没有聚集索引,看看会发生什么。让我知道?
索引就位时插入数据会导致DBMS在每行之后更新它们。因此,首先插入数据并在之后创建索引通常会更快。特别是如果有这么多的数据。
(然而,总是有可能出现特殊情况可能会导致不同的性能特征。尝试是肯定知道的唯一途径。)
** @ af **基于什么假设是泛化?最近我尝试了两种方法,发现使用索引进行批量插入要比放下并重新创建要快得多,因为在数百万行的数据集上花费了大约20分钟的时间。 – 2010-10-28 12:59:31
是的,这完全取决于特定的数据,行的顺序和索引。尽管DBMS必须在逐行插入东西时做更多的工作,但如果所有东西都按正确的顺序进行,DBMS可以只写东西,并且永远不会重新排序数据或平衡索引数据结构。这些情况通常是例外情况,而不是常态。这取决于。通常事情并不排队“恰到好处”。 – 2010-10-28 14:11:49
这将完全取决于您的特定数据和索引策略。你在这里得到的任何答案都是一个猜测。
要知道确切的唯一方法就是尝试两种方法并进行适当的测量,这不难做到。
- 1. 在数据加载之前或之后创建Oracle SQL索引是否更好?
- 2. 在插入数据库之前或之后格式化数据?
- 3. 在创建活动之前或之后加载数据?
- 4. 在用数据填充表格之前或数据到位之后创建索引是否更好?
- 5. 数据库索引检查插入之前vs唯一索引
- 6. 如何在将SQL字符串输入列之前或之后删除引号(“)
- 7. 之前或输入标签
- 8. 在空表上创建索引后插入数据或在Oracle上插入数据后创建唯一索引?
- 9. 创建ViewModel:在模型数据可用之前或之后执行此操作?
- 10. 使用psycopg2删除索引在提交之前或之后生效?
- 11. 搜索引擎在JS加载之前或之后读取HTML吗?
- 12. 在Graphics.Dispose之前或之后释放DC?
- 13. 在添加列之前创建索引与添加列之后创建索引 - 是否重要?
- 14. 光标之前的匹配数(或位置用户正在输入之前)
- 15. 如何在构建之后但编制索引之前获取org.apache.lucene.document.Document
- 16. 插入之前的数据库创建
- 17. 在节点之前和之后插入
- 18. 急SQL:选择数据之前或日期时间之后
- 19. 在添加子元素之前或之后创建文档树
- 20. NSMutablearray在其他元素之前或之后插入新元素
- 21. codestyle;在注释之前或之后放入javadoc?
- 22. 在输入数据之前检查数据库中的重复
- 23. 在ElasticSearch建立索引后搜索
- 24. MySQL触发器:插入之前或之后插入
- 25. 过滤之前加入或之后加入SQL
- 26. C函数在输入之前退出
- 27. 在SQL中:根据之前或之后的日期添加列?
- 28. TSQL:和之前和之后的今天按客户
- 29. 在numpy数组函数之后获取数据帧的索引
- 30. WebSocket在连接建立之前关闭
+1了解更多细节和上下文。 – 2010-10-28 13:58:45
正在插入的数据是非常不顺序的,插入后做索引要快得多。感谢您的解释。 – John 2010-11-02 13:45:13