데이터 베이스 MySQL 튜토리얼 Oracle TABLE ACCESS BY INDEX ROWID 说明

Oracle TABLE ACCESS BY INDEX ROWID 说明

Jun 07, 2016 pm 03:37 PM
access index oracle table

一. 测试环境 SQL select * from v$version where rownum=1; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release11.2.0.3.0 - 64bit Production SQL create table d

 

 

一.  测试环境

SQL> select * from v$version where rownum=1;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release11.2.0.3.0 - 64bit Production

 

SQL> create table dave as selectobject_id,object_name,object_type,created,timestamp,status from all_objects;

表已创建。

 

SQL> create table dave2 as select * from dave;

表已创建。

 

--收集统计信息,这里没有收集直方图:

SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname =>'DAVE',estimate_percent => 10 ,method_opt =>'FORCOLUMNS size 1',degree=>10,cascade => true);

 

PL/SQL 过程已成功完成。

 

SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname =>'DAVE2',estimate_percent => 10 ,method_opt =>'FORCOLUMNS size 1',degree=>10,cascade => true);

 

PL/SQL 过程已成功完成。

 

 

--避免其他影响,先刷新buffer cache

SQL> alter system flush buffer_cache;

 

系统已更改。

 

--查看全表扫描时的执行计划:

SQL> set autot traceonly

 

SQL> select d1.object_name,d2.object_type fromdave d1,dave2 d2 where d1.object_id=d2.object_id;

 

已选择72762行。

 

 

执行计划

----------------------------------------------------------

Plan hash value: 3613449503

 

------------------------------------------------------------------------------------

| Id  |Operation          | Name  | Rows | Bytes |TempSpc| Cost (%CPU)| Time    |

------------------------------------------------------------------------------------

|   0 |SELECT STATEMENT   |       | 72520 |  3824K|      |   695   (1)| 00:00:09 |

|*  1 |  HASH JOIN         |      | 72520 |  3824K|  2536K|  695   (1)| 00:00:09 |

|   2 |   TABLE ACCESS FULL| DAVE2 | 71990 |  1687K|      |   213   (1)| 00:00:03 |

|   3 |   TABLE ACCESS FULL| DAVE  | 72520 | 2124K|       |   213  (1)| 00:00:03 |

------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 -access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

 

 

统计信息

----------------------------------------------------------

         0  recursive calls

         0  db block gets

      6353  consistent gets

       1558  physical reads

         0  redo size

   3388939  bytes sent via SQL*Net toclient

     53874  bytes received via SQL*Netfrom client

      4852  SQL*Net roundtrips to/fromclient

         0  sorts (memory)

         0  sorts (disk)

     72762  rows processed

--这里产生了1558的物理读

SQL>

 

 

--object_id上创建索引:

 

SQL> create index idx_dave_object_idon dave(object_id);

索引已创建。

SQL> create index idx_dave_object_id2 ondave2(object_id);

索引已创建。

 

--在次查看执行计划:

 

SQL> select d1.object_name,d2.object_type fromdave d1,dave2 d2 where d1.object_id=d2.object_id;

 

已选择72762行。

 

 

执行计划

----------------------------------------------------------

Plan hash value: 3613449503

 

------------------------------------------------------------------------------------

| Id  |Operation          | Name  | Rows | Bytes |TempSpc| Cost (%CPU)| Time    |

------------------------------------------------------------------------------------

|   0 |SELECT STATEMENT   |       | 72520 |  3824K|      |   695   (1)| 00:00:09 |

|*  1 |  HASH JOIN         |      | 72520 |  3824K|  2536K|  695   (1)| 00:00:09 |

|   2 |   TABLE ACCESS FULL| DAVE2 | 71990 |  1687K|      |   213   (1)| 00:00:03 |

|   3 |   TABLE ACCESS FULL| DAVE  | 72520 | 2124K|       |   213  (1)| 00:00:03 |

------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 -access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

 

 

统计信息

