+ All Categories
Home > Documents > Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning –...

Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning –...

Date post: 24-Aug-2020
Category:
Upload: others
View: 8 times
Download: 0 times
Share this document with a friend
89
Oracle Tuning – Índices Em Oracle Enterprise Edion 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle Enterprise Linux 7.6 Ricardo Porlho Proni [email protected] Esta obra está licenciada sob a licença Creave Commons Atribuição-SemDerivados 3.0 Brasil. Para ver uma cópia desta licença, visite hp://creavecommons.org/licenses/by-nd/3.0/br/.
Transcript
Page 1: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

Oracle Tuning – ÍndicesEm Oracle Enterprise Edition 19c (RU 19.4.0.0)

Em CDB ArchitectureEm Oracle Enterprise Linux 7.6

Ricardo Portilho [email protected]

Esta obra está licenciada sob a licençaCreative Commons Atribuição-SemDerivados 3.0 Brasil.

Para ver uma cópia desta licença, visite http://creativecommons.org/licenses/by-nd/3.0/br/.

Page 2: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

2

VM

Importe o arquivo OTI.ova no VirtualBox, com “Importar Appliance”.

Configuração mínima recomendada:● i5;● 8 GB RAM;● 50 GB de espaço em disco.

IP da VM● 192.168.56.101

Usuáriooracle

SenhaNerv2019

Inicie o Listener e a Instância…

Page 3: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

3

Além da Documentação...

Outras fontes que utilizei:● https://docs.oracle.com/en/● https://oracle-base.com/

Page 4: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

4

10gR1● Enhanced Bitmap Index Performance and Space Management● Eliminate Duplicated Columns in Index on an Index-Organized Table● Index-Organized Table (IOT) Partitioning Enhancements● Extensible Indexing● Global Partitioned Indexes - Hash Partitioning● Partitioned Index-Organized Tables - List Partitioning● Partitioned Index-Organized Tables - Global Index Maintenance● Partitioned Index-Organized Tables - LOB Support● Local Partitioned Indexes Manageability Improvements● Enhanced Composite Dimensions Indexing● Spatial Index Updates and Queries - Performance Improvements

10gR2● Intra-Partition DML in the Presence of Bitmap Indexes● Online Indexing for Local Partitioned Index● Fast Partition Split for Partitioned Index Organized Tables

New Features

Page 5: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

5

11gR1● Invisible Indexes● Online Index Creation and Rebuild Enhancements● Bitmap Join Index Support for Index-Organized Tables● New Capabilities for Domain Index Operations● System-Managed Partitioning of Extensible Indexes● XMLIndex● XMLIndex Enhancements● Incremental Indexing Enhancements● Re-Create Index Online● Composite Index● Management of Oracle Text Indexes

11gR2● Zero-Size Unusable Indexes and Index Partitions● System-Managed Indexes for List Partitioning● XMLIndex Enhancements

New Features

Page 6: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

6

12cR1● ONLINE Move Partition● Advanced Index Compression● Multiple Indexes on Same Set of Columns (B-tree versus bitmap, Different partitioning

strategies, Unique versus non-unique)● Enhanced Online DDL Capabilities (DROP INDEX ONLINE, ALTER INDEX UNUSABLE ONLINE,

ALTER INDEX [VISIBLE | INVISIBLE])● Partial Indexes for Partitioned Tables● Asynchronous Global Index Maintenance for DROP and TRUNCATE Partition● RDF Semantic Graph Document Indexing Enhancements● Near Real-Time Indexing● Automatic Management of Near Real-Time Indexes● Add SDATA Section to Existing Index● Forward Index● Domain Index Support of Hash Partitioned Tables

New Features

Page 7: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

7

12cR2● Online Table Move● Advanced Index Compression (High)● Tracking Index Usage (V$INDEX_USAGE_INFO)● Support for 30-Character Index Names● Extensible Indexing Enhancements● Improvements to JSON search index● Support for Range-Based XML Queries with Text-Based XML Index● Partitioning: Improving Support for XMLIndex● Text: Reverse Token Index for Left-Truncated Queries● Text: Partition-Specific Near Real-Time Indexes● Text: Improving Management of Near Real-Time Indexes● Text: Availability of Updated Documents in Index● Support for Hash and List Partitioning of Spatial Indexes

18c● Support Indexing of JSON Key Names Longer than 64 Characters● Text: Automatic Background Index Maintenance● Text: New Options to Optimize Index

New Features

Page 8: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

8

Lendas de Índices (no Oracle, pelo menos...)

Page 9: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

9

$ rlwrap sqlplus SCOTT/TIGER@PRODSQL> CREATE TABLE T AS SELECT * FROM ALL_OBJECTS;SQL> INSERT INTO T SELECT * FROM T;SQL> INSERT INTO T SELECT * FROM T;SQL> INSERT INTO T SELECT * FROM T;SQL> INSERT INTO T SELECT * FROM T;SQL> INSERT INTO T SELECT * FROM T;SQL> INSERT INTO T SELECT * FROM T;SQL> INSERT INTO T SELECT * FROM T;SQL> INSERT INTO T SELECT * FROM T;SQL> INSERT INTO T SELECT * FROM T;SQL> COMMIT;

SQL> CREATE INDEX IDX_T_OBJECT_ID ON T(OBJECT_ID);

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT OBJECT_NAME FROM T WHERE OBJECT_ID = 1000;SQL> ALTER INDEX IDX_T_OBJECT_NAME INVISIBLE;SQL> SELECT OBJECT_ID FROM T WHERE OBJECT_NAME = 'T';SQL> SELECT /*+ INDEX(T IDX_T_OBJECT_ID)*/ OBJECT_ID FROM T WHERE OBJECT_NAME = 'T';SQL> ALTER INDEX IDX_T_OBJECT_NAME VISIBLE;

SQL> SET AUTOTRACE OFF

Lenda: Usar Índice é melhor que usar Full Table Scan

Page 10: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

10

Full Table Scan depende de:• Tamanho da Tabela e Índice até o HWM (High Water Mark). • Percentual de dados que serão acessados;• Velocidade de leitura de múltiplos blocos x único bloco (System Statistics);• Distribuição das linhas nos blocos (Clustering Factor);• Parâmetros de Controle do CBO:

• OPTIMIZER_MODE (FIRST_ROWS_n / ALL_ROWS)• DB_FILE_MULTIBLOCK_READ_COUNT• OPTIMIZER_INDEX_CACHING (0 a 100, padrão 0)• OPTIMIZER_INDEX_COST_ADJ (1 a 10000, padrão 100)

Lenda: SELECT de N% da tabela não vai usar Índice

Page 11: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

11

Crie as duas tabelas abaixo com o usuário SCOTT, e compare as duas.$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T1 ASSELECT TRUNC((ROWNUM-1)/100) ID, RPAD(ROWNUM,100) NAMEFROM DBA_SOURCEWHERE ROWNUM <= 10000;

SQL> CREATE INDEX T1_IDX1 ON T1(ID);

SQL> CREATE TABLE T2 ASSELECT MOD(ROWNUM,100) ID, RPAD(ROWNUM,100) NAMEFROM DBA_SOURCEWHERE ROWNUM <= 10000;

