跳转到内容

Oracle 和 DB2,比较和兼容性/流程模型/优化器/Oracle

来自 Wikibooks,开放世界中的开放书籍

Oracle 基于成本的优化器 (CBO) 使用以前收集的统计信息来创建最有效的 (最佳) SQL 执行计划。这些统计信息存储在系统表空间中的数据字典中。您会记得系统表空间不能脱机,原因之一是它包含数据字典,它是 DBMS 操作的核心组件。但是,可以将统计信息存储在数据字典之外,在这种情况下,它们不会影响优化器。也可以在数据库之间复制统计信息来为优化器提供种子。

Oracle 优化器 (CBO) 负责决定如何执行 SQL 语句。目标是以最有效的方式执行它们。优化器通过权衡所有可用的信息来完成这项工作,并根据这些信息制定一个执行计划。优化器可利用的一些信息来自环境 - 这些是有关数据的、索引的以及可用的机器资源的信息。其他信息由您根据业务需求提供。这些内容包括您如何利用机器资源以及您希望多快地返回数据。您可以为优化器提供许多因素,这些因素可以在数据库级别、会话级别甚至 SQL 语句级别上进行设置。

我们将研究影响优化器的 4 个方面;您为其提供的参数、数据库生成的统计信息、数据 SQL 以及优化器提示。

优化器参数。

您可以调整许多优化器参数,但最有影响的是 OPTIMIZER_MODE。如前所述,Oracle 具有 B 树和位图索引。索引是性能结构,索引访问通常比表扫描更快,尤其是在结果集很小且数据已聚簇的情况下(参见聚簇)。

对于需要排序的大型结果集,索引访问可能比表扫描需要更多 I/O。虽然效率较低,但这会尽快将行返回给用户。稍后,在“统计信息”中,我们将看到优化器从数据库操作(统计信息)和环境(机器资源、数据分布和 SQL)获得的信息类型。这些是优化器“知道”的东西,它“不知道”的是您希望如何将数据返回给您的偏好。OPTIMIZER_MODE 是您指定偏好的地方。


- all_Rows

all_rows 优化器模式倾向于表扫描而不是索引扫描。它旨在优化机器资源。如果优化器设置为 all-rows,将扫描表并将结果集写入中间临时表。只有在操作完成后,结果才会返回给最终用户。这种执行模式将 I/O 降至最低,最适合 OLAP 和 DSS 类型系统,在这些系统中,通常需要处理大量数据,但将数据尽快返回给最终用户并不重要。这就是 OLAP/DSS 系统具有长时间运行的分析查询的情况,这些查询通常在类似批处理的环境中运行。


- first_Rows

first_rows 优化器模式将使用索引扫描而不是表扫描。因为它读取索引来定位行,然后读取行,所以它是 I/O 密集型的,但是一旦读取数据,就会将其返回给原始查询。这种模式有利于 OLTP 类型应用程序,这些应用程序通常处理的数据量不多,但用户坐在终端等待响应。


- 其他参数

您可以更改其他参数,以向优化器提供有关您的偏好或数据布局方式的提示。通常,不需要更改这些参数,但如果您需要,可以选择更改它们。这些参数允许您影响以下方面的成本权重:

- 排序区域大小(较大的排序区域意味着排序更有可能适合内存)

- 涉及索引的访问路径

- 是否要并行化表扫描

- 哈希连接 VS 嵌套循环和排序合并表连接

- 索引在缓冲区缓存中的可能性

- 散乱读取相对于顺序读取的权重

优化器统计信息。

您可以使用 DBMS_STATS 包或 ANALYZE 语句来收集有关表的、索引的或簇的物理存储特性的统计信息。与 ANALYZE 相比,推荐使用 DBMS_STATS 包来收集优化器统计信息,但对于与优化器无关的统计信息,例如空块和平均空间,您必须使用 ANALYZE。

使用以下 DBMS_STATS 过程收集优化器统计信息:


• GATHER_INDEX_STATS

• GATHER_TABLE_STATS

• GATHER_SCHEMA_STATS

• GATHER_DATABASE_STATS


当您使用 ANALYZE 时,它会在要分析的对象上获取独占锁,因此应在非高峰时段分析表。有两种收集统计信息的方法,即估计和精确。使用估计,优化器会从表中随机抽取行,并使用这些信息来估计整个表的统计信息。这是最快的一种分析方法,对于特别大的表非常有用。使用精确方法,优化器会分析表中的每一行。虽然这种方法更准确,但需要更长的时间。由于收集的统计信息存储在数据字典中(数据字典始终可用),因此可以使用许多数据字典视图(以 DBA_ 为前缀)来验证这些统计信息的准确性。

dbms_stats 的另一个优点是它可以用来识别数据分布的倾斜。

环境。

优化器完成其工作所需的大量信息来自操作系统和数据库本身的操作(即环境),这些信息包括:

- 表的大小和分区

- 每个表列中不同值的个数

- 列值的分布(数据倾斜)

- 并行查询服务器的可用性

- 数据行在数据块上的聚簇


提示。

要覆盖优化器,请在 SQL 和/或 PL/SQL 中放置“提示”。提示可以放置在任何 SQL 或 PL/SQL 块中 - 匿名块、存储过程和触发器。有各种微调优化器的方法,这些方法是针对以下情况的选择:当表中的数据变化速度快于统计信息中反映的速度时。一种微调方法是提示,另一种方法是在统计信息看起来最佳时锁定统计信息。这是“最佳”与“可接受”之间的领域之一。如果您的优化器性能可接受,则无需对其进行微调。如果确实需要对其进行微调,则锁定统计信息或使用提示可以提供帮助,但这通常是使性能达到可接受水平的功能。努力追求最佳性能会导致收益递减。您可以使用超过 130 种不同的提示来影响优化器,从而提供精细的控制。您可以影响诸如连接顺序、访问路径、连接操作和并行路径等方面。

华夏公益教科书