了解Oracle SQL Developer中Execute Explain Plan的结果

我试图优化一个查询,但不太了解从解释计划返回的一些信息。任何人都可以告诉我OPTIONS和COST列的意义吗?在OPTIONS列中,我只看到FULL字。在COST列中,我可以推断出较低的成本意味着更快的查询。但是成本值代表什么,什么是可接受的阈值?
EXPLAIN PLAN的输出是Oracle查询优化器的调试输出。 COST是基于成本的优化器(CBO)的最终输出,其目的是选择应该使用许多不同的可能计划中的哪一个来运行查询。 CBO计算每个计划的相对成本,然后选择成本最低的计划。

(注:在某些情况下,CBO没有足够的时间来评估每个可能的计划;在这些情况下,它只选择到目前为止成本最低的计划)

一般来说,缓慢查询的最大因素之一是读取服务查询(块,更精确)的行数,因此成本将部分基于优化程序估计需要的行数读取。

例如,假设您有以下查询

SELECT emp_id FROM employees WHERE months_of_service = 6;

(months_of_service列有一个NOT NULL约束和一个普通的索引。)

优化器可能在这里选择两个基本计划:

>计划1:读取“employees”表中的所有行,为每个行检查谓词是否为true(months_of_service = 6)。
>计划2:读取其中months_of_service = 6的索引(这将产生一组ROWID),然后根据返回的ROWID访问该表。

让我们假设“employees”表有1,000,000(100万)行。让我们进一步想象,months_of_service的值范围从1到12,并且由于某种原因相当均匀地分布。

计划1的成本(涉及全扫描)将是读取employees表中所有行的成本,大约等于1,000;但由于Oracle通常能够使用多块读取来读取块,因此实际成本会更低(取决于数据库的设置方式)。让我们设想多块读取计数为10 – 全扫描的计算成本将为1,000 / 10;成本= 100,000。

计划2的成本(其涉及INDEX RANGE SCAN和由ROWID进行的表查找)将是扫描索引的成本加上通过ROWID访问表的成本。我不会进入索引范围扫描的成本,但让我们想象索引范围扫描的成本是每行1;我们期望在12个案例中的1个中找到匹配,所以索引扫描的成本是1,000 / 12 = 83,333;加上访问表的成本(假定每个访问一个块读取,我们不能在这里使用多块读取)= 83,333;总成本= 166,666。

如您所见,计划1(全扫描)的成本比计划2(按rowid的索引扫描访问)的成本低,这意味着CBO将选择全扫描。

如果优化器在这里做出的假设是真的,那么实际上计划1将是比计划2更好和更有效率,这反驳了FULL扫描总是“坏”的神话。

如果优化器目标是FirsT_ROWS(n),而不是ALL_ROWS,那么结果将是完全不同的 – 在这种情况下,优化器将偏好Plan 2,因为它通常会以更快的速度返回前几行,但代价是整个查询的效率较低。

相关文章

Java Oracle 结果集是Java语言中处理数据库查询结果的一种方...
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密...
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台...
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的...
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常...
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上...