SQL> CREATE INDEX T2_IDX1 ON T2(ID);

SQL> SELECT COUNT(*) FROM T1;SQL> SELECT COUNT(*) FROM T2;SQL> SELECT MIN(ID) FROM T1;SQL> SELECT MIN(ID) FROM T2;SQL> SELECT MAX(ID) FROM T1;SQL> SELECT MAX(ID) FROM T2;SQL> SELECT COUNT(*) FROM T1 WHERE ID = 1;SQL> SELECT COUNT(*) FROM T2 WHERE ID = 1;

Lenda: SELECT de + de N% da tabela não vai usar Índice

Page 12: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

12

Compare os planos de execução de SQL iguais para as duas tabelas.SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT ID, NAME FROM T1 WHERE ID = 1;SQL> SELECT ID, NAME FROM T2 WHERE ID = 1;SQL> SELECT ID, NAME FROM T1 WHERE ID < 5;SQL> SELECT ID, NAME FROM T2 WHERE ID < 5;SQL> SELECT ID, NAME FROM T1 WHERE ID < 10;SQL> SELECT ID, NAME FROM T2 WHERE ID < 10;

Verifique a ordenação física dos dados das tabelas.SQL> SET AUTOTRACE OFFSQL> SELECT ID, NAME FROM T1;SQL> SELECT ID, NAME FROM T2;SQL> SELECT ROWID, ID, NAME FROM T1 ORDER BY 2;SQL> SELECT ROWID, ID, NAME FROM T2 ORDER BY 2;

Lenda: SELECT de + de N% da tabela não vai usar Índice

Page 13: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

13

Lenda: SELECT de + de N% da tabela não vai usar Índice

Page 14: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

14

Compare as estatísticas das duas tabelas.SQL> SET AUTOTRACE OFFSQL> COL TABLE_NAME FORMAT A20SQL> COL INDEX_NAME FORMAT A30

SQL> SELECTT.TABLE_NAME,I.INDEX_NAME,I.CLUSTERING_FACTOR,T.BLOCKS,T.NUM_ROWS

FROM DBA_TABLES T, DBA_INDEXES IWHERE T.TABLE_NAME = I.TABLE_NAME AND

T.OWNER = 'SCOTT'ORDER BY T.TABLE_NAME, I.INDEX_NAME;

Lenda: SELECT de + de N% da tabela não vai usar Índice

Page 15: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

15

$ rlwrap sqlplus SCOTT/TIGER@PRODSQL> SELECT COUNT(*) FROM T;

COUNT(*)---------- 32997376

Elapsed: 00:00:02.15

SQL> SELECT COUNT(DISTINCT(OBJECT_TYPE)) FROM T;

COUNT(DISTINCT(OBJECT_TYPE))---------------------------- 27

Elapsed: 00:01:37.70

SQL> SELECT COUNT(DISTINCT(OBJECT_NAME)) FROM T;

COUNT(DISTINCT(OBJECT_NAME))---------------------------- 54129

Elapsed: 00:01:06.35

Lenda: Use Índices BITMAP em coluna de Estado / Sexo

Page 16: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

16

SQL> SELECT COUNT(OBJECT_TYPE) FROM T;Elapsed: 00:01:11.67

SQL> CREATE INDEX IDX_T_OBJECT_TYPE ON T(OBJECT_TYPE);Elapsed: 00:10:21.97

SQL> SELECT COUNT(OBJECT_TYPE) FROM T;Elapsed: 00:00:01.00

SQL> DROP INDEX IDX_T_OBJECT_TYPE;SQL> CREATE BITMAP INDEX IDX_T_OBJECT_TYPE_BITMAP ON T(OBJECT_TYPE);Elapsed: 00:01:14.65

SQL> SELECT COUNT(OBJECT_TYPE) FROM T;Elapsed: 00:00:00.55

SQL> CREATE INDEX IDX_T_OBJECT_NAME ON T(OBJECT_NAME);Elapsed: 00:55:18.06

SQL> SELECT COUNT(OBJECT_NAME) FROM T;Elapsed: 00:00:00.03

SQL> DROP INDEX IDX_T_OBJECT_NAME;SQL> CREATE BITMAP INDEX IDX_T_OBJECT_NAME_BITMAP ON T(OBJECT_NAME);Elapsed: 00:09:48.71

SQL> SELECT COUNT(OBJECT_NAME) FROM T;Elapsed: 00:00:00.03

Lenda: Use Índices BITMAP em coluna de Estado / Sexo

Page 17: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

17

(Porque não é) Lenda: Use Índices BITMAP em BI

1a Sessão:$ rlwrap sqlplus SCOTT/TIGER@PRODSQL> CREATE TABLE T3 (C1 NUMBER);SQL> CREATE BITMAP INDEX IDX_T3_BITMAP ON T3(C1);

SQL> INSERT INTO T3 VALUES (1);

SQL> COMMIT;

SQL> INSERT INTO T3 VALUES (1);

SQL> COMMIT;

SQL> INSERT INTO T3 VALUES (1);

SQL> INSERT INTO T3 VALUES (10);

2a Sessão:$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> INSERT INTO T3 VALUES (10);

SQL> COMMIT;

SQL> INSERT INTO T3 VALUES (1);

COMMIT;

SQL> INSERT INTO T3 VALUES (10);

SQL> INSERT INTO T3 VALUES (1);

Page 18: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

18

Execute logon com o usuário SCOTT, e verifique qual é seu arquivo de TRACE:$ rlwrap sqlplus SCOTT/TIGER@PRODSQL> COLUMN TRACEFILE FORMAT A100SQL> SELECT P.TRACEFILE FROM V$SESSION S, V$PROCESS P

WHERE S.PADDR = P.ADDR AND S.USERNAME = 'SCOTT';

Coloque sua sessão em TRACE 10053, e execute os comandos abaixo.SQL> ALTER SESSION SET EVENTS '10053 TRACE NAME CONTEXT FOREVER, LEVEL 1';SQL> SELECT COUNT(EMPNO) FROM EMP;SQL> SELECT COUNT(1) FROM EMP;SQL> SELECT COUNT(2) FROM EMP;SQL> SELECT COUNT(*) FROM EMP;SQL> SELECT COUNT(ROWID) FROM EMP;SQL> SELECT COUNT(MGR) FROM EMP;

Edite o seu arquivo de TRACE.$ vi /u01/app/oracle/rdbms/ORCL/orcl/trace/ORCL_ora_12345.trc

Lenda: SELECT COUNT(*) não usa Índice

Page 19: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

19

Lenda: SELECT COUNT(*) não usa Índice

Page 20: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

20

Lenda: SELECT COUNT(*) não usa Índice

Page 21: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

21

Lenda: Tabelas pequenas não utilizam Índice

SQL> CREATE TABLE T4 (C1 NUMBER);SQL> CREATE INDEX IDX_T4 ON T4(C1);

SQL> INSERT INTO T4 VALUES (1);SQL> INSERT INTO T4 VALUES (2);SQL> COMMIT;

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT C1 FROM T4 WHERE C1 = 1;SQL> SET AUTOTRACE OFF

Page 22: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

22

Lenda: Cláusulas de negação não utilizam Índice

