是否需要不时刷新索引?

RPK*_*RPK 6 mysql innodb postgresql oracle sql-server

这个问题对于我使用的所有数据库产品都很常见,即。SQL Server、MySQL、Oracle 和 PostgreSQL。

我创建了一个新的数据库,目前表中没有记录。我已经在查询中经常需要的所有这些表列上创建了索引。我想知道当我继续在表中添加记录时,索引是如何在物理上(集群)和逻辑上(非集群)更新的?索引是自动更新还是我需要不时手动更新索引?

a_h*_*ame 9

索引自动更新的关于什么是存储在其中(被索引行的列值)。

然而,一些 DBMS 需要对其进行定期维护(也称为“重建”)以优化索引值的存储。

旧版本的 Microsoft SQL Server 需要定期重建索引以保持高效。但我不知道新版本是否仍然如此(2005,2008)

无需在 Oracle 中重新创建索引。

PostgreSQL 的(自动)真空进程应该负责回收空间,但它们有时(虽然很少)也需要重建。

  • 一个小小的挑剔。假设这些索引是常见的、日常的 b*-tree 索引,那么它们将在 Oracle 中自动更新是绝对正确的。但是Oracle 中有很多类型的索引,其中一些可能不会自动刷新。例如,Oracle Text 索引通常需要在加载新文档后显式刷新。 (3认同)

小智 4

索引本身中的值将自动更新。我只能代表 SQL Server,但由于发生碎片,索引通常需要重建或重新组织 - 特别是如果它位于定期更新的表上。可以通过 sys.dm_db_index_physical_stats DMV 监控索引碎片:

http://msdn.microsoft.com/en-us/library/ms188917.aspx

最好的策略通常是使用一个脚本来查找超过一定碎片级别的索引,然后根据该值重建或重新组织。我知道很多人都使用 Ola Hallengren 的脚本:

http://ola.hallengren.com/

在我们的生产数据库中,我们每晚运行与此类似的脚本来检查碎片(尽管这可能有点过头了)。