Oracle 11g Release 优化器的访问路径介绍
本文内容
•全表扫描(Full Table Scans)
•物理 ID 扫描(Rowid Scans)
•索引扫描(Index Scans)
•聚簇访问(Cluster Access)
•哈希访问(Hash Access)
•采样表扫描(Sample Table Scans)
•查询优化器如何选择访问路径
•备注
访问路径(Access paths)是从数据库检索数据的方式。一般地,索引访问路径(index access paths)用于检索表数据行一个小的子集语句,而当访问表的一个大部分时,全表扫描(full scans)更有效率。在线事务处理(Online transaction processing,OLTP)应用程序,它是由具有高选择性的短期运行的 SQL 语句组成,通常用索引访问路径。另一个方面,决策支持系统(Decision support systems)倾向于使用分区表,执行相关分区的全表扫描。
全表扫描
--------------------------------------------------------------------------------
全表扫描读取表的所有行,并过滤掉那些不符合选择条件的行。执行全表扫描期间,表中高水位线(high water mark,HWM)以下的所有数据块都会被扫描。高水位以下的所有数据表示已使用的空间数量(插入数据后),或收到数据已被格式化的空间(插入数据后,再删除的空间)。检查每个行是否满足 WHERE 子句。
当Oracle 执行全表扫描时,顺序地读取块。因为块是相邻的,所以 I/O 调用要比单块大,加速了处理。读取调用大小的范围从 1 个块到初始化参数 DB_FILE_MULTIBLOCK_READ_COUNT 指定的块数量。使用多块读取意味着,全表扫描以很高的效率执行。每个块只被读取一次。
为什么全表扫描对于访问大数据量更快?
当访问表中块的很大一部分时,全表扫描要比索引范围扫描更划算。这是因为,全表扫描可以使用更大的 I/O 调用,而次数少却较大的 I/O 调用要比次数多却小的调用代价更小。
优化器何时使用全表扫描?
优化器在以下情况使用全表扫描:
•没有索引
若查询不能使用任何现存的索引,则使用全表扫描。例如,如果查询中有一个在已索引列上使用函数,那么,优化器就不能使用索引,而是使用全表扫描。
如果你需要使用索引来进行不依赖大小写的检索,那么,或者在检索中不允许大小写混合,或是在检索列上创建一个基于函数的索引,如 UPPER(last_name)。参考 “使用基于函数索引的性能”。
•大数据量
若优化器认为,查询会访问表中的大多数块,则使用全表扫描,即使有索引可用。
•小的表
若一个表高水位线以下包含比 DB_FILE_MULTIBLOCK_READ_COUNT 参数小块,它们可以在一个单 I/O 调用读取,那么全表扫描比索引范围扫描更划算,而不管可被访问表的其他部分,或现在的索引。
•高并行度
一个表的高并行度会使优化器倾向于全表扫描,而不是范围扫描。检查 ALL_TABLES 表的 DEGREE 列以确定并行程度。
全表扫描提示
使用 FULL(table alias) 来命令优化器使用全表扫描。参考“指示访问路径”。
可以使用 CACHE 和 NOCACHE 指示已检索的块是否放在缓冲区缓存。CACHE 命令优化器,当执行全表扫描时,把已检索的块放在缓冲区高速缓存 LRU 列表最近使用的末尾。
小的表 1 根据下表的准则自动缓存。
表 1 缓存表的准则
表大小 大小准则 缓存
小 块的数量大于 20 个,或已缓存的块达到总数的 2%,不管多大 如果 STATISTICS_LEVEL 设置为 TYPICAL 或更高,Oracle 确定是否依赖表的扫描记录缓存一个表。只有之后表扫描可能查找已缓存的块,表才会被缓存。若 STATISTICS_LEVEL 设置成 BASIC,则表不被缓存。
中 比上面的大,并且已缓存的块小于总数的 10% Oracle 确定是否基于表的扫描和负载记录缓存一个表。只有之后的扫描可能查找已缓存的块,才会缓存表。
大 已缓存的块大于总数的 10% 不被缓存。
对于用 CACHE 属性创建或变更的表,禁用小表的自动缓存。
并行查询的执行
当需要全表扫描时,通过多并行执行服务来扫描表已提高响应时间。并行查询通常用于低并发数据的数据仓库环境。
物理 ID(Rowids)扫描
--------------------------------------------------------------------------------
一个行的物理 ID 指定数据文件(datafile),以及包含行的数据块和块中行位置的数据块。通过指定行的物理 ID 定位行是检索一个单独行的最快方式,因为在数据库中指定了行的精确定位。为了通过物理 ID 访问一个表,Oracle 首先获得已选定行的物理 ID,无论是从语句的 WHERE 子句,还是通过一个或多个表索引的索引扫描。之后,Oracle 基于它们的物理 ID 在表中定位每个选择的行。
优化器何时使用 Rowids
一般地,这是从一个索引检索物理 ID 后的第二步。访问的表可能在语句中要求任何列,而这些列并不在索引中。
通过物理 ID 访问不需要按照每个索引扫描。若索引包含语句需要的所有列,则通过物理 ID 访问可能不会发生。
索引扫描
--------------------------------------------------------------------------------
此方法中,使用语句中指定的已索引的列的值,通过遍历索引来检索行。索引扫描基于索引中的一个或多个值,从索引中检索数据。要执行一个索引扫描,Oracle 为已建立索引列的值检索索引。若语句仅仅访问索引列,则 Oracle 从索引直接读取已索引的列值,而不是从表。
索引不仅包含索引值,而且也包含表中具有该值的行的物理 ID。因此,若语句访问其他没有索引的列,则 Oracle 通过物理 ID 或聚簇扫描查找表中的行。
以下是索引扫描类型:
•通过块访问 I/O,不是行
•索引唯一扫描(Index Unique Scans)
•索引范围扫描(Index Range Scans)
•索引访问递减扫描(Index Range Scans Descending)
•索引滤过扫描(Index Skip Scans)
•全表扫描(Full Scans)
•快速全表索引扫描(Fast Full Index Scans)
•索引连接(Index Joins)
•Bitmap 索引(Bitmap Indexes)
聚簇访问
--------------------------------------------------------------------------------
聚簇扫描用于从存储在已索引聚簇的表中检索具有相同聚簇键值的所有行。要执行聚簇扫描,Oracle 首先通过扫描聚簇索引,获得已选定行的物理 ID。再基于物理 ID 定位行。
哈希访问
--------------------------------------------------------------------------------
哈希扫描用于基于哈希值在哈希聚簇中定位行。在哈希聚簇中,具有相同哈希值的所有行被存储在相同的数据块。要执行哈希扫描,Oracle 首先通过把一个哈希函数应用到一个聚簇键值,来获得哈希值。再扫描包含哈希值的行所在数据块。
采样表扫描
--------------------------------------------------------------------------------
采样(随机)表扫描从一个采样表或是一个复杂的 SELECT 语句检索随机的采样数据。当 FROM 语句包含 SAMPLE 子句或 SAMPLE BLOCK 子句时,使用该访问路径。当用 SAMPLE 子句采样数据时,要执行一个采样表扫描,Oracle 在表中读取一个指定的行百分比。当用 SAMPLE BLOCK 子句采样块时,Oracle 读取一个指定的表块的百分比。
查询优化器如何选择访问路径
--------------------------------------------------------------------------------
查询优化器基于下面因素选择一个访问路径:
•语句可用的访问路径
•通过每个访问路径,或访问路径的结合,评估执行语句的代价
要选择一个访问路径,优化器首先通过检查 WHERE 子句和 FROM 子句的条件来确定哪个访问路径可用。然后,优化器使用访问路径产生一套可能的执行计划,并通过索引、列和访问表语句的统计信息来评估每个执行计划的代价。最后,优化器选择具有最小代价的执行计划。
当选择一个访问路径时,查询优化器受下面影响:
•优化器指示
可以指定优化器使用指定的访问路径,除了包含 SAMPLE 或 SAMPLE BLOCK 的 FROM 子句。
•统计信息
例如,若一个表自创建以来,没有分析过,并且其高水位线下(HWM)的块小于参数 DB_FILE_MULTIBLOCK_READ_COUNT,则优化器认为,这个表比较小,并使用全表扫描。查看 ALL_TABLES 表中的 LAST_ANALYZED 和 BLOCKS 列来检查统计信息。
备注
--------------------------------------------------------------------------------
高水位线(high water mark,HWM)
Oracle 在逻辑存储上分为 4 个粒度——表空间、段、区和块。
•块是最小的存储单位(8K)。Oracle 的每次I/O操作也是按块的。即当 Oracle 读数据时,是读取多少个块,而不是多少行。
•区是由一系列相邻的块组成,这是 Oracle 分配空间的基本单位。比如,当创建一个表时,Oracle 会分配一个区的空间给该表。当该区满了后,Oracle 以区为单位进行扩展,而不是块。
•段是由一系列的区组成。一般地,当创建一个对象时(表或索引),Oracle 会分配一个段给该对象。某种意义上,段是某种特定的数据。如 CREATE TABLE 时,Oracle 为表创建数据段,CREATE INDEX 时,Oracle 还会分配一个段,只是这个段是索引段。
•表空间包含了段、区和块。表空间数据物理上储存在其所在的数据文件中。
Oracle 用高水位线(high water mark,HWM)来界定一个段中使用的块和未使用的块。
比如,当创建一个表时,Oracle 为该对象分配一个段。即使还未插入任何记录,也至少有一个区被分配。第一个区的第一个块称为段头(SEGMENT HEADE)。段头储存了一些信息,如 HWM 信息。HWM 位于第 2 个块。当块放不下新数据,Oracle 用 HWM 之上的块存储,同时,HWM 向上移。当不断插入数据时,HWM 会不断上移。这样,HWM 之下表示使用过的块,HWM 之上的就表示已分配但未使用过的块

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Oracle 打不開的解決辦法包括:1. 啟動數據庫服務;2. 啟動監聽器;3. 檢查端口衝突;4. 正確設置環境變量;5. 確保防火牆或防病毒軟件未阻止連接;6. 檢查服務器是否已關閉;7. 使用 RMAN 恢復損壞的文件;8. 檢查 TNS 服務名稱是否正確;9. 檢查網絡連接;10. 重新安裝 Oracle 軟件。