SQL> CREATE TABLE T5 AS SELECT * FROM ALL_OBJECTS;SQL> CREATE INDEX IDX_T5 ON T5(OBJECT_TYPE);

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT COUNT(OBJECT_TYPE) FROM T5;SQL> SELECT COUNT(OBJECT_TYPE) FROM T5 WHERE OBJECT_TYPE = 'TABLE';SQL> SELECT COUNT(OBJECT_TYPE) FROM T5 WHERE OBJECT_TYPE != 'TABLE';SQL: SELECT COUNT(OBJECT_TYPE) FROM T5 WHERE OBJECT_TYPE NOT IN ('TABLE', 'INDEX');

SQL> SET AUTOTRACE OFF

Page 23: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

23

Lenda: Busca por NULL não utiliza Índice

SQL> UPDATE T5 SET OBJECT_TYPE = NULL WHERE OBJECT_TYPE = 'SYNONYM';SQL> COMMIT;

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT COUNT(OBJECT_TYPE) FROM T5 WHERE OBJECT_TYPE IS NULL;SQL> SELECT OBJECT_ID FROM T5 WHERE OBJECT_TYPE IS NULL;

SQL> DROP INDEX IDX_T5;SQL> CREATE BITMAP INDEX IDX_T5 ON T5(OBJECT_TYPE);SQL> SELECT COUNT(OBJECT_TYPE) FROM T5 WHERE OBJECT_TYPE IS NULL;SQL> SELECT OBJECT_ID FROM T5 WHERE OBJECT_TYPE IS NULL;

SQL> SET AUTOTRACE OFF

Page 24: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

24

(mais ou menos) Lenda: Índices em TABLESPACEs de 32k

• B-tree = Árvore Balanceada• Root Block / Branch Blocks / Leaf Blocks• Height / BEVEL (quando o Height / BLEVEL aumenta?)

Page 25: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

25

Lenda: TABLESPACE de Índices em NOLOGGING

Page 26: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

26

(+ ou -) Lenda: Desfragmente seus Índices regularmente.

Tipo de Fragmentação● Blocos logicamente contíguos espalhados fisicamente.● Espaço livre na TABLESPACE / DATAFILEs.● Espaço livre da TABELA.● Espaço livre no ÍNDICE.● Row Chaining.● Migrated Rows.● EXTENTs.

Como detectar:$ rlwrap sqlplus / AS SYSDBASQL> ALTER SESSION SET CONTAINER = PROD;SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');SQL> @OracleBaseAdvisor.sql TABLESPACE USERS NULLSQL> @OracleBaseAdvisor.sql TABLE SCOTT T5SQL> @OracleBaseAdvisor.sql INDEX SCOTT IDX_T5

Como corrigir:SQL> ALTER TABLE SCOTT.T5 MOVE;SQL> ALTER INDEX SCOTT.IDX_T5 REBUILD;SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');SQL> @OracleBaseAdvisor.sql TABLE SCOTT T5SQL> @OracleBaseAdvisor.sql INDEX SCOTT IDX_T5

Page 27: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

27

(+ ou -) Lenda: No Exadata, remova todos os Índices.

Should You Drop Indexes on Exadata?http://www.proligence.com/pres/ioug14/2014_316_Nanda_ppr.pdfArup Nanda, Long Time Oracle DBA and DMA

Page 28: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

28

● B-tree● Bitmap● IOT (Index-Organized Table)● Bitmap Join● Function-Based● Bitmap Function-Based● Text Index (CONTEXT, CTXCAT ou CTXRULE)● R-Tree Index (Spatial Data)

Variações● Partitioned Indexes● Partial Indexes● Ascending● Descending● Reverse Key● Compressed● Invisible Indexes● Virtual Indexes

Não é bem um índice...● Table Clusters

Lenda: O Oracle só tem 2 Índices: BTREE e BITMAP

Page 29: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

29

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE SMALL (ID NUMBER PRIMARY KEY, NAME VARCHAR2(10));SQL> INSERT INTO SMALL SELECT ROWNUM, 'BOWIE' FROM DUAL CONNECT BY LEVEL <=100;SQL> COMMIT;SQL> SET AUTOTRACE TRACEONLYSQL> SELECT * FROM SMALL WHERE ID = 42;SQL> SELECT * FROM SMALL WHERE ID = 42;SQL> SELECT * FROM SMALL WHERE ID = 42;SQL> SET AUTOTRACE OFF

SQL> DROP TABLE SMALL;SQL> CREATE TABLE SMALL (ID NUMBER PRIMARY KEY, NAME VARCHAR2(10)) ORGANIZATION INDEX;SQL> INSERT INTO SMALL SELECT ROWNUM, 'BOWIE' FROM DUAL CONNECT BY LEVEL <=100;SQL> COMMIT;SQL> SET AUTOTRACE TRACEONLYSQL> SELECT * FROM SMALL WHERE ID = 42;SQL> SELECT * FROM SMALL WHERE ID = 42;SQL> SELECT * FROM SMALL WHERE ID = 42;SQL> SET AUTOTRACE OFF

IOT – Index Organized Table

Page 30: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

30

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE BIG_DWH_TABLE (ID NUMBER PRIMARY KEY, ALBUM_ID NUMBER, ARTIST_ID NUMBER, COUNTRY_ID NUMBER, FORMAT_ID NUMBER, RELEASE_DATE DATE, TOTAL_SALES NUMBER);SQL> CREATE SEQUENCE DWH_SEQ; SQL> CREATE OR REPLACE PROCEDURE POP_BIG_DWH_TABLE AS

V_ID NUMBER;V_ARTIST_ID NUMBER;BEGIN

FOR V_ALBUM_ID IN 1..10000 LOOPV_ARTIST_ID:= CEIL(DBMS_RANDOM.VALUE(0,100));

FOR V_COUNTRY_ID IN 1..100 LOOPSELECT DWH_SEQ.NEXTVAL INTO V_ID FROM DUAL;INSERT INTO BIG_DWH_TABLE VALUES (V_ID, V_ALBUM_ID, V_ARTIST_ID, V_COUNTRY_ID,CEIL(DBMS_RANDOM.VALUE(0,4)), TRUNC(SYSDATE-MOD(V_ID,CEIL(DBMS_RANDOM.VALUE(0,1000)))),CEIL(DBMS_RANDOM.VALUE(0,500000)));END LOOP;

END LOOP;COMMIT;END;/

Bitmap Join Index

Page 31: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

31

SQL> EXEC POP_BIG_DWH_TABLE;SQL> CREATE BITMAP INDEX BIG_DWH_TABLE_ALBUM_ID_I ON BIG_DWH_TABLE(ALBUM_ID);

SQL> CREATE TABLE ALBUMS (ALBUM_ID NUMBER, ALBUM_DETAILS VARCHAR2(30));SQL> INSERT INTO ALBUMS SELECT ROWNUM, SUBSTR(OBJECT_NAME,1,30) FROM DBA_OBJECTS WHERE ROWNUM <= 10000;SQL> COMMIT;SQL> ALTER TABLE ALBUMS ADD PRIMARY KEY(ALBUM_ID);SQL> CREATE INDEX ALBUMS_DETAILS_I ON ALBUMS(ALBUM_DETAILS);

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT B.ID, B.ALBUM_ID, B.FORMAT_ID FROM BIG_DWH_TABLE B, ALBUMS A WHERE B.ALBUM_ID = A.ALBUM_ID AND A.ALBUM_DETAILS = 'TAB$';

