LosManos Asked: 2015-08-18 23:53:08 +0800 CST2015-08-18 23:53:08 +0800 CST 2015-08-18 23:53:08 +0800 CST 插入新行可以使 RDB 不使用索引吗? 772 假设我有一张包含 10000 条记录的表。然后我删除它们并重新创建它们。这是用“普通”sql 逐行完成的(不是某种批量插入(sqlserver 语言中的 BCP))。 RDB(在我的例子中是 Oracle)是否仍然认为所述表上的索引可用,或者它是否注意到许多行已更改并停止使用它? (如果上面的例子看起来很奇怪,这里有一个类似的例子:假设我有一个表,其中包含 10000 条记录,数据均匀分布。然后我插入 10000 条数据均匀分布的新记录。) oracle rdbms 1 个回答 Voted Best Answer captjackvane 2015-08-19T10:46:17+08:002015-08-19T10:46:17+08:00 首先,假设您没有列出 RDBMS 的版本,所以我假设您正在运行一个使用基于成本的优化器 (CBO) 的版本,而不是基于规则的优化器。CBO 是在 10g 系列数据库中引入的,所以我认为这是一个安全的假设。如果您仍在运行 9i 或更早版本,我的回答对您没有帮助。 所以你的问题是“插入会阻止我的 RDB 使用索引吗?”。简单的答案是否定的,他们不会。您的数据库将继续使用它之前使用的索引,正如评论中提到的 a_horse_with_no_name 那样,行将自动维护在索引中,您无需任何额外的努力。 但是,更改量可能会影响使用该索引的性能,这是您需要注意的事情。如何? 获取可以包含在索引中的所有行的总行数(记住我们不能索引空值)。然后考虑您完成的插入次数 - 这个数字是否 >= 现有行的 10%?如果答案是肯定的,那么您的统计数据现在被认为是过时的。幸运的是,默认情况下,Oracle 的更高版本会安装一个通宵作业(通常在本地服务器时间晚上 10 点左右运行),该作业将自动收集任何表和索引的统计信息,当它检测到行数发生 10% 或更大的变化时。 但是,如果您正在执行普通处理之外的操作,比如由于一次性数据加载而添加大量行,您可能需要比自动作业更快地自己收集统计信息。此外,根据我的经验,自动作业只有一个特定的时间窗口来收集统计信息,因此如果在多个对象之间操作大量数据,它可能无法收集所有对象的统计信息。 我在这里的观点是,在短时间内显着改变数据量会导致性能问题,这不是因为您的索引会很糟糕,而是因为在基于成本的世界中,优化器将获得错误的信息,并做出错误的决定。 我提出这个问题是因为您似乎专注于索引,索引只是拥有性能良好的数据库的更大工具包中的一个工具。 HTH。
首先,假设您没有列出 RDBMS 的版本,所以我假设您正在运行一个使用基于成本的优化器 (CBO) 的版本,而不是基于规则的优化器。CBO 是在 10g 系列数据库中引入的,所以我认为这是一个安全的假设。如果您仍在运行 9i 或更早版本,我的回答对您没有帮助。
所以你的问题是“插入会阻止我的 RDB 使用索引吗?”。简单的答案是否定的,他们不会。您的数据库将继续使用它之前使用的索引,正如评论中提到的 a_horse_with_no_name 那样,行将自动维护在索引中,您无需任何额外的努力。
但是,更改量可能会影响使用该索引的性能,这是您需要注意的事情。如何?
获取可以包含在索引中的所有行的总行数(记住我们不能索引空值)。然后考虑您完成的插入次数 - 这个数字是否 >= 现有行的 10%?如果答案是肯定的,那么您的统计数据现在被认为是过时的。幸运的是,默认情况下,Oracle 的更高版本会安装一个通宵作业(通常在本地服务器时间晚上 10 点左右运行),该作业将自动收集任何表和索引的统计信息,当它检测到行数发生 10% 或更大的变化时。
但是,如果您正在执行普通处理之外的操作,比如由于一次性数据加载而添加大量行,您可能需要比自动作业更快地自己收集统计信息。此外,根据我的经验,自动作业只有一个特定的时间窗口来收集统计信息,因此如果在多个对象之间操作大量数据,它可能无法收集所有对象的统计信息。
我在这里的观点是,在短时间内显着改变数据量会导致性能问题,这不是因为您的索引会很糟糕,而是因为在基于成本的世界中,优化器将获得错误的信息,并做出错误的决定。
我提出这个问题是因为您似乎专注于索引,索引只是拥有性能良好的数据库的更大工具包中的一个工具。
HTH。