解決 Oracle 游標關閉問題的方法包括:使用 CLOSE 語句顯式關閉游標。在 FOR UPDATE 子句中聲明游標,使其在作用域結束後自動關閉。在 USING 子句中聲明游標,使其在關聯的 PL/SQL 變量關閉時自動關閉。使用異常處理確保在任何異常情況下關閉游標。使用連接池自動關閉游標。禁用自動提交,延遲游標關閉。

在 Oracle 中刪除所有數據需要以下步驟:1. 建立連接;2. 禁用外鍵約束;3. 刪除表數據;4. 提交事務;5. 啟用外鍵約束(可選)。請務必在執行前備份數據庫,以防數據丟失。

Oracle 數據庫分頁利用 ROWNUM 偽列或 FETCH 語句實現:ROWNUM 偽列用於通過行號過濾結果,適用於復雜查詢。 FETCH 語句用於獲取指定數量的第一行,適用於簡單查詢。

Oracle 中,FOR LOOP 循環可動態創建游標, 步驟為:1. 定義游標類型;2. 創建循環;3. 動態創建游標;4. 執行游標;5. 關閉游標。示例:可循環創建游標,顯示前 10 名員工姓名和工資。

要停止 Oracle 數據庫,請執行以下步驟:1. 連接到數據庫;2. 優雅關機數據庫(shutdown immediate);3. 完全關機數據庫(shutdown abort)。

可以通過使用 Oracle 的動態 SQL 來根據運行時輸入創建和執行 SQL 語句。步驟包括:準備一個空字符串變量來存儲動態生成的 SQL 語句。使用 EXECUTE IMMEDIATE 或 PREPARE 語句編譯和執行動態 SQL 語句。使用 bind 變量傳遞用戶輸入或其他動態值給動態 SQL。使用 EXECUTE IMMEDIATE 或 EXECUTE 執行動態 SQL 語句。

在CentOS系統上搭建Hadoop分佈式文件系統(HDFS)需要多個步驟,本文提供一個簡要的配置指南。一、前期準備安裝JDK:在所有節點上安裝JavaDevelopmentKit(JDK),版本需與Hadoop兼容。可從Oracle官網下載安裝包。環境變量配置:編輯/etc/profile文件,設置Java和Hadoop的環境變量,使系統能夠找到JDK和Hadoop的安裝路徑。二、安全配置:SSH免密登錄生成SSH密鑰:在每個節點上使用ssh-keygen命令