SQL> DROP INDEX ALBUMS_DETAILS_I;SQL> CREATE BITMAP INDEX BIG_DWH_ALBUM_DETAILS_I ON BIG_DWH_TABLE(A.ALBUM_DETAILS) FROM BIG_DWH_TABLE B, ALBUMS A WHERE B.ALBUM_ID = A.ALBUM_ID;

SQL> SELECT B.ID, B.ALBUM_ID, B.FORMAT_ID FROM BIG_DWH_TABLE B, ALBUMS A WHERE B.ALBUM_ID = A.ALBUM_ID AND A.ALBUM_DETAILS = 'TAB$';

SQL> SET AUTOTRACE OFF

Bitmap Join Index

Page 32: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

32

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE USER_DATA (ID NUMBER(10) NOT NULL, FIRST_NAME VARCHAR2(40) NOT NULL, LAST_NAME VARCHAR2(40) NOT NULL, GENDER VARCHAR2(1), DOB DATE);

SQL> BEGIN FOR CUR_REC IN 1 .. 2000 LOOP IF MOD(CUR_REC, 2) = 0 THEN INSERT INTO USER_DATA VALUES (CUR_REC, 'John' || CUR_REC, 'Doe', 'M', SYSDATE); ELSE INSERT INTO USER_DATA VALUES (CUR_REC, 'Jayne' || CUR_REC, 'Doe', 'F', SYSDATE); END IF; COMMIT; END LOOP;END;/

Function-Based Index

Page 33: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

33

SQL> CREATE INDEX FIRST_NAME_IDX ON USER_DATA (FIRST_NAME);SQL> SET AUTOTRACE ONSQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SET AUTOTRACE OFF

SQL> DROP INDEX FIRST_NAME_IDX;SQL> CREATE INDEX FIRST_NAME_IDX ON USER_DATA (UPPER(FIRST_NAME));SQL> SET AUTOTRACE ONSQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SET AUTOTRACE OFF

Function-Based Index

Page 34: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

34

$ rlwrap sqlplus HR/HR@PROD

SQL> SET AUTOTRACE ONSQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;

SQL> CREATE INDEX EMP_TOTAL_SAL_IDX ON EMPLOYEES (12 * SALARY * COMMISSION_PCT, SALARY, COMMISSION_PCT);SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;

Function-Based Index

Page 35: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

35

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE TX AS SELECT * FROM ALL_OBJECTS;SQL> CREATE INDEX IDX_T_CREATED ON TX(CREATED);

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DDMMYYYY';SQL> SELECT OBJECT_ID FROM TX WHERE CREATED = '18092018';SQL> SELECT OBJECT_ID FROM TX WHERE TO_CHAR(CREATED,'DDMMYYYY') = '18092018';SQL> SELECT OBJECT_ID FROM TX WHERE TRUNC(CREATED,'DDMMYYYY') = '18092018';

SQL> CREATE INDEX IDX_T_CREATED_TO_CHAR ON TX(TO_CHAR(CREATED,'DDMMYYYY'));SQL> SELECT OBJECT_ID FROM TX WHERE TO_CHAR(CREATED,'DDMMYYYY') = '18092018';

SQL> CREATE INDEX IDX_T_CREATED_TRUNC ON TX(TRUNC(CREATED));SQL> SELECT OBJECT_ID FROM TX WHERE TRUNC(CREATED) = '18092018';

Function-Based Index

Page 36: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

36

$ rlwrap sqlplus HR/HR@PROD

SQL> SET AUTOTRACE ONSQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;

SQL> CREATE INDEX EMP_TOTAL_SAL_IDX ON EMPLOYEES (12 * SALARY * COMMISSION_PCT, SALARY, COMMISSION_PCT);SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;vSELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;SQL> SELECT EMPLOYEE_ID, LAST_NAME, FIRST_NAME, 12 * SALARY * COMMISSION_PCT AS "ANNUAL SAL" FROM EMPLOYEES WHERE (12 * SALARY * COMMISSION_PCT) < 30000 ORDER BY "ANNUAL SAL" DESC;

Function-Based Index

Page 37: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

37

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> DROP INDEX FIRST_NAME_IDX;SQL> CREATE BITMAP INDEX FIRST_NAME_IDX ON USER_DATA (UPPER(FIRST_NAME));SQL> SET AUTOTRACE ONSQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SELECT * FROM USER_DATA WHERE UPPER(FIRST_NAME) = 'JOHN2';SQL> SET AUTOTRACE OFF

Bitmap Function-Based Index

Page 38: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

38

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T6 AS SELECT * FROM ALL_OBJECTS;SQL> CREATE INDEX IDX_T6 ON T6(OWNER);

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT OBJECT_ID FROM T6 WHERE OWNER = 'SCOTT';SQL> SELECT OBJECT_ID FROM T6 WHERE UPPER(OWNER) = 'SCOTT';

SQL> DROP INDEX IDX_T6;SQL> CREATE INDEX IDX_T6 ON T6(UPPER(OWNER));SQL> SELECT OBJECT_ID FROM T6 WHERE OWNER = 'SCOTT';SQL> SELECT OBJECT_ID FROM T6 WHERE UPPER(OWNER) = 'SCOTT';

Extended Statistics – Function

Page 39: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

39

SQL> SET AUTOTRACE OFFSQL> SELECT /*+ GATHER_PLAN_STATISTICS */ OBJECT_ID FROM T6 WHERE OWNER = 'SCOTT';SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T6', METHOD_OPT=>'FOR ALL COLUMNS SIZE SKEWONLY ' || 'FOR COLUMNS (UPPER(OWNER)) SIZE SKEWONLY', NO_INVALIDATE=>FALSE);

SQL> SELECT /*+ GATHER_PLAN_STATISTICS */ OBJECT_ID FROM T6 WHERE OWNER = 'SCOTT';SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));

Extended Statistics – Function

Page 40: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

40

Text Index

SQL> CREATE INDEX MY_DOCS_DOC_IDX ON MY_DOCS(DOC) INDEXTYPE IS CTXSYS.CONTEXT;SQL> SELECT SCORE(1) SCORE, ID, NAME FROM MY_DOCS WHERE CONTAINS(DOC, 'SQL Server', 1) > 0;

Page 41: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

41

R-Tree Index

Page 42: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

42

R-Tree Index

Page 43: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

43

Local Prefixed IndexesSQL> CREATE INDEX INVOICES_IDX ON INVOICES (INVOICE_DATE) LOCAL

(PARTITION INVOICES_Q1 TABLESPACE USERS,PARTITION INVOICES_Q2 TABLESPACE USERS,PARTITION INVOICES_Q3 TABLESPACE USERS,PARTITION INVOICES_Q4 TABLESPACE USERS);

Local Non-Prefixed IndexesSQL> CREATE INDEX INVOICES_IDX ON INVOICES (INVOICE_NO) LOCAL

