这个问题对于我使用的所有数据库产品都很常见,即。SQL Server、MySQL、Oracle 和 PostgreSQL。
我创建了一个新的数据库,这些表目前没有记录。我已经在查询中经常需要的所有此类表列上创建了索引。我想知道当我继续在表中添加记录时,索引是如何在物理上(集群)和逻辑上(非集群)更新的?索引是自动更新还是我需要不时手动更新索引?
这个问题对于我使用的所有数据库产品都很常见,即。SQL Server、MySQL、Oracle 和 PostgreSQL。
我创建了一个新的数据库,这些表目前没有记录。我已经在查询中经常需要的所有此类表列上创建了索引。我想知道当我继续在表中添加记录时,索引是如何在物理上(集群)和逻辑上(非集群)更新的?索引是自动更新还是我需要不时手动更新索引?
索引会根据其中存储的内容(被索引的行的列值)自动更新。
然而,一些 DBMS 需要定期维护(也称为“重建”)以优化索引值的存储。
旧版本的 Microsoft SQL Server 需要定期重建索引以保持高效。但我不知道新版本是否仍然如此(2005,2008)
无需在 Oracle 中重新创建索引。
PostgreSQL 的(自动)vacuum 进程应该负责回收空间,但它们有时(尽管很少)也需要重建。
索引本身的值会自动更新。我只能说 SQL Server,但由于发生碎片,索引通常需要重建或重组 - 特别是如果它位于定期更新的表上。可以通过 sys.dm_db_index_physical_stats DMV 监控索引碎片:
http://msdn.microsoft.com/en-us/library/ms188917.aspx
最好的策略通常是使用一个脚本,在一定程度的碎片上查找索引,然后根据这个值重建或重组。我知道很多人使用 Ola Hallengren 的脚本:
http://ola.hallengren.com/
在我们的生产数据库中,我们每晚都会运行类似的脚本来检查碎片(尽管这可能是矫枉过正)。
您创建的索引由数据库服务器自动管理。
现在,从您需要登录并进行一些维护的时候开始
在 PostgreSQL 中,我知道您需要对索引进行清理以清理垃圾。
在 MySQL 中,我知道您需要运行优化以确保索引正确排序并具有正确的子索引。