----------------------------------------------------------

         1  recursive calls

         0  db block gets

      6353  consistent gets

          0  physical reads

         0  redo size

   3388939  bytes sent via SQL*Net toclient

     53874  bytes received via SQL*Netfrom client

      4852  SQL*Net roundtrips to/fromclient

         0  sorts (memory)

         0  sorts (disk)

     72762  rows processed

 

这里的物理读为0. 但是还是走的是全表扫描。

 

--刷新一下buffer,增加索引条件:

SQL> alter system flush buffer_cache;

 

系统已更改。

 

SQL> select d1.object_name,d2.object_type fromdave d1,dave2 d2 where d1.object_id=d2.object_id  and d1.object_id

 

已选择98行。

 

 

执行计划

----------------------------------------------------------

Plan hash value: 504164237

 

----------------------------------------------------------------------------------------------------

| Id  |Operation                    | Name                | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------------

|   0 |SELECT STATEMENT             |                     |  3600 |  189K|    23   (5)| 00:00:01 |

|*  1 |  HASH JOIN                   |                     |  3600 |  189K|    23   (5)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| DAVE2               |  3600 | 86400 |    11  (0)| 00:00:01 |

|*  3 |    INDEX RANGE SCAN          | IDX_DAVE_OBJECT_ID2 |   648 |      |     3   (0)| 00:00:01 |

|   4 |   TABLE ACCESS BY INDEX ROWID| DAVE                |  3626 |  106K|    11   (0)| 00:00:01 |

|*  5 |    INDEX RANGE SCAN          | IDX_DAVE_OBJECT_ID  |   653|       |     3  (0)| 00:00:01 |