(PARTITION INVOICES_Q1 TABLESPACE USERS, PARTITION INVOICES_Q2 TABLESPACE USERS, PARTITION INVOICES_Q3 TABLESPACE USERS, PARTITION INVOICES_Q4 TABLESPACE USERS);

Global Prefixed IndexesSQL> CREATE INDEX INVOICES_IDX ON INVOICES (INVOICE_DATE)GLOBAL PARTITION BY RANGE (INVOICE_DATE)(PARTITION INVOICES_Q1

VALUES LESS THAN (TO_DATE('01/04/2001', 'DD/MM/YYYY')) TABLESPACE USERS,PARTITION INVOICES_Q2

VALUES LESS THAN (TO_DATE('01/07/2001', 'DD/MM/YYYY')) TABLESPACE USERS,PARTITION INVOICES_Q3

VALUES LESS THAN (TO_DATE('01/09/2001', 'DD/MM/YYYY')) TABLESPACE USERS,PARTITION INVOICES_Q4

VALUES LESS THAN (MAXVALUE) TABLESPACE USERS);

Partitioned Indexes

Page 44: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

44

SQL> CREATE TABLE T1 (ID NUMBER, DESCRIPTION VARCHAR2(50), CREATED_DATE DATE)PARTITION BY RANGE (CREATED_DATE)(PARTITION PART_2014

VALUES LESS THAN (TO_DATE('01/01/2015', 'DD/MM/YYYY')),PARTITION PART_2015

VALUES LESS THAN (TO_DATE('01/01/2016', 'DD/MM/YYYY')) INDEXING ON,PARTITION PART_2016

VALUES LESS THAN (TO_DATE('01/01/2017', 'DD/MM/YYYY')) INDEXING OFF);

SQL> ALTER TABLE T1 MODIFY PARTITION PART_2015 INDEXING OFF;SQL> ALTER TABLE T1 MODIFY PARTITION PART_2016 INDEXING ON;

SQL> CREATE INDEX T1_LOCAL_PARTIAL_IDX ON T1(CREATED_DATE) LOCAL INDEXING FULL;SQL> CREATE INDEX T1_LOCAL_PARTIAL_IDX ON T1(CREATED_DATE) LOCAL INDEXING PARTIAL;

Partial Indexes (12c)

Page 45: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

45

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T7 AS SELECT * FROM ALL_OBJECTS;SQL> CREATE INDEX IDX_T7 ON T7(OBJECT_ID);SQL> SET AUTOTRACE TRACEONLYSQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;

SQL> ALTER SESSION SET OPTIMIZER_MODE = 'CHOOSE';SQL> ALTER SESSION SET OPTIMIZER_DYNAMIC_SAMPLING = 0;SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS(USER, 'T7');SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;

Ascending / Descending

Page 46: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

46

SQL> DROP INDEX IDX_T7;SQL> CREATE INDEX IDX_T7 ON T7(OBJECT_ID DESC);SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS(USER, 'T7');SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;SQL> SELECT * FROM T7 WHERE OBJECT_ID BETWEEN 1 AND 1000 ORDER BY OBJECT_ID DESC;

SQL> SET AUTOTRACE OFFSQL> SELECT INDEX_TYPE FROM USER_INDEXES WHERE INDEX_NAME = 'IDX_T7';

Ascending / Descending

Page 47: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

47

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T8 (C1 NUMBER);SQL> CREATE INDEX IDX_T8 ON T8(C1);SQL> CREATE SEQUENCE S1 START WITH 1 INCREMENT BY 1 CACHE 1000;

$ sqlplus SCOTT/TIGER@PROD @ReverseKeyIndex.sql

$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &

Reverse Key

Page 48: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

48

SQL> TRUNCATE TABLE T8;SQL> DROP INDEX IDX_T8;SQL> CREATE INDEX IDX_T8 ON T8(C1) REVERSE;SQL> DROP SEQUENCE S1;SQL> CREATE SEQUENCE S1 START WITH 1 INCREMENT BY 1 CACHE 1000;

$ sqlplus SCOTT/TIGER@PROD @ReverseKeyIndex.sql

$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &$ sqlplus -s SCOTT/TIGER@PROD @ReverseKeyIndex.sql &

Reverse Key

Page 49: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

49

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T9 AS SELECT * FROM ALL_OBJECTS;SQL> CREATE INDEX IDX_T9 ON T9(OBJECT_ID);SQL> SET AUTOTRACE ONSQL> SELECT COUNT(OBJECT_ID) FROM T9;SQL> SELECT COUNT(OBJECT_ID) FROM T9;SQL> SELECT COUNT(OBJECT_ID) FROM T9;

SQL> DROP INDEX IDX_T9;SQL> CREATE INDEX IDX_T9 ON T9(OBJECT_ID) COMPRESS;SQL> SELECT COUNT(OBJECT_ID) FROM T9;SQL> SELECT COUNT(OBJECT_ID) FROM T9;SQL> SELECT COUNT(OBJECT_ID) FROM T9;

SQL> DROP INDEX IDX_T9;SQL> CREATE INDEX IDX_T9 ON T9(OBJECT_ID) COMPRESS ADVANCED LOW;SQL> SELECT COUNT(OBJECT_ID) FROM T9;SQL> SELECT COUNT(OBJECT_ID) FROM T9;SQL> SELECT COUNT(OBJECT_ID) FROM T9;

SQL> DROP INDEX IDX_T9;SQL> CREATE INDEX IDX_T9 ON T9(OBJECT_ID) COMPRESS ADVANCED HIGH;SQL> SELECT COUNT(OBJECT_ID) FROM T9;SQL> SELECT COUNT(OBJECT_ID) FROM T9;SQL> SELECT COUNT(OBJECT_ID) FROM T9;

Compressed Index

Page 50: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

50

SQL> DROP INDEX IDX_T9;SQL> CREATE INDEX IDX_T9 ON T9(OWNER, OBJECT_NAME);SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';

SQL> DROP INDEX IDX_T9;SQL> CREATE INDEX IDX_T9 ON T9(OWNER, OBJECT_NAME) COMPRESS;SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';

SQL> DROP INDEX IDX_T9;SQL> CREATE INDEX IDX_T9 ON T9(OWNER, OBJECT_NAME) COMPRESS 1;SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';

SQL> DROP INDEX IDX_T9;SQL> CREATE INDEX IDX_T9 ON T9(OWNER, OBJECT_NAME) COMPRESS ADVANCED LOW;SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';

SQL> DROP INDEX IDX_T9;SQL> CREATE INDEX IDX_T9 ON T9(OWNER, OBJECT_NAME) COMPRESS ADVANCED HIGH;SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';SQL> SELECT COUNT(OBJECT_NAME) FROM T9 WHERE OWNER = 'SYS';

Compressed Index

Page 51: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

51

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T10 AS SELECT * FROM ALL_OBJECTS;SQL> CREATE INDEX IDX_T10 ON T10(OWNER);

SQL> SET AUTOTRACE TRACEONLYSQL> SELECT COUNT(OBJECT_NAME) FROM T10 WHERE OWNER = 'SYS';

SQL> ALTER INDEX IDX_T10 INVISIBLE;SQL> SELECT COUNT(OBJECT_NAME) FROM T10 WHERE OWNER = 'SYS';

