sql - 从数据库中删除数据(使用实际的删除 SQL 查询)是否会导致表数据重新索引时出现巨大问题?

标签 sql oracle plsql

从数据库中删除数据(使用实际的删除SQL查询)是否会导致表数据(例如数千万数据)重新索引时出现巨大问题,从而增加系统开销并消耗更多资源?

最佳答案

大多数数据库不会立即删除与表中已删除行关联的 inode 。根据重复索引键处理方式的具体情况,这可能根本没有效果。例如,重复键索引构建的一种方案是仅针对键值使用单个 B+Tree 节点,但使其指向索引列中包含该键值的行列表。在这种情况下,删除表中的一行甚至多行根本不会影响索引树的效率,直到所有具有该键值的行都被删除,此时键节点将被标记为已删除,但不会必然从树上删除。当然,在唯一索引键的情况下,任何删除都会导致节点被标记为已删除。当磁盘上许多彼此靠近的键值发生这种情况时,索引树可能会变得低效。

一种解决方案是从头开始重建索引,方法是删除并重新创建索引,或者如果 DBMS 具有“重新索引”命令的功能。一些更高级的数据库系统使用的另一种解决方案是跟踪索引搜索实际遇到已删除节点的时间。如果这种情况经常发生以至于超过了配置的阈值,那么自动线程将“清理”索引,实际上删除已删除的节点,并可能压缩大部分空的索引页,甚至重新平衡索引树。这种“更干净的线程”功能的优点是不经常使用的低效索引,或者不再访问包含已删除节点的索引的子树(想象一下删除索引中过时的行,该索引的前导列是日期用于清除行),不要占用资源来清理或重建它们,因为它们不会影响性能。

关于sql - 从数据库中删除数据(使用实际的删除 SQL 查询)是否会导致表数据重新索引时出现巨大问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51705703/

相关文章:

sql - 创建仅具有规范的包装?

Oracle-PL/SQL : How to read from changeable file names in external tables?

debugging - 如何在 sql Developer 上调试 PL SQL 脚本时获得 clob 的完整值

python - 从 Django QuerySet 获取 SQL

sql - 如何获取每科得分最高的学生的姓名?

sql - 从服务器删除所有数据库

java - 甲骨文错误信息

sql - 如何提取 DATE 的年份并将其插入新列?

mysql - 在表的 JOIN 之前设置 LIMIT

sql - 从不规则日期中按小时查找百分比时间