----------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 -access("D1"."OBJECT_ID"="D2"."OBJECT_ID")

   3 -access("D2"."OBJECT_ID"

   5 -access("D1"."OBJECT_ID"

 

 

统计信息

----------------------------------------------------------

         1  recursive calls

         0  db block gets

        20  consistent gets

         6  physical reads

         0  redo size

      3317  bytes sent via SQL*Net toclient

       590  bytes received via SQL*Netfrom client

         8  SQL*Net roundtrips to/fromclient

         0  sorts (memory)

         0  sorts (disk)

        98  rows processed

 

SQL>

 

走索引之后,物理读从1558降到6.

 

 

二.说明

在上面的测试中,我们看到了索引扫描的类型和多表关联的类型,关于这几种类型的说明,参考:

 

Oracle 索引扫描的五种类型

http://blog.csdn.net/tianlesoftware/article/details/5852106

 

多表连接的三种方式详解 HASH JOIN MERGE JOINNESTED LOOP

http://blog.csdn.net/tianlesoftware/article/details/5826546

 

从执行计划中,当我们走索引之后,在对应的表上就会出现:

TABLE ACCESS BY INDEX ROWID

 

在如下文章中对OracleROWID 有说明

Oracle Rowid 介绍

http://blog.csdn.net/tianlesoftware/article/details/5020718

 

 

rowid是伪列(pseudocolumn),在查询结果输出时它被构造出来的。rowid并不会真正存在于表的data block中,其存在于index当中,用来通过rowid来寻找表中的行数据。 

 

ROWID 由以下几部分组成:

1. 数据对象编号:每个数据对象(如表或索引)在创建时都分配有此编号,并且此编号在数据库中是唯一的

2. 相关文件编号:此编号对于表空间中的每个数据文件是唯一的

3. 块编号:表示包含此行的块在数据文件中的位置

4. 行编号:标识块头中行目录位置的位置

 

Oracle 索引中保存的是我们字段的值和该值对应的rowid,我们根据索引进行查找时,就会返回该block的rowid,然后根据rowid直接去block上去我们需要的数据,因此就出现了:

TABLE ACCESS BY INDEX ROWID

 

因为ROWID 对应一个block,所以当使用TABLE ACCESS BY INDEX ROWID时,每次就只能读取一个block。

 

假设我们我们的数据返回100个ROWID,其中10个row 位于同一个block上,那么我们只需要访问91次block,就可以拿到我们需要的数据。

 

关于如何确定row记录在哪个block的方法参考:

Oracle rdba和 dba 说明

http://blog.csdn.net/tianlesoftware/article/details/6529346

 

 

小结:

(1)    TABLE ACCESS BY INDEX ROWID 只出现在使用索引的情况下。

(2)    TABLE ACCESS BY INDEX ROWID 是单块读,每次只能读取一个block。

 

 

 

 

 

 

 

-------------------------------------------------------------------------------------------------------

!

Skype:            tianlesoftware

QQ:                 tianlesoftware@gmail.com

Email:             tianlesoftware@gmail.com

Blog:   http://www.tianlesoftware.com

Weibo:            http://weibo.com/tianlesoftware

Twitter: http://twitter.com/tianlesoftware

Facebook: http://www.facebook.com/tianlesoftware

Linkedin: http://cn.linkedin.com/in/tianlesoftware

 

 

-------加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请----

DBA1 群:62697716(满);   DBA2 群:62697977(满)  DBA3 群:62697850(满)  

DBA 超级群:63306533(满);  DBA4 群:83829929   DBA5群: 142216823

DBA6 群:158654907    DBA7 群:172855474   DBA总群:104207940

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

웹 사이트 성과를 향상시키기 위해 Debian Apache Logs를 사용하는 방법 웹 사이트 성과를 향상시키기 위해 Debian Apache Logs를 사용하는 방법 Apr 12, 2025 pm 11:36 PM

이 기사는 데비안 시스템에서 Apache Logs를 분석하여 웹 사이트 성능을 향상시키는 방법을 설명합니다. 1. 로그 분석 기본 사항 Apache Log는 IP 주소, 타임 스탬프, 요청 URL, HTTP 메소드 및 응답 코드를 포함한 모든 HTTP 요청의 자세한 정보를 기록합니다. 데비안 시스템 에서이 로그는 일반적으로 /var/log/apache2/access.log 및 /var/log/apache2/error.log 디렉토리에 있습니다. 로그 구조를 이해하는 것은 효과적인 분석의 첫 번째 단계입니다. 2. 로그 분석 도구 다양한 도구를 사용하여 Apache 로그를 분석 할 수 있습니다.

Apache의 Zend를 구성하는 방법 Apache의 Zend를 구성하는 방법 Apr 13, 2025 pm 12:57 PM

Apache에서 Zend를 구성하는 방법은 무엇입니까? Apache 웹 서버에서 Zend 프레임 워크를 구성하는 단계는 다음과 같습니다. Zend 프레임 워크를 설치하고 웹 서버 디렉토리로 추출하십시오. .htaccess 파일을 만듭니다. Zend 응용 프로그램 디렉토리를 작성하고 Index.php 파일을 추가하십시오. Zend 응용 프로그램 (application.ini)을 구성하십시오. Apache 웹 서버를 다시 시작하십시오.

Apache Server 란 무엇입니까? Apache 서버는 무엇입니까? Apache Server 란 무엇입니까? Apache 서버는 무엇입니까? Apr 13, 2025 am 11:57 AM

Apache Server는 브라우저와 웹 사이트 서버 간의 브리지 역할을하는 강력한 웹 서버 소프트웨어입니다. 1. HTTP 요청을 처리하고 요청에 따라 웹 페이지 컨텐츠를 반환합니다. 2. 모듈 식 디자인은 SSL 암호화 지원 및 동적 웹 페이지와 같은 확장 된 기능을 허용합니다. 3. 보안 취약점을 피하고 고성능 웹 애플리케이션을 구축하기 위해 보안 취약점을 피하고 스레드 카운트 및 타임 아웃 시간과 같은 성능 매개 변수를 최적화하기 위해 구성 파일 (예 : 가상 호스트 구성)을 신중하게 설정해야합니다.

HDFS에서 CentOS를 구성하는 데 어떤 단계가 필요합니까? HDFS에서 CentOS를 구성하는 데 어떤 단계가 필요합니까? Apr 14, 2025 pm 06:42 PM

Centos 시스템에서 Hadoop 분산 파일 시스템 (HDF)을 구축하려면 여러 단계가 필요합니다. 이 기사는 간단한 구성 안내서를 제공합니다. 1. 초기 단계에서 JDK를 설치할 준비 : 모든 노드에 JavadevelopmentKit (JDK)을 설치하면 버전이 Hadoop과 호환되어야합니다. 설치 패키지는 Oracle 공식 웹 사이트에서 다운로드 할 수 있습니다. 환경 변수 구성 : /etc /프로파일 파일 편집, Java 및 Hadoop 설정 설정 시스템에서 JDK 및 Hadoop의 설치 경로를 찾을 수 있습니다. 2. 보안 구성 : SSH 비밀번호가없는 로그인 SSH 키 : 각 노드에서 ssh-keygen 명령을 사용하십시오.

데비안 아파치 로그 형식을 구성하는 방법 데비안 아파치 로그 형식을 구성하는 방법 Apr 12, 2025 pm 11:30 PM

이 기사에서는 데비안 시스템에서 Apache의 로그 형식을 사용자 정의하는 방법에 대해 설명합니다. 다음 단계는 구성 프로세스를 안내합니다. 1 단계 : Apache 구성 파일 액세스 Debian 시스템의 기본 Apache 구성 파일은 일반적으로 /etc/apache2/apache2.conf 또는 /etc/apache2/httpd.conf에 있습니다. 다음 명령을 사용하여 루트 권한으로 구성 파일을 엽니 다.

Centos에서 Weblogic의 데이터베이스 연결을 구성하는 방법 Centos에서 Weblogic의 데이터베이스 연결을 구성하는 방법 Apr 14, 2025 pm 02:06 PM

CentOS 시스템에서 Weblogic 데이터베이스 연결을 구성하려면 다음 단계가 필요합니다. JDK 설치 및 환경 구성 : 서버가 Weblogic 버전과 호환되는 JDK를 설치했는지 확인하십시오 (예 : WebBlogic14.1.1은 일반적으로 JDK8이 필요합니다). Java_home, ClassPath 및 PATH 환경 변수를 올바르게 설정하십시오. Weblogic 설치 및 압축 압축 : 공식 Oracle 웹 사이트에서 Centos 시스템 용 Weblogic 설치 패키지를 다운로드하여 지정된 디렉토리로 압축 해제하십시오. 웹 로그 사용자 및 디렉토리 생성 : 전용 웹 로그 사용자 계정을 만들고 보안 비밀번호를 설정하십시오.

NGINX 성능 모니터링 및 문제 해결 도구 NGINX 성능 모니터링 및 문제 해결 도구 Apr 13, 2025 pm 10:00 PM

NGINX 성능 모니터링 및 문제 해결은 주로 다음 단계를 통해 수행됩니다. 1. NGINX-V를 사용하여 버전 정보를보고 STUB_STATUS 모듈을 활성화하여 활성 연결 수, 요청 및 캐시 적중률을 모니터링합니다. 2. 상위 명령을 사용하여 시스템 리소스 점유, Iostat 및 VMSTAT 모니터 디스크 I/O 및 메모리 사용을 모니터링합니다. 3. TCPDUMP를 사용하여 패킷을 캡처하여 네트워크 트래픽을 분석하고 네트워크 연결 문제를 해결합니다. 4. 동시 처리 기능이 충분하지 않거나 과도한 프로세스 컨텍스트 오버 헤드를 피하기 위해 작업자 프로세스 수를 올바르게 구성합니다. 5. 부적절한 캐시 크기 설정을 피하기 위해 Nginx 캐시를 올바르게 구성하십시오. 6. awk 및 grep 명령 또는 elk 사용과 같은 nginx 로그를 분석하여

nginx의 도메인 이름을 구성하는 방법 nginx의 도메인 이름을 구성하는 방법 Apr 14, 2025 am 11:30 AM

nginx에서 도메인 이름을 구성하려면 다음 단계를 따르십시오. 서버 블록을 추가하고 도메인 이름을 지정하십시오. 웹 사이트 파일의 루트 디렉토리를 설정하십시오. 루트 디렉토리에 인덱스 파일을 설정합니다. 오류 코드를 처리하는 방법을 설정하십시오. 서버 액세스 및 오류 로그를 구성하십시오. Nginx 서비스를 새로로드 또는 다시 시작하십시오.

See all articles