SQL> ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES=TRUE;SQL> SELECT COUNT(OBJECT_NAME) FROM T10 WHERE OWNER = 'SYS';

SQL> ALTER INDEX IDX_T10 VISIBLE;SQL> SELECT COUNT(OBJECT_NAME) FROM T10 WHERE OWNER = 'SYS';

SQL> SET AUTOTRACE OFF

Invisible Index

Page 52: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

52

SQL> CREATE INDEX IDX_T_OWNER_OBJECT_NAME ON T(OWNER, OBJECT_NAME);Control+C

SQL> CREATE INDEX IDX_T_OWNER_OBJECT_NAME ON T(OWNER, OBJECT_NAME) NOSEGMENT;

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT COUNT(OBJECT_NAME) FROM T WHERE OWNER = 'SYS';

SQL> ALTER SESSION SET "_USE_NOSEGMENT_INDEXES"=TRUE;SQL> SELECT COUNT(OBJECT_NAME) FROM T WHERE OWNER = 'SYS';

SQL> SET AUTOTRACE OFF

Virtual Index

Page 53: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

53

• Utilize se as tabelas são frequentemente utilizadas em JOINs (NF e ITEM_NF);• Utilize se as tabelas sofrem mais JOINs do que operações DML;• Evite se é utilizado FTS de apenas uma das tabelas;• Evite para linhas largas (PEDIDO_NOTA_FISCAL com OBS);• Evite se o número de linhas nas chaves das duas tabelas é muito diferente.

Índices - Table Clusters

Page 54: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

54

Table Cluster

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T_OBJECT_TYPE (OBJECT_TYPE_ID NUMBER GENERATED ALWAYS AS IDENTITY, OBJECT_TYPE_NAME VARCHAR2(255));SQL> INSERT INTO T_OBJECT_TYPE (OBJECT_TYPE_NAME) SELECT DISTINCT OBJECT_TYPE FROM ALL_OBJECTS;SQL> COMMIT;

SQL> CREATE TABLE T11 (OBJECT_ID, OWNER, OBJECT_NAME, OBJECT_TYPE_ID) AS SELECT T1.OBJECT_ID, T1.OWNER, T1.OBJECT_NAME, T2.OBJECT_TYPE_ID FROM ALL_OBJECTS T1, T_OBJECT_TYPE T2 WHERE T1.OBJECT_TYPE = T2.OBJECT_TYPE_NAME;

SQL> CREATE INDEX T11_IDX_01 ON T11(OBJECT_ID);SQL> CREATE INDEX T11_IDX_02 ON T11(OBJECT_TYPE_ID);SQL> CREATE INDEX T11_IDX_03 ON T11(OWNER);SQL> CREATE INDEX T_OBJECT_TYPE_IDX_01 ON T_OBJECT_TYPE(OBJECT_TYPE_ID);

SQL> SET AUTOTRACE TRACEONLYSQL> SELECT T1.OBJECT_ID, T1.OWNER, T1.OBJECT_NAME, T2.OBJECT_TYPE_NAME FROM T11 T1, T_OBJECT_TYPE T2 WHERE T1.OBJECT_TYPE_ID = T2.OBJECT_TYPE_ID AND T1.OWNER = 'SCOTT';SQL> SELECT T1.OBJECT_ID, T1.OWNER, T1.OBJECT_NAME, T2.OBJECT_TYPE_NAME FROM T11 T1, T_OBJECT_TYPE T2 WHERE T1.OBJECT_TYPE_ID = T2.OBJECT_TYPE_ID AND T1.OWNER = 'SCOTT';SQL> SELECT T1.OBJECT_ID, T1.OWNER, T1.OBJECT_NAME, T2.OBJECT_TYPE_NAME FROM T11 T1, T_OBJECT_TYPE T2 WHERE T1.OBJECT_TYPE_ID = T2.OBJECT_TYPE_ID AND T1.OWNER = 'SCOTT';

Page 55: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

55

Table Cluster

SQL> SET AUTOTRACE OFFSQL> DROP TABLE T11;SQL> DROP TABLE T_OBJECT_TYPE;

SQL> CREATE CLUSTER T_CLUSTER (OBJECT_TYPE_ID NUMBER);SQL> CREATE INDEX T_CLUSTER_IDX_01 ON CLUSTER T_CLUSTER;SQL> CREATE TABLE T_OBJECT_TYPE (OBJECT_TYPE_ID NUMBER GENERATED ALWAYS AS IDENTITY, OBJECT_TYPE_NAME VARCHAR2(255)) CLUSTER T_CLUSTER(OBJECT_TYPE_ID);SQL> INSERT INTO T_OBJECT_TYPE (OBJECT_TYPE_NAME) SELECT DISTINCT OBJECT_TYPE FROM ALL_OBJECTS;SQL> COMMIT;

SQL> CREATE TABLE T11 (OBJECT_ID, OWNER, OBJECT_NAME, OBJECT_TYPE_ID) CLUSTER T_CLUSTER(OBJECT_TYPE_ID) AS SELECT T1.OBJECT_ID, T1.OWNER, T1.OBJECT_NAME, T2.OBJECT_TYPE_ID FROM ALL_OBJECTS T1, T_OBJECT_TYPE T2 WHERE T1.OBJECT_TYPE = T2.OBJECT_TYPE_NAME;

SQL> CREATE INDEX T11_IDX_01 ON T11(OBJECT_ID);SQL> CREATE INDEX T11_IDX_02 ON T11(OBJECT_TYPE_ID);SQL> CREATE INDEX T11_IDX_03 ON T11(OWNER);SQL> CREATE INDEX T_OBJECT_TYPE_IDX_01 ON T_OBJECT_TYPE(OBJECT_TYPE_ID);SQL> SET AUTOTRACE TRACEONLYSQL> SELECT T1.OBJECT_ID, T1.OWNER, T1.OBJECT_NAME, T2.OBJECT_TYPE_NAME FROM T11 T1, T_OBJECT_TYPE T2 WHERE T1.OBJECT_TYPE_ID = T2.OBJECT_TYPE_ID AND T1.OWNER = 'SCOTT';SQL> SELECT T1.OBJECT_ID, T1.OWNER, T1.OBJECT_NAME, T2.OBJECT_TYPE_NAME FROM T11 T1, T_OBJECT_TYPE T2 WHERE T1.OBJECT_TYPE_ID = T2.OBJECT_TYPE_ID AND T1.OWNER = 'SCOTT';SQL> SELECT T1.OBJECT_ID, T1.OWNER, T1.OBJECT_NAME, T2.OBJECT_TYPE_NAME FROM T11 T1, T_OBJECT_TYPE T2 WHERE T1.OBJECT_TYPE_ID = T2.OBJECT_TYPE_ID AND T1.OWNER = 'SCOTT';

SQL> SET AUTOTRACE OFF

Page 56: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

56

Table Cluster

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> SET AUTOTRACE TRACEONLYSQL> SELECT T2.NAME FROM T1, T2 WHERE T1.ID = T2.ID AND T1.ID < 10;SQL> SELECT T2.NAME FROM T1, T2 WHERE T1.ID = T2.ID AND T1.ID < 10;SQL> SELECT T2.NAME FROM T1, T2 WHERE T1.ID = T2.ID AND T1.ID < 10;

SQL> SET AUTOTRACE OFF

Page 57: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

57

Table Cluster

SQL> DROP TABLE T1;SQL> DROP TABLE T2;

SQL> CREATE CLUSTER T1_T2_CLUSTER (ID NUMBER);SQL> CREATE INDEX T1_T2_CLUSTER_IDX_01 ON CLUSTER T1_T2_CLUSTER;

SQL> CREATE TABLE T1 CLUSTER T1_T2_CLUSTER(ID) AS SELECT TRUNC((ROWNUM-1)/100) ID, RPAD(ROWNUM,100) NAME FROM DBA_SOURCE WHERE ROWNUM <= 10000;SQL> CREATE INDEX T1_IDX1 ON T1(ID);SQL> CREATE TABLE T2 CLUSTER T1_T2_CLUSTER(ID) AS SELECT MOD(ROWNUM,100) ID, RPAD(ROWNUM,100) NAME FROM DBA_SOURCE WHERE ROWNUM <= 10000;SQL> CREATE INDEX T2_IDX1 ON T2(ID);

SQL> SET AUTOTRACE TRACEONLYSQL> SELECT T2.NAME FROM T1, T2 WHERE T1.ID = T2.ID AND T1.ID < 10;SQL> SELECT T2.NAME FROM T1, T2 WHERE T1.ID = T2.ID AND T1.ID < 10;SQL> SELECT T2.NAME FROM T1, T2 WHERE T1.ID = T2.ID AND T1.ID < 10;

SQL> SET AUTOTRACE OFF

Page 58: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

58

● Prefira índices BTREE em colunas de alta seletividade (CPF, NF);● Prefira índices BITMAP em colunas de baixa seletividade (ESTADO, CIDADE);● Evite índices em colunas utilizadas em cláusula WHERE apenas com funções;● Prefira índices BITMAP para grandes tabelas;● Evite índices BITMAP em colunas que sofrem muito DML, principalmente de forma

concorrente;● Utilize IOTs em PKs frequentemente utilizadas na cláusula WHERE;● Utilize Function Based Index em colunas utilizadas em cláusula WHERE mais frequentemente

com funções;● Utilize índices REVERSE em colunas que sofrem DML em alta concorrência;●Utilize índices Partitioned Partial em Partições se apenas algumas partições sofrerão SELECT.● Utilize índices e funções TEXT ao invés de LIKE.

Índices – Guidelines – Tipos de Índices

Page 59: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

59

• Full Table Scan (FTS)• Table Access by ROWID• Index Unique Scan• Index Range Scan• Index Range Scan descending• Index Skip Scan• Fast Full Index Scan (FFIS)• Full Index Scan (FIS)

Access Paths

Page 60: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

60

Index Unique Scan

Page 61: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

61

Index Unique Scan

• Utilizado com Primary Key ou Unique Key;• Consistent Gets mínimo = (Rows x 2) + BLEVEL + 1.

Page 62: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

62

Index Range Scan

Page 63: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

63

Index Range Scan

• Utilizado com Primary Key, Unique Key, ou Non-unique Key;• Consistent Gets mínimo = (Rows x 2) + BLEVEL + 1.

Page 64: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

64

Index Range Scan - Sort

Page 65: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

65

Index Full Scan

Page 66: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

66

Index Full Scan

Utilizado quando:• Não há predicado, mas uma das colunas está indexada;• Predicado não é a primeira coluna de um índice;• Um índice pode economizar um SORT.

Page 67: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

67

Index Full Scan

• Sem predicado, mas uma das colunas está indexada;• Predicado não é a primeira coluna de um índice;• Um índice pode economizar um SORT.

Page 68: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

68

Index Full Scan

• Sem predicado, mas uma das colunas está indexada;• Predicado não é a primeira coluna de um índice;• Um índice pode economizar um SORT.

Page 69: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

69

Index Full Scan

• Sem predicado, mas uma das colunas está indexada;• Predicado não é a primeira coluna de um índice;• Um índice pode economizar um SORT.

Page 70: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

70

Index Full Scan

Page 71: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

71

Index Full Scan

Page 72: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

72

Index Skip Scan

• O predicado contém uma condição em uma coluna indexada, mas esta coluna não é a primeira do índice, e as primeiras colunas tem um baixo NDV.

Page 73: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

73

Index Fast Full Scan● Utilizado quando todas as colunas do SELECT estão incluídas no índice;● Utiliza MBRC;● Não há acesso à tabela;● Não pode ser utilizado para evitar um SORT;● Pelo menos uma das colunas do índice deve ser NOT NULL.

Page 74: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

74

Índices e Access Paths

Page 75: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

75

Índices e Access Paths

Page 76: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

76

Geral● Utilize tipos de dados corretos, nos objetos e nos SQLs.● Crie índices em colunas utilizadas na cláusula WHERE;● Crie índices em colunas utilizadas em JOINs;● Crie índices em colunas de alta seletividade;● Crie índices em colunas de baixa seletividade mas que contenham dados com seletividades muito distintas;● Crie índices compostos em colunas utilizadas frequentemente na mesma cláusula WHERE;● Em índices compostos, utilize as colunas com maior seletividade à esquerda;● Crie índices em colunas utilizadas em SORTs de alto custo.● Se um valor de uma coluna indexada não for utilizado em uma cláusula WHERE, verifique se este valor pode ser trocado para NULL;● Se um valor de uma coluna indexada utilizado em uma cláusula WHERE for raro, considere um Function Based Index:

CREATE INDEX IDX_ORDER_NEW ON ORDERS(CASE STATUS WHEN 'N' THEN 'N' ELSE NULL END);

Índices - Guidelines

Page 77: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

77

Conversão implícita

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T12 (OBJECT_ID VARCHAR(255), OBJECT_NAME VARCHAR(255));SQL> CREATE INDEX IDX_T12 ON T12(OBJECT_ID);SQL> INSERT INTO T12 SELECT OBJECT_ID, OBJECT_NAME FROM ALL_OBJECTS;SQL> COMMIT;

SQL> SET AUTOTRACE TRACEONLY EXPLAINSQL> SELECT COUNT(*) FROM T12 WHERE OBJECT_ID=1;SQL> SELECT COUNT(*) FROM T12 WHERE OBJECT_ID='1';

SQL> SET AUTOTRACE OFFSQL> INSERT INTO T12 VALUES ('X', 'X');SQL> SELECT COUNT(*) FROM T12 WHERE OBJECT_ID=1;SQL> ROLLBACK;SQL> SELECT COUNT(*) FROM T12 WHERE OBJECT_ID=1;

Page 78: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

78

SQL> SELECT COUNT(*) FROM T;

SQL> SELECT COUNT(DISTINCT(OBJECT_ID)) FROM T;SQL> SELECT COUNT(DISTINCT(OWNER)) FROM T;SQL> SELECT COUNT(DISTINCT(OBJECT_TYPE)) FROM T;

SQL> SELECT COUNT(OWNER), OWNER FROM T GROUP BY OWNER ORDER BY 1;SQL> SELECT COUNT(OBJECT_TYPE), OBJECT_TYPE FROM T GROUP BY OBJECT_TYPE ORDER BY 1;

Índices - Guidelines

Page 79: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

79

SQL> COLUMN TABLE_NAME FORMAT A20SQL> COLUMN COLUMN_NAME FORMAT A20SQL> COLUMN INDEX_NAME FORMAT A30

SQL> SELECTB.TABLE_NAME, A.INDEX_NAME, A.COLUMN_POSITION, B.COLUMN_NAME, C.BLEVEL, C.CLUSTERING_FACTOR, C.NUM_ROWS,C.LEAF_BLOCKS

FROMDBA_IND_COLUMNS A,DBA_TAB_COLUMNS B,DBA_INDEXES C

WHEREA.TABLE_OWNER = B.OWNER ANDA.TABLE_OWNER = C.OWNER ANDA.TABLE_NAME = B.TABLE_NAME ANDA.INDEX_NAME = C.INDEX_NAME ANDA.COLUMN_NAME = B.COLUMN_NAME ANDA.TABLE_OWNER = 'IONV_SYNC' ANDA.TABLE_NAME IN ('IONV_HISTPED_ITENS')

ORDER BYB.TABLE_NAME,A.INDEX_NAME,A.COLUMN_POSITION,B.COLUMN_NAME;

Índices - Guidelines

Page 80: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

80

Geral● Prefira índices PRIMARY KEY, se o modelo permitir;● Prefira índices UNIQUE, se o modelo permitir, mas PRIMARY KEY não é possível;● Busque sempre minimizar a quantidade de índices de uma tabela;● Crie índices em Foreign Keys (FKs) que sofrem DML de forma concorrente;● Evite índices em colunas que sofrem muitos UPDATEs;● Evite índices em tabelas que sofrem muitos INSERTs ou DELETEs.● Em alterações em lote, remova os índices (e CONSTRAINTs), se possível.● Considere o espaço utilizado por um índice (60% - 40%).

Índices - Guidelines

Page 81: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

81

Impacto de Índices

$ rlwrap sqlplus SCOTT/TIGER@PRODSQL> CREATE TABLE T13 (C1 NUMBER);

$ time perl OTI.pl 10000$ time perl OTI.pl 10000$ time perl OTI.pl 10000

SQL> CREATE INDEX IDX_BTREE_T13 ON T13(C1);$ time perl OTI.pl 10000$ time perl OTI.pl 10000$ time perl OTI.pl 10000

SQL> DROP INDEX IDX_BTREE_T13;SQL> CREATE BITMAP INDEX IDX_BITMAP_T13 ON T13(C1);$ time perl OTI.pl 10000$ time perl OTI.pl 10000$ time perl OTI.pl 10000

Page 82: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

82

$ rlwrap sqlplus SCOTT/TIGER@PROD

SQL> CREATE TABLE T14 AS SELECT * FROM ALL_OBJECTS;SQL> INSERT INTO T14 SELECT * FROM T14;SQL> INSERT INTO T14 SELECT * FROM T14;SQL> INSERT INTO T14 SELECT * FROM T14;SQL> INSERT INTO T14 SELECT * FROM T14;SQL> COMMIT;

SQL> CREATE TABLE T15 AS SELECT * FROM T14 WHERE 1=0;

SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;

Impacto de Índices

Page 83: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

83

Verifique o tempo de sua duplicação, mas com índices.SQL> CREATE INDEX T1_IDX_01 ON T15(OWNER);SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;

SQL> CREATE INDEX T15_IDX_02 ON T15(OBJECT_NAME);SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;

Impacto de Índices

Page 84: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

84

Verifique o tempo de sua duplicação, mas um índice composto.SQL> DROP INDEX T15_IDX_01;SQL> DROP INDEX T15_IDX_02;SQL> CREATE INDEX T15_IDX_03 ON T15(OWNER,OBJECT_NAME);SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> TRUNCATE TABLE T15;

Impacto de Índices

Page 85: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

85

Verifique o uso dos índices.SQL> CONN SCOTT/TIGER@PRODSQL> DROP INDEX T15_IDX_03;SQL> INSERT INTO T15 SELECT * FROM T14;SQL> CREATE INDEX T15_IDX_01 ON T15(OWNER);SQL> CREATE INDEX T15_IDX_02 ON T15(OBJECT_NAME);SQL> ALTER INDEX T15_IDX_01 MONITORING USAGE;SQL> ALTER INDEX T15_IDX_02 MONITORING USAGE;

SQL> COL INDEX_NAME FORMAT A40SQL> SELECT INDEX_NAME, MONITORING, USED FROM V$OBJECT_USAGE;SQL> SELECT * FROM T15 WHERE OWNER = 'SCOTT';SQL> SELECT COUNT(*) FROM T15 WHERE OWNER = 'SYS';SQL> SELECT COUNT(*) FROM T15 WHERE OWNER = 'SYSTEM';SQL> SELECT INDEX_NAME, MONITORING, USED, START_MONITORINGFROM V$OBJECT_USAGE;

Problemas a se considerar ao remover índices: - Não está utilizando o índice, mas deveria utilizar; - Após o DROP, não é utilizado outro índice; - Uso da seletividade em índices compostos, mesmo sem utilizar a coluna; - FKs (Enqueue TM).

Impacto de Índices

Page 86: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

86

- Ponto de aumento de Cost ou Rows. - Diferença entre A-Rows e E-Rows. - Nested Loops com grande quantidade de Starts. - FTS / FIS em objetos com filtros. - Desperdício:

--------------------------------------------------------------------------| Id | Operation | Name | Starts | E-Rows | A-Rows |--------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | | 0 || 1 | MERGE JOIN | | 1 | 10 | 0 ||* 2 | TABLE ACCESS BY INDEX ROWID | T1 | 1 | 10 | 10 || 3 | INDEX FULL SCAN | T1_PK | 1 | 10000 | 10000 ||* 4 | SORT JOIN | | 10 | 10 | 0 ||* 5 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 10 | 10 || 6 | INDEX FULL SCAN | T2_PK | 1 | 10000 | 10000 |--------------------------------------------------------------------------

Plano de Execução: O que procurar?

Page 87: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

87

Plano de Execução: O que procurar?

● SQLT (MOS 215187.1)● oratop (MOS 1500864.1)

Page 88: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

88

Isenção de responsabilidade

● Não acredite em tudo o que lê. Questione tudo.● Por algo estar escrito, não significa que é verdade.● O que é verdade aqui, pode não ser verdade lá.● O que era verdade ontem, pode não ser verdade hoje.● O que é verdade hoje, pode não ser verdade amanhã.● Se os fatos não se adequam à teoria, modifique a teoria.● Questione, e só acredite em fatos: teste.● Também tente provar que você está errado.● Implemente a solução no menor escopo possível.● Quando você mudar algo, pode acontecer uma de três coisas.

Page 89: Oracle Tuning – Índicesnervinformatica.com.br/Downloads/Materiais/OTI.pdf · Oracle Tuning – Índices Em Oracle Enterprise Edition 19c (RU 19.4.0.0) Em CDB Architecture Em Oracle

89

Perguntas?

Ricardo Portilho [email protected]


Recommended