Sei sulla pagina 1di 468

Oracle Database 11 g: workshop di ottimizzazione di istruzioni SQL

D52163IT10

Versione 1.0

Settembre 2009

D 62530

di ottimizzazione di istruzioni SQL D52163IT10 Versione 1.0 Settembre 2009 D 62530 Volume II Guida per

Volume II Guida per lo studente

Autore

Jean-François Verrier

Contributi tecnici e revisioni

Muriel Fry (ringraziamenti speciali) Joel Goodman Harald van Breederode Jörn Bartels Pekka Siltala Bernard Soleillant

James Spiller Clay Fuller Ira Singer Christopher Andrews Magnus Isaksson Sean Kim Trevor Bauwen Yash Jain

Redattori

Amitha Narayan

Raj Kumar

Disegnatore grafico

Priya Saxena

Editori

Jothi Lakshmi Veena Narasimhan

Copyright © 2009, Oracle. Tutti i diritti riservati.

Disclaimer

Questo documento contiene informazioni proprietarie ed è protetto dalle leggi sul copyright e sulla proprietà intellettuale. È consentito copiare e stampare questo documento per esclusivo uso personale in un corso di formazione Oracle. Il presente documento non può essere modificato o alterato in alcun modo. Tranne nei casi in cui l’uso di tale documento costituisca un “uso legittimo” in base alla legge sul copyright, non è consentito utilizzare, condividere, scaricare, caricare, copiare, stampare, visualizzare, realizzare, riprodurre, pubblicare, concedere in licenza, inviare, trasmettere o distribui re questo documento interamente o in parte senza espressa autorizzazione di Oracle.

Le informazioni contenute in questo documento sono soggette a modifiche senza preavviso. Qualora riscontrasse dei problemi nella documentazione, l’utente è pregato di segnalarli per iscritto a: Oracle University, 500 Oracle Parkway, Redwood Shores, California 94065 USA. Oracle non garantisce che il presente documento sia privo di errori.

Restricted Rights Notice

Se questa documentazione viene fornita al Governo degli Stati Uniti o ad altre persone che utilizzano tale documentazione per conto del Governo degli Stati Uniti, viene applicato quanto segue:

U.S. GOVERNMENT RIGHTS The U.S. Government’s rights to use, modify, reproduce, release, perform, display, or disclose these training materials are restricted by the terms of the applicable Oracle license agreement and/or the applicable U.S. Government contract.

Trademark Notice

Oracle è un marchio registrato di Oracle Corporation e/o delle relative consociate.

Altri nomi possono essere marchi dei rispettivi proprietari.

Sommario

1 Esplorazione dell'architettura di Oracle Database Obiettivi 1-2

Architettura di Oracle Database Server: panoramica

Connessione all'istanza di database

Strutture di memoria di Oracle Database: panoramica

Database buffer cache

Redo log buffer

Shared pool

Elaborazione di un'istruzione DML: esempio Elaborazione dell'istruzione COMMIT: esempio

Large pool

Java pool e Streams pool

PGA (Program Global Area)

Ruoli del processo di background

ASMM (Automatic Shared Memory Management)

Gestione automatica della memoria nell'esecuzione SQL

Gestione automatica della memoria

Architettura della memoria del database

Strutture logiche e fisiche del database

Segmenti, extent e blocchi

Tablespace SYSTEM e SYSAUX Riepilogo 1-25 Esercitazione 1: panoramica

1-3

1-6

1-4

1-7

1-8

1-9

1-12

1-10

1-11

1-13

1-14

1-15

1-16

1-18

1-19

1-21

1-23

1-26

1-24

2 Introduzione al tuning SQL

Obiettivi 2-2

Motivi di prestazioni SQL inefficienti

SQL inefficienti: esempi

Soluzioni di monitoraggio delle prestazioni

2-3

2-5

2-7

1-17

Strumenti di monitoraggio e tuning: panoramica

2-9

Pagine delle prestazioni EM per il tuning reattivo

2-10

Strumenti di tuning: panoramica

Attività di tuning SQL: panoramica

Dimensioni del tuning del tempo CPU e del tempo di attesa

Scalabilità con progettazione, implementazione e configurazione

dell'applicazione 2-14

Errori comuni dei sistemi dei clienti

Metodologia di ottimizzazione proattiva

Semplicità nella progettazione delle applicazioni

Modellazione di dati

2-11

2-12

2-13

2-15

2-17

2-18

2-19

iii

Progettazione di tabelle Progettazione di indici

Uso di viste

Esecuzione SQL efficiente

Scrittura di istruzioni SQL per la condivisione dei cursori

2-20

2-21

2-22

2-23

Lista di controllo delle prestazioni Riepilogo 2-27

Esercitazione 2: panoramica

2-28

2-26

2-25

3 Introduzione all'ottimizzatore Obiettivi 3-2 SQL (Structured Query Language)

3-3

Rappresentazione delle istruzioni SQL

3-4

Implementazione delle istruzioni SQL

3-5

Elaborazione delle istruzioni SQL: panoramica

Elaborazione delle istruzioni SQL: operazioni 3-7

Operazione 1: Creare un cursore

Operazione 2: Analizzare l'istruzione Operazioni 3 e 4: Descrivere e definire

Operazioni 5 e 6: Eseguire l'associazione tramite bind e la parallelizzazione

Operazioni da 7 a 9

PL/SQL per l'elaborazione delle istruzioni SQL: esempio

Analisi delle istruzioni SQL: panoramica

Motivi per l'utilizzo di un ottimizzatore

Ottimizzazione durante l'operazione di hard parse

Trasformatore: Espansione OR esempio

Trasformatore: esempio di annullamento della nidificazione di subquery

Trasformatore: esempio di unione di viste

Trasformatore: esempio di esecuzione del push dei predicati

Trasformatore: esempio di transitività

Ottimizzatore basato sui costi

Stimatore: selettività Stimatore: cardinalità

3-6

3-8

3-9

3-10

3-11

3-12

3-13

3-14

3-16

3-18

3-19

3-21

3-20

3-22

3-23

3-24

3-25

3-26

Stimatore: costi

3-27

Plan Generator

3-28

Controllo delle impostazioni dell'ottimizzatore

Funzioni dell'ottimizzatore e release di Oracle Database

Riepilogo 3-35

Esercitazione 3: panoramica

3-29

3-36

3-34

iv

4 Operatori dell'ottimizzatore Obiettivi 4-2 Operazioni relative alle row source

4-3

Strutture principali e percorsi di accesso

Scansione dell'intera tabella

Scansioni di tabelle intere: casi pratici

ROWID Scan

Scansioni a campione di tabelle

Indici: panoramica

Indici B*-tree normali

Scansioni dell'indice

Scansione univoca dell'indice

Scansione di intervallo dell'indice

Scansione di intervallo dell'indice: decrescente

Scansione di intervallo dell'indice

Scansione di intervallo dell'indice: basato su funzioni

Scansione intera dell'indice

Scansione intera veloce dell'indice

Scansione con salto dell'indice

Scansione con salto dell'indice: esempio

4-4

4-5

4-6

4-7

4-8

4-10

4-12

4-13

4-14

4-15

4-17

4-20

4-16

4-19

4-21

4-23

Scansione dell'index join

4-24

Operazione AND-EQUAL

4-25

Indici B*-tree e valori nulli

4-26

4-18

Utilizzo degli indici: presa in considerazione delle colonne nullable

Tabelle organizzate a indice

Scansioni di tabelle organizzate a indice

Indici bitmap

4-28

4-29

4-30

4-27

Accesso tramite indici bitmap: esempi

4-32

Combinazione di indici bitmap: esempi

4-33

Combinazione di percorsi di accesso tramite indici bitmap

Operazioni bitmap

4-35

Indice bitmap join

4-36

Indici composti

Indice invisibile: panoramica

Indici invisibili: esempi

4-37

4-39

4-38

Regole per gestire gli indici

Analisi dell'uso degli indici

Esercitazione 4: panoramica

Cluster 4-45

Quando sono utili i cluster?

Percorso di accesso del cluster: esempi

Operatori di ordinamento

Operatore Buffer Sort

Inlist Iterator

4-54

Operatore View

Operatore Count StopKey

4-40

4-42

4-44

4-46

4-50

4-52

4-53

4-55

v

4-49

4-34

Operatori Min/Max e First Row

4-56

Metodi di join

Join dei loop nidificati

Join dei loop nidificati: recupero tramite fetch preliminare

Join dei loop nidificati: implementazione 11 g

Join sort-merge

Hash join

Join cartesiano

Tipi di join

Equijoin e nonequijoin

Outer join

Semijoin 4-68

Antijoin 4-69

Altre operazioni N-array

Operazioni di filtro

Operazione di concatenazione

UNION [ALL], INTERSECT, MINUS 4-73

Operatore ResultCache

Riepilogo 4-75 Esercitazione 4: panoramica

4-71

4-57

4-58

4-61

4-62

4-64

4-63

4-65

4-67

4-66

4-70

4-72

4-74

4-76

4-59

5 Interpretazione dei piani di esecuzione

Obiettivi 5-2 Definizione di piano di esecuzione

5-3

Dove trovare i piani di esecuzione

5-4

Visualizzazione dei piani di esecuzione

Il comando EXPLAINPLAN

Il Comando EXPLAIN PLAN: esempio

5-7

5-6

5-9

PLAN_TABLE 5-10

Visualizzazione di PLAN_TABLE: TYPICAL

Visualizzazione di PLAN_TABLE: ALL

Visualizzazione di PLAN_TABLE: ADVANCED

AUTOTRACE 5-15

La Sintassi di AUTOTRACE

AUTOTRACE: esempi 5-17

AUTOTRACE: statistiche 5-18

Utilizzo della vista V$SQL_PLAN

La Colonne di V$SQL_PLAN

La Vista V$SQL_PLAN_STATISTICS 5-22

Collegamenti tra viste dinamiche importanti delle prestazioni

Esecuzione di query su V$SQL_PLAN

AWR (Automatic Workload Repository)

Gestione di AWR con PL/SQL

Viste AWR importanti

Esecuzione di query su AWR

5-11

5-14

5-12

5-16

5-20

5-21

5-25

5-27

5-29

5-32

5-31

vi

5-23

Generazione di report SQL a partire da dati AWR

5-34

Monitoraggio SQL: panoramica

Report sul monitoraggio SQL: esempio

Interpretazione di un piano di esecuzione

5-35

5-37

5-40

Interpretazione del piano di esecuzione: esempio 1

5-42

Interpretazione del piano di esecuzione: esempio 2

5-45

Interpretazione del piano di esecuzione: esempio 3

5-47

Lettura di piani di esecuzione più complessi

Esame del piano di esecuzione

Oltre i piani di esecuzione Riepilogo 5-52 Esercitazione 5: panoramica

5-49

5-51

5-53

5-48

6 Esercitazione: Trasformazione star Obiettivi 6-2

Il modello star schema

Il modello snowflake schema

Star query: esempio

Piano di esecuzione senza trasformazione star

6-7

Trasformazione star: considerazioni

Trasformazione star

6-3

6-4

6-5

6-8

6-6

Trasformazione star: esempio di riscrittura

6-9

Recupero delle fact row da una dimensione

6-10

Recupero di fact row da tutte le dimensioni

6-11

Unione tramite join del set intermedio di risultati con le dimensioni

Piano di trasformazione star: esempio 1

Trasformazione star: ulteriore ottimizzazione

Utilizzo di indici bitmap join

Piano di trasformazione star: esempio 2

6-13

6-16

6-14

6-15

6-12

Suggerimenti di trasformazione star

6-17

Indici bitmap join: modello di join 1

6-18

Indici bitmap join: modello di join 2

6-19

Indici bitmap join: modello di join 3

6-20

Indici bitmap join: modello di join 4

6-21

Riepilogo 6-22

Esercitazione 6: panoramica

6-23

7 Statistiche per l'ottimizzatore

 

Obiettivi 7-2

Statistiche per l'ottimizzatore

7-3

Tipi di statistiche per l'ottimizzatore

7-4

Statistiche sulle tabelle (DBA_TAB_STATISTICS)

Statistiche sugli indici (DBA_IND_STATISTICS)

Fattore di clustering dell'indice

Statistiche sulle colonne (DBA_TAB_COL_STATISTICS)

Istogrammi 7-11

7-5

7-6

7-8

vii

7-10

Istogrammi di frequenza

7-12

Visualizzazione degli istogrammi di frequenza

Istogrammi ad altezza bilanciata

Visualizzazione degli istogrammi ad altezza bilanciata

Considerazioni sugli istogrammi

Statistiche multicolonna: panoramica

Statistiche delle espressioni: panoramica

Raccolta delle statistiche di sistema

7-13

7-14

7-16

7-17

7-20

7-19

7-15

Raccolta delle statistiche di sistema: esempio

7-22

Meccanismi di raccolta delle statistiche

7-24

Preferenze per le statistiche: panoramica

7-25

Quando raccogliere manualmente le statistiche

7-27

Raccolta manuale delle statistiche

Raccolta manuale delle statistiche: fattori

Gestione della raccolta delle statistiche: esempio

7-31

Funzionamento del campionamento dinamico dell'ottimizzatore

OPTIMIZER_DYNAMIC_SAMPLING 7-33

Lock delle statistiche

Riepilogo 7-35 Esercitazione 7: panoramica

Campionamento dinamico dell'ottimizzatore: panoramica

7-28

7-29

7-30

7-34

7-36

8 Uso delle bind variable Obiettivi 8-2

Condivisione del cursore e di diversi valori alfanumerici

Condivisione del cursore e bind variable

Bind variable in SQL*Plus

Bind variable in Enterprise Manager

Bind variable peeking

Miglioramenti della condivisione del cursore

II Parametro CURSOR_SHARING

Forzare la condivisione del cursore: esempio

8-4

8-5

8-6

8-7

8-9

8-12

8-11

8-3

7-32

Condivisione adattiva del cursore: panoramica

8-13

Condivisione adattiva del cursore: architettura

8-14

Condivisione adattiva del cursore: viste

8-16

Condivisione adattiva del cursore: esempio

Interazione con la condivisione adattiva del cursore

Riepilogo 8-20

Esercitazione 8: panoramica

8-18

8-21

8-19

9 Uso dei suggerimenti dell'ottimizzatore

Obiettivi 9-2

Suggerimenti dell'ottimizzatore: panoramica

Tipi di suggerimenti

9-4

9-3

Specifica dei suggerimenti Regole per i suggerimenti Indicazioni sui suggerimenti

Specifica dei suggerimenti Regole per i suggerimenti Indicazioni sui suggerimenti
Specifica dei suggerimenti Regole per i suggerimenti Indicazioni sui suggerimenti

9-5

9-6

9-7

viii

Sintassi dei suggerimenti dell'ottimizzatore: esempio

9-8

Categorie di suggerimenti

Approcci e obiettivi di ottimizzazione Suggerimenti per percorsi di accesso

Suggerimento INDEX_COMBINE: esempio

Suggerimenti per la trasformazione di query

Suggerimenti per ordini di join

Suggerimenti per le operazioni di join

Suggerimenti aggiuntivi

Suggerimenti e viste

Suggerimenti globali per tabelle

Specificazione di un blocco di query in un suggerimento Specificazione di un insieme completo di suggerimenti Riepilogo 9-31

Esercitazione 9: panoramica

9-9

9-10

9-11

9-15

9-17

9-20

9-21

9-23

9-26

9-2

9-32

9-29

9-30

10 Esecuzione del trace delle applicazioni Obiettivi 10-2

Problematica relativa all'esecuzione del trace delle applicazioni end-to-end

Esecuzione del trace delle applicazioni end-to-end

Posizione dei trace diagnostici

Descrizione di un servizio

Uso dei servizi con applicazioni client

Esecuzione del trace dei servizi

Uso di Enterprise Manager per eseguire il trace dei servizi

Esecuzione del trace dei servizi: esempio

Esecuzione del trace a livello di sessione: esempio

Esecuzione del trace della sessione

Utilità trcsess

Richiamo della utility trcsess

Utility trcsess: esempio

Contenuto dei file di trace SQL

Contenuto dei file di trace SQL: esempio

Formattazione dei file di trace SQL: panoramica

Richiamo dell'utility tkprof

Opzioni di ordinamento di tkprof

Output del comando tkprof

Output di tkprof con No Index: esempio

Output di tkprof con Index: esempio

Riepilogo 10-31

Esercitazione 10: panoramica

10-4

10-5

10-8

10-6

10-7

10-10

10-11

10-12

10-13

10-14

10-15

10-16

10-17

10-18

10-19

10-20

10-24

10-22

10-29

10-30

10-32

ix

10-3

11 Automazione del tuning SQL Obiettivi 11-2 Tuning automatico delle istruzioni SQL

11-3

Problematiche relative al tuning delle applicazioni

SQL Tuning Advisor: panoramica

Statistiche sugli oggetti obsolete o mancanti

Creazione di profili delle istruzioni SQL

11-5

11-6

11-7

11-4

Pianificazione del flusso di tuning e creazione del profilo SQL

11-8

Loop di tuning SQL

11-9

Analisi dei percorsi di accesso

11-10

 

Analisi della struttura SQL

11-11

SQL Tuning Advisor: modello di utilizzo

11-12

11-13

Database Control e SQL Tuning Advisor

Esecuzione di SQL Tuning Advisor: esempio

11-14

 

Implementazione dei suggerimenti

11-15

11-16

 

SQL Access Advisor: panoramica

SQL Access Advisor: modello di utilizzo

11-17

Suggerimenti possibili

11-18

Sessione su SQL Access Advisor: Initial Options

11-19

SQL Access Advisor: Workload Source

11-21

SQL Access Advisor: Recommendation Options

11-22

SQL Access Advisor: Schedule e Review

11-23

SQL Access Advisor: Results

11-24

SQL Access Advisor: Risultati e implementazione

11-25

Loop di tuning SQL

11-26

Tuning SQL automatico

11-27

 

Processo di tuning automatico 11-28 Controlli del tuning SQL automatico

11-30

Attività di tuning SQL automatico

11-31

Configurazione delle funzionalità automatiche di tuning SQL

11-32

Tuning SQL automatico: Result Summary

Tuning SQL automatico: Result Details

Automatic SQL Tuning Result Details: approfondimenti

Considerazioni sul tuning SQL automatico

Riepilogo 11-37

Esercitazione 11: panoramica

11-33

11-34

11-36

11-38

11-35

Appendice A: Esercitazioni e soluzioni

Indice

x

Appendice A Esercitazioni e soluzioni

Sommario

Esercitazioni della lezione 1

3

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database

4

Esercitazioni della lezione 2

12

Esercitazione 2-1: evitare gli errori comuni

13

Esercitazioni della lezione 3

33

Esercitazione 3-1: descrizione delle decisioni dell'ottimizzatore

34

Esercitazioni della lezione 4

58

Esercitazione 4-1: uso di percorsi di accesso diversi

59

Esercitazione 4-2: uso della cache dei risultati

123

Esercitazioni della lezione 5

146

Esercitazione 5-1: estrazione dei piani di esecuzione

147

Esercitazioni della lezione 6

181

Esercitazione 6-1: ottimizzazione di uno star schema

182

Esercitazioni della lezione 7

199

Esercitazione 7-1: uso delle statistiche di sistema

200

Esercitazione 7-2: raccolta automatica delle statistiche

215

Esercitazioni della lezione 8

243

Esercitazione 8-1: descrizione della condivisione adattiva del cursore

244

Esercitazione 8-2: descrizione del parametro CURSOR_SHARING

264

Esercitazioni della lezione 9

278

Esercitazione 9-1: uso dei suggerimenti

279

Esercitazioni della lezione 10

323

Esercitazione 10-1: trace delle applicazioni

324

Esercitazioni della lezione 11

199

Esercitazione 11-1: ottimizzazione efficiente delle istruzioni

SQL a carico elevato

369

Esercitazione 11-2: uso di SQL Access Advisor

389

Esercitazione 11-3: uso della funzionalità di ottimizzazione automatica delle

istruzioni SQL

418

Oracle Database 11g: workshop di ottimizzazione delle istruzioni SQL

Appendice

A - 2

Esercitazioni della lezione 1

Oracle Database 11g: workshop di ottimizzazione delle istruzioni SQL

Appendice

A - 3

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database

Inserire le risposte corrette negli spazi vuoti:

1)

I due componenti principali di Oracle RDBMS sono

 

e

2)

Un'istanza è costituita da

e

processi

3)

Una sessione è una connessione tra il processo o il processo

e il processo

4)

Denominare alcuni componenti della SGA (System Global Area).

5)

Elencare alcuni processi di background:

6)

Il processo

scrive i buffer modificati sui file di dati.

7)

Il processo

scrive i redo log sui log file.

Oracle Database 11g: workshop di ottimizzazione delle istruzioni SQL

Appendice

A - 4

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database (continuazione)

8)

9)

Denominare alcuni file associati a un database Oracle.

Indicare alcune delle strutture di memoria logiche di un database Oracle:

10) Il processo

copia i redo log file su una destinazione

di

archiviazione.

11) La

contiene dati e informazioni di controllo per un

server o un processo di background.

12) La struttura di tablespace logica è associata a file

su disco.

fisici

13) Indicare se le definizioni seguenti sono vere o false.

a)

La SGA include la database buffer cache e il redo log

b)

Ogni processo server e di background dispone di una propria

PGA (Program Global

c)

I

processi utente eseguono l'applicazione o il codice dell'ambiente

di programmazione di

d)

I

processi di Oracle Database includono processi server

e

di

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 5

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database (continuazione)

14) Da una sessione terminale dalla quale ci si è connessi come utente oracle, eseguire lo script processes.sh che si trova nella directory $HOME/solutions/Database_Architecture. Che cosa viene visualizzato in questo script?

a) Vengono visualizzati tutti i processi dell'istanza di database attualmente in esecuzione sul computer, inclusi i processi di background e di foreground.

[oracle@edrsr33p1-orcl Database_Architecture]$ ./processes.sh

oracle

9537

1

0 01:00 ?

00:00:00 ora_w000_orcl

oracle

12132 22002 0 Mar26 pts/4

00:01:08

/u01/app/oracle/product/11.1.0/db_1/jdk/bin/java -server -Xmx256M -

XX:MaxPermSize=200m -XX:MinHeapFreeRatio=20 - XX:MaxHeapFreeRatio=40 - DORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1 - Doracle.home=/u01/app/oracle/product/11.1.0/db_1/oc4j -

Doracle.oc4j.localhome=/u01/app/oracle/product/11.1.0/db_1/edrsr33

p1.us.oracle.com_orcl/sysman -

DEMSTATE=/u01/app/oracle/product/11.1.0/db_1/edrsr33p1.us.

oracle.com_orcl -Doracle.j2ee.dont.use.memory.archive=true - Djava.protocol.handler.pkgs=HTTPClient -

Doracle.security.jazn.config=/u01/app/oracle/product/11.1.0/db_1/

oc4j/j2ee/OC4J_DBConsole_edrsr33p1.us.oracle.com_orcl/config/

jazn.xml -

Djava.security.policy=/u01/app/oracle/product/11.1.0/db_1/oc4j/

j2ee/OC4J_DBConsole_edrsr33p1.us.oracle.com_orcl/config/

java2.policy -

Djavax.net.ssl.KeyStore=/u01/app/oracle/product/11.1.0/db_1/sysman

/config/OCMTrustedCerts.txt-

Djava.security.properties=/u01/app/oracle/product/11.1.0/db_1/oc4j

/j2ee/home/config/jazn.security.props -

DEMDROOT=/u01/app/oracle/product/11.1.0/db_1/edrsr33p1.us.

oracle.com_orcl -Dsysman.md5password=true -

Drepapi.oracle.home=/u01/app/oracle/product/11.1.0/db_1 -

Ddisable.checkForUpdate=true -

Doracle.sysman.ccr.ocmSDK.websvc.keystore=/u01/app/oracle/product/

11.1.0/db_1/jlib/emocmclnt.ks -

Dice.pilots.html4.ignoreNonGenericFonts=true -

Djava.awt.headless=true -jar

/u01/app/oracle/product/11.1.0/db_1/oc4j/j2ee/home/oc4j.jar -

config

/u01/app/oracle/product/11.1.0/db_1/oc4j/j2ee/OC4J_DBConsole_

edrsr33p1.us.oracle.com_orcl/config/server.xml

oracle

12225

1

0 Mar26 ?

00:00:00 ora_pmon_orcl

oracle

12227

1

0 Mar26 ?

00:00:00 ora_vktm_orcl

oracle

12231

1

0 Mar26 ?

00:00:00 ora_diag_orcl

oracle

12233

1

0 Mar26 ?

00:00:00 ora_dbrm_orcl

oracle

12235

1

0 Mar26 ?

00:00:00 ora_psp0_orcl

oracle

12239

1

0 Mar26 ?

00:00:00 ora_dia0_orcl

oracle

12241

1

0 Mar26 ?

00:00:00 ora_mman_orcl

oracle

12243

1

0 Mar26 ?

00:00:21 ora_dbw0_orcl

oracle

12245

1

0 Mar26 ?

00:00:48 ora_lgwr_orcl

oracle

12247

1

0 Mar26 ?

00:00:01 ora_ckpt_orcl

oracle

12249

1

0 Mar26 ?

00:00:04 ora_smon_orcl

oracle

12251

1

0 Mar26 ?

00:00:00 ora_reco_orcl

oracle

12253

1

0 Mar26 ?

00:00:05 ora_mmon_orcl

oracle

12255

1

0 Mar26 ?

00:00:01 ora_mmnl_orcl

oracle

12257

1

0 Mar26 ?

00:00:00 ora_d000_orcl

oracle

12259

1

0 Mar26 ?

00:00:00 ora_s000_orcl

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 6

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database (continuazione)

oracle

12282

1

0 Mar26 ?

00:00:00 ora_fbda_orcl

oracle

12284

1

0 Mar26 ?

00:00:00 ora_smco_orcl

oracle

12290

1

0 Mar26 ?

00:00:00 ora_qmnc_orcl

oracle

12302

1

0 Mar26 ?

00:00:03 oracleorcl

(LOCAL=NO)

 

oracle

12325

1

0 Mar26 ?

00:00:00 ora_q000_orcl

oracle

12329

1

0 Mar26 ?

00:01:59 oracleorcl

(LOCAL=NO)

 

oracle

12331

1

0 Mar26 ?

00:00:12 oracleorcl

(LOCAL=NO)

 

oracle

12333

1

0 Mar26 ?

00:00:05 oracleorcl

(LOCAL=NO)

 

oracle

12335

1

0 Mar26 ?

00:00:37 oracleorcl

(LOCAL=NO)

 

oracle

12340

1

0 Mar26 ?

00:01:51 oracleorcl

(LOCAL=NO)

 

oracle

12346

1

0 Mar26 ?

00:00:01 oracleorcl

(LOCAL=NO)

 

oracle

12362

1

0 Mar26 ?

00:00:00 ora_q001_orcl

oracle

12570

1

0 Mar26 ?

00:00:01 ora_cjq0_orcl

oracle

20119

1

0 14:50 ?

00:00:00 oracleorcl

(LOCAL=NO)

oracle

20482 20480 0 14:56 pts/2

00:00:00 grep orcl

oracle

22002

1

0 Mar26 pts/4

00:00:08

/u01/app/oracle/product/11.1.0/db_1/perl/bin/perl

/u01/app/oracle/product/11.1.0/db_1/bin/emwd.pl dbconsole

/u01/app/oracle/product/11.1.0/db_1/edrsr33p1.us.oracle.com_orcl/

sysman/log/emdb.nohup

[oracle@edrsr33p1-orcl Database_Architecture]$

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

#!/bin/bash

ps -ef | grep orcl

15) Da una sessione terminale dalla quale ci si è connessi come utente

oracle, eseguire lo script files.sh che si trova nella directory

$HOME/solutions/Database_Architecture. Che cosa viene

visualizzato in questo script?

a) In questo script vengono visualizzati la posizione e i nomi di tutti i file

di database, il file di inizializzazione, il password file e i file di trace.

[oracle@edrsr33p1-orcl Database_Architecture]$ ./files.sh

SQL*Plus: Release 11.1.0.6.0 - Production on

Thu Mar 27 17:58:56 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -

Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining and Real Application Testing options

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 7

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database (continuazione)

SQL> SQL> col name format a45 SQL> SQL> select name from v$controlfile;

NAME

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

/u01/app/oracle/oradata/orcl/control01.ctl

/u01/app/oracle/oradata/orcl/control02.ctl

/u01/app/oracle/oradata/orcl/control03.ctl

SQL> SQL> SQL> col member format a45 SQL> SQL> select group#,member from v$logfile;

GROUP# MEMBER

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

 

3

/u01/app/oracle/oradata/orcl/redo03.log

2

/u01/app/oracle/oradata/orcl/redo02.log

1

/u01/app/oracle/oradata/orcl/redo01.log

SQL>

SQL>

SQL> col tablespace_name format a20

SQL> col file_name format a45

SQL>

SQL> select tablespace_name, file_name from dba_data_files;

TABLESPACE_NAME

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

FILE_NAME

USERS

/u01/app/oracle/oradata/orcl/users01.dbf

UNDOTBS1

/u01/app/oracle/oradata/orcl/undotbs01.dbf

SYSAUX

/u01/app/oracle/oradata/orcl/sysaux01.dbf

SYSTEM

/u01/app/oracle/oradata/orcl/system01.dbf

EXAMPLE

/u01/app/oracle/oradata/orcl/example01.dbf

SQL>

SQL> select tablespace_name, file_name from dba_temp_files;

TABLESPACE_NAME

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

FILE_NAME

TEMP

/u01/app/oracle/oradata/orcl/temp01.dbf

SQL>

SQL> exit;

Disconnected from Oracle Database 11g Enterprise Edition Release

11.1.0.6.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

-rw-rw---- 1 oracle oinstall 1544 Aug 22 2007

/u01/app/oracle/product/11.1.0/db_1/dbs/hc_orcl.dat

-rw-r----- 1 oracle oinstall 1536 Mar 26 22:03

/u01/app/oracle/product/11.1.0/db_1/dbs/orapworcl

-rw-r----- 1 oracle oinstall 2560 Mar 27 03:13

/u01/app/oracle/product/11.1.0/db_1/dbs/spfileorcl.ora

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 8

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database (continuazione)

alert cdump

hm

incident

incpkg

ir

lck

metadata stage

sweep trace

-rw-r--r--

1 oracle oinstall 557386 Mar 27 13:00

/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log

[oracle@edrsr33p1-orcl Database_Architecture]$

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

#!/bin/bash

cd /home/oracle/solutions/Database_Architecture

export ORACLE_SID=orcl

export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1

export

PATH=/u01/app/oracle/product/11.1.0/db_1/bin:/bin:/usr/bin:/usr/

local/bin:/usr/X11R6/bin:/usr/java/jdk1.5.0_11/bin:/bin

sqlplus / as sysdba @files.sql

ls

-l $ORACLE_HOME/dbs/*orcl*

ls

/u01/app/oracle/diag/rdbms/orcl/orcl

ls

-l /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert*

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

set echo on

col name format a45

select name from v$controlfile;

col member format a45

select group#,member from v$logfile;

col tablespace_name format a20

col file_name format a45

select tablespace_name, file_name from dba_data_files;

select tablespace_name, file_name from dba_temp_files;

exit;

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 9

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database (continuazione)

16) Da una sessione terminale dalla quale ci si è connessi come utente oracle, eseguire lo script sga.sh che si trova nella directory $HOME/solutions/Database_Architecture. Che cosa viene visualizzato in questo script?

a) In questo script vengono visualizzati i diversi pool contenuti nella SGA.

[oracle@edrsr33p1-orcl Database_Architecture]$ ./sga.sh

SQL*Plus: Release 11.1.0.6.0 - Production on Thu Mar 27 18:15:02 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, Oracle Label Security, OLAP, Data Mining and Real Application Testing options

SQL> SQL> select * from v$sgainfo;

NAME

BYTES RES

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

Fixed SGA Size

1303188 No

Redo Buffers

5181440 No

Buffer Cache Size

335544320 Yes

Shared Pool Size

276824064 Yes

Large Pool Size

4194304 Yes

Java Pool Size

12582912 Yes

Streams Pool Size

0 Yes

Shared IO Pool Size

0 Yes

Granule Size

4194304 No

Maximum SGA Size

845348864 No

Startup overhead in Shared Pool

46137344 No

BYTES RES

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

Free SGA Memory Available

NAME

209715200

12 rows selected.

SQL>

SQL> col component format a30

SQL>

SQL> select component,current_size,min_size,max_size from

v$sga_dynamic_components;

MAX_SIZE

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

COMPONENT

CURRENT_SIZE

MIN_SIZE

shared pool

276824064 226492416 276824064

large pool

4194304

4194304

4194304

java pool

12582912

12582912

12582912

streams pool

0

0

0

DEFAULT buffer cache

335544320 335544320 385875968

KEEP buffer cache

0

0

0

RECYCLE buffer cache

0

0

0

DEFAULT 2K buffer cache

0

0

0

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 10

Esercitazione 1-1: esplorazione dell'architettura di Oracle Database (continuazione)

DEFAULT 4K buffer cache

0

0

0

DEFAULT 8K buffer cache

0

0

0

DEFAULT 16K buffer cache

0

0

0

COMPONENT

CURRENT_SIZE

MIN_SIZE

MAX_SIZE

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

DEFAULT 32K buffer cache

0

0

0

Shared IO Pool

0

0

0

ASM Buffer Cache

0

0

0

14 rows selected.

SQL> SQL> exit; Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, Oracle Label Security, OLAP, Data Mining and Real Application Testing options [oracle@edrsr33p1-orcl Database_Architecture]$

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

#!/bin/bash

cd /home/oracle/solutions/Database_Architecture

export ORACLE_SID=orcl

export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1

export

PATH=/u01/app/oracle/product/11.1.0/db_1/bin:/bin:/usr/bin:/usr/

local/bin:/usr/X11R6/bin:/usr/java/jdk1.5.0_11/bin:/bin

sqlplus / as sysdba @sga.sql

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

set echo on

select * from v$sgainfo;

col component format a30

select component,current_size,min_size,max_size from

v$sga_dynamic_components;

exit;

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 11

Esercitazioni della lezione 2

Oracle Database 11g: workshop di ottimizzazione delle istruzioni SQL

Appendice

A - 12

Esercitazione 2-1: evitare gli errori comuni

In questa esercitazione verranno esaminati alcuni errori comuni di scrittura delle istruzioni SQL. È necessario trovare una soluzione alternativa per migliorare le prestazioni.

1)

In primo luogo, analizzare una subquery correlata. Prima di eseguire l'istruzione che ha provocato l'errore, eseguire lo script correlation_setup.sh per impostare l'ambiente per questo esempio. Accertarsi di eseguire lo script da una sessione terminale dalla quale ci si è connessi come utente oracle. Nella directory $HOME/solutions/Common_Mistakes sono disponibili gli script per tutti gli esempi riportati di seguito.

[oracle@edrsr33p1-orcl Common_Mistakes]$ ./correlation_setup.sh

SQL*Plus: Release 11.1.0.6.0 - Production on Wed Mar 26 20:21:50 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

SQL> SQL>

User altered.

SQL> SQL>

Grant succeeded.

SQL> SQL> Disconnected from Oracle Database 11g Enterprise Edition

Release 11.1.0.6.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

[oracle@edrsr33p1-orcl Common_Mistakes]$

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

#!/bin/bash

cd /home/oracle/solutions/Common_Mistakes

export ORACLE_SID=orcl

export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1

export

PATH=/u01/app/oracle/product/11.1.0/db_1/bin:/bin:/usr/bin:/usr/

local/bin:/usr/X11R6/bin:/usr/java/jdk1.5.0_11/bin:/bin

sqlplus / as sysdba <<EOF

alter user sh identified by sh account unlock;

grant dba to sh; EOF

Oracle Database 11g: workshop di ottimizzazione delle istruzioni SQL

Appendice

A - 13

Esercitazione 2-1: evitare gli errori comuni (continuazione)

2)

Dopo essersi connessi come utente SH da una sessione SQL*Plus (rimanere connessi a tale sessione fino alla fine di questa esercitazione), accertarsi di eseguire il comando:

set timing on @flush

Lo scopo del primo comando è indicare il tempo necessario per l'esecuzione del comando successivo. Lo script flush.sql elimina il contenuto sia dello shared pool che della buffer cache per evitare la maggior parte degli effetti della memorizzazione nella cache e consentire confronti validi tra due esecuzioni. Nota: non utilizzare i comandi presenti in questo script su un sistema di produzione.

[oracle@edrsr33p1-orcl Common_Mistakes]$ sqlplus sh/sh

SQL*Plus: Release 11.1.0.6.0 - Production on Wed Mar 26 20:37:49 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, Oracle Label Security, OLAP, Data Mining and Real Application Testing options

SQL> set timing on SQL> @flush

System altered.

Elapsed: 00:00:00.21

System altered.

Elapsed: 00:00:00.49 SQL>

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

alter system flush shared_pool;

alter system flush buffer_cache;

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 14

Esercitazione 2-1: evitare gli errori comuni (continuazione)

3)

Dalla stessa sessione SQL*Plus, eseguire l'istruzione riportata di seguito e notare il tempo impiegato per l'esecuzione (è possibile utilizzare lo script correlation.sql):

SELECT COUNT(*)

 

FROM

products p

WHERE prod_list_price < 1.15 * (SELECT avg(unit_cost)

 

FROM costs c WHERE c.prod_id = p.prod_id);

 

SQL> @correlation SQL>

 

SQL> SELECT COUNT(*)

2 FROM

products p

3 WHERE prod_list_price < 1.15 * (SELECT avg(unit_cost) 4 FROM costs c 5 WHERE c.prod_id = p.prod_id);

COUNT(*)

 

----------

 

46

Elapsed: 00:00:01.21 SQL>

 

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

set timing on set echo on

 

SELECT COUNT(*)

 

FROM

products p

WHERE prod_list_price < 1.15 * (SELECT avg(unit_cost)

 

FROM costs c

WHERE c.prod_id = p.prod_id);

4)

Prima di provare a correggere l'istruzione precedente, usare nuovamente il comando

FLUSH sull'ambiente eseguendo lo script flush.sql dalla sessione SQL*Plus.

SQL> @flush

SQL> alter system flush shared_pool;

System altered.

Elapsed: 00:00:00.10

SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.17

SQL>

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 15

Esercitazione 2-1: evitare gli errori comuni (continuazione)

5)

In che modo è possibile riscrivere questa istruzione per migliorare le prestazioni? Verificare la soluzione e discuterla con l'istruttore.

SQL> @nocorrelation SQL> SQL> set timing on SQL> set echo on

SQL> SQL> SELECT COUNT(*)

2

FROM

products p, (SELECT prod_id, AVG(unit_cost) ac FROM

costs GROUP BY prod_id) c

3

WHERE p.prod_id = c.prod_id AND

4

p.prod_list_price < 1.15 * c.ac;

COUNT(*)

----------

 

46

Elapsed: 00:00:00.16 SQL>

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

set timing on set echo on

 

SELECT COUNT(*)

FROM

products p, (SELECT prod_id, AVG(unit_cost) ac FROM costs

GROUP BY prod_id) c

WHERE p.prod_id = c.prod_id AND

 

p.prod_list_price < 1.15 * c.ac;

6)

Uscire dalla sessione SQL*Plus.

SQL> exit

 

Disconnected from Oracle Database 11g Enterprise Edition Release

11.1.0.6.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

[oracle@edrsr33p1-orcl Common_Mistakes]$

7)

Dalla sessione terminale, eseguire lo script correlation_cleanup.sh per

eseguire il cleanup dell'ambiente.

[oracle@edrsr33p1-orcl Common_Mistakes]$ ./correlation_cleanup.sh

SQL*Plus: Release 11.1.0.6.0 - Production on

Wed Mar 26 20:49:22 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -

Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

SQL> SQL> Revoke succeeded.

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 16

Esercitazione 2-1: evitare gli errori comuni (continuazione)

SQL> SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, Oracle Label Security, OLAP, Data Mining and Real Application Testing options [oracle@edrsr33p1-orcl Common_Mistakes]$

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

#!/bin/bash

cd /home/oracle/solutions/Common_Mistakes

export ORACLE_SID=orcl

export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1

export

PATH=/u01/app/oracle/product/11.1.0/db_1/bin:/bin:/usr/bin:/usr/

local/bin:/usr/X11R6/bin:/usr/java/jdk1.5.0_11/bin:/bin

sqlplus / as sysdba <<EOF

revoke dba from sh;

EOF

8)

Prima di continuare, eseguire lo script setup_rest.sh per impostare

l'ambiente per tutti gli esempi riportati di seguito. Accertarsi di eseguire lo script

da una sessione terminale dalla quale ci si è connessi come utente oracle. Nella

directory $HOME/solutions/Common_Mistakes sono disponibili gli script

per tutti gli esempi riportati di seguito.

[oracle@edrsr33p1-orcl Common_Mistakes]$ ./setup_rest.sh

SQL*Plus: Release 11.1.0.6.0 - Production on

Wed Mar 26 20:59:53 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -

Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

SQL> SQL> SQL> SQL> drop user jfv cascade

*

ERROR at line 1:

ORA-01918: user 'JFV' does not exist

SQL> SQL>

User created.

SQL> SQL> Grant succeeded.

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 17

Esercitazione 2-1: evitare gli errori comuni (continuazione)

SQL> SQL> Connected. SQL> SQL> drop table orders purge

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> SQL> Table created.

SQL> SQL>

PL/SQL procedure successfully completed.

2

3

4

5

6

7

SQL> SQL>

PL/SQL procedure successfully completed.

2

3

4

5

6

7

SQL> SQL> drop table employees purge

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> drop table job_history purge

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> SQL>

Table created.

SQL> SQL>

PL/SQL procedure successfully completed.

2

3

4

5

6

7

SQL> SQL>

Table created.

SQL> SQL>

PL/SQL procedure successfully completed.

2

3

4

5

6

7

SQL> SQL>

Index created.

SQL> SQL> SQL> drop table old purge

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> drop table new purge

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> SQL>

Table created.

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 18

Esercitazione 2-1: evitare gli errori comuni (continuazione)

SQL> Table created.

SQL> SQL>

PL/SQL procedure successfully completed.

2

3

4

5

6

7

SQL> SQL>

PL/SQL procedure successfully completed.

2

3

4

5

6

7

SQL> SQL> SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, Oracle Label Security, OLAP, Data Mining and Real Application Testing options [oracle@edrsr33p1-orcl Common_Mistakes]$

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

#!/bin/bash

cd /home/oracle/solutions/Common_Mistakes

export ORACLE_SID=orcl

export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1

export

PATH=/u01/app/oracle/product/11.1.0/db_1/bin:/bin:/usr/bin:/usr/

local/bin:/usr/X11R6/bin:/usr/java/jdk1.5.0_11/bin:/bin

sqlplus / as sysdba <<EOF

set echo on

drop user jfv cascade;

create user jfv identified by jfv default tablespace users

temporary tablespace temp;

grant connect, resource, dba to jfv;

connect jfv/jfv

drop table orders purge;

create table orders (order_id_char varchar2(50) primary key,

order_total number, customer_name varchar2(300));

begin

for i in 1

500000

loop

insert into orders

values(i,100,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaa');

end loop;

commit;

end;

/

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 19

Esercitazione 2-1: evitare gli errori comuni (continuazione)

begin for i in 1

insert into orders

values(500000+i,100,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); end loop; commit; end;

/

500000

loop

drop table employees purge; drop table job_history purge;

create table employees (employee_id number primary key, name

varchar2(500));

begin for i in 1

insert into employees values(i,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaa'); end loop; commit;

end;

/

500000

loop

create table job_history (employee_id number, job varchar2(500));

begin

for i in 1

500000

loop

insert into job_history

values(mod(i,1000),'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');

end loop;

commit;

end;

/

create index job_history_empid_indx on job_history(employee_id);

drop table old purge;

drop table new purge;

create table old(name varchar2(10), other varchar2(500));

create table new(name varchar2(10), other varchar2(500));

begin

for i in 1

500000

loop

insert into old

values(i,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaa'); end loop;

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 20

Esercitazione 2-1: evitare gli errori comuni (continuazione)

commit;

end;

/

begin for i in 1

500000

loop

insert into new

values(500000+i,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); end loop;

commit;

end;

/

EOF

9)

Connettersi come utente JFV da una sessione SQL*Plus e rimanere connessi a tale sessione fino alla successiva indicazione. Nella sessione, impostare il tempo impiegato da SQL*Plus per l'esecuzione del comando successivo e usare nuovamente il comando FLUSH sull'ambiente prima di avviare il secondo esempio. A tale scopo, è possibile utilizzare il comando set timing on e lo script flush.sql.

[oracle@edrsr33p1-orcl Common_Mistakes]$ sqlplus jfv/jfv

SQL*Plus: Release 11.1.0.6.0 - Production on

Wed Mar 26 21:06:33 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -

Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

SQL> set timing on

SQL> @flush

System altered.

Elapsed: 00:00:00.33

System altered.

Elapsed: 00:00:07.12

SQL>

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

alter system flush shared_pool;

alter system flush buffer_cache;

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 21

Esercitazione 2-1: evitare gli errori comuni (continuazione)

10) Il secondo esempio che viene analizzato è un esempio di join. Dalla sessione SQL*Plus, eseguire la query riportata di seguito e notare il tempo impiegato per il completamento:

SELECT count(*)

FROM

job_history jh, employees e

WHERE

substr(to_char(e.employee_id),1)=substr(to_char(jh.employee_id),1);

SQL> @join

SQL>

SQL> SELECT count(*)

2 FROM

3 WHERE substr(to_char(e.employee_id),1) =

job_history jh, employees e

substr(to_char(jh.employee_id),1);

COUNT(*)

----------

499500

Elapsed: 00:00:03.03 SQL>

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

set timing on set echo on

SELECT count(*)

FROM

WHERE substr(to_char(e.employee_id),1) =

job_history jh, employees e

substr(to_char(jh.employee_id),1);

11) Prima di provare a correggere l'istruzione precedente, usare nuovamente

il comando FLUSH sull'ambiente eseguendo lo script flush.sql dalla

sessione SQL*Plus.

SQL> @flush

SQL> alter system flush shared_pool;

System altered.

Elapsed: 00:00:00.12

SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.72

SQL>

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

alter system flush shared_pool;

alter system flush buffer_cache;

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 22

Esercitazione 2-1: evitare gli errori comuni (continuazione)

12) In che modo è possibile riscrivere la query precedente per migliorare le prestazioni? Verificare la soluzione e discuterla con l'istruttore.

SQL> @better_join SQL> SQL> set timing on SQL> set echo on

SQL> SQL> SELECT count(*)

2 FROM

3 WHERE e.employee_id = jh.employee_id;

job_history jh, employees e

COUNT(*)

----------

499500

Elapsed: 00:00:00.70 SQL>

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

set timing on set echo on

SELECT count(*)

FROM

WHERE e.employee_id = jh.employee_id;

job_history jh, employees e

13) Prima di analizzare il terzo esempio, usare nuovamente il comando FLUSH

sull'ambiente eseguendo lo script flush.sql dalla sessione SQL*Plus.

SQL> @flush

SQL> alter system flush shared_pool;

System altered.

Elapsed: 00:00:00.11

SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.23 SQL>

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

alter system flush shared_pool;

alter system flush buffer_cache;

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 23

Esercitazione 2-1: evitare gli errori comuni (continuazione)

14) Il terzo esempio che viene analizzato è un esempio di predicato semplice. Rimanendo connessi come utente JFV dalla sessione SQL*Plus, eseguire la query riportata di seguito e notare il tempo impiegato per il completamento:

SELECT * FROM orders WHERE order_id_char = 1205;

SQL> @simple_predicate SQL> SQL> set timing on SQL> set echo on SQL> SQL> SELECT * FROM orders WHERE order_id_char = 1205;

ORDER_TOTAL

-------------------------------------------------- ----------- CUSTOMER_NAME

ORDER_ID_CHAR

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

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

1205

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

100

Elapsed: 00:00:07.62 SQL>

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

set timing on set echo on

SELECT * FROM orders WHERE order_id_char = 1205;

15) Prima di provare a correggere l'istruzione SELECT indicata nel passaggio 14,

usare nuovamente il comando FLUSH sull'ambiente eseguendo lo script

flush.sql.

SQL> @flush

SQL> alter system flush shared_pool;

System altered.

Elapsed: 00:00:00.13

SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.20

SQL>

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 24

Esercitazione 2-1: evitare gli errori comuni (continuazione)

16) In che modo è possibile riscrivere l'istruzione precedente per migliorare le prestazioni? Verificare la soluzione e discuterla con l'istruttore.

SQL> @better_predicate SQL> SQL> set timing on SQL> set echo on SQL> SQL> SELECT * FROM orders WHERE order_id_char = '1205';

ORDER_TOTAL

-------------------------------------------------- ----------- CUSTOMER_NAME

ORDER_ID_CHAR

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

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

1205

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

100

Elapsed: 00:00:00.04 SQL>

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

set timing on set echo on

SELECT * FROM orders WHERE order_id_char = '1205';

17) Prima di procedere con l'analisi successiva, usare nuovamente il comando FLUSH

sull'ambiente eseguendo lo script flush.sql.

SQL> @flush

SQL> alter system flush shared_pool;

System altered.

Elapsed: 00:00:00.11

SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.11

SQL>

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

alter system flush shared_pool;

alter system flush buffer_cache;

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 25

Esercitazione 2-1: evitare gli errori comuni (continuazione)

18) Il quarto esempio è un esempio di UNION. Eseguire la query riportata di seguito e notare il tempo impiegato per il completamento:

select count(*) from (select name from old union select name from new);

SQL> @union SQL> SQL> set timing on SQL> set echo on SQL> SQL> select count(*)

2 from (select name from old union select name from new);

COUNT(*)

----------

1000000

Elapsed: 00:00:06.39 SQL>

19) Prima di trovare una soluzione migliore, usare nuovamente il comando FLUSH sull'ambiente eseguendo lo script flush.sql.

SQL> @flush SQL> alter system flush shared_pool;

System altered.

Elapsed: 00:00:00.10

SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.09 SQL>

20) In che modo è possibile riscrivere l'istruzione precedente per migliorare

le prestazioni? Verificare la soluzione e discuterla con l'istruttore.

SQL> @better_union SQL> SQL> set timing on SQL> set echo on

SQL>

SQL> select count(*)

2 from (select name from old union all select name from new);

COUNT(*)

----------

1000000

Elapsed: 00:00:00.42

SQL>

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 26

Esercitazione 2-1: evitare gli errori comuni (continuazione)

21) Eseguire lo script multiple_setup.sql per impostare l'ambiente per questo esempio.

SQL> @multiple_setup SQL> create table myemp as select * from hr.employees; Table created. SQL> insert
SQL> @multiple_setup
SQL> create table myemp as select * from hr.employees;
Table created.
SQL> insert into myemp select * from myemp;
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
commit;
107
rows created.
SQL>
214
rows created.
SQL>
428
rows created.
SQL>
856
rows created.
SQL>
1712
rows created.
SQL>
3424
rows created.
SQL>
6848
rows created.
SQL>
13696
rows created.
SQL>
27392
rows created.
SQL>
54784
rows created.
SQL>
109568 rows created.

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 27

Esercitazione 2-1: evitare gli errori comuni (continuazione)

SQL>

219136

rows created.

SQL>

438272

rows created.

SQL>

876544

rows created.

SQL>

1753088

rows created.

SQL>

3506176

rows created.

SQL> Commit complete.

SQL> insert into myemp select * from myemp; commit;

7012352 rows created.

SQL> Commit complete.

SQL>

22) Eseguire lo script multiple1.sql e notare il tempo totale impiegato per

l'esecuzione.

SQL> @multiple1

SQL> set timing on

SQL>

SQL>

SQL> SELECT COUNT (*)

FROM myemp

WHERE salary < 2000;

2 3

COUNT(*)

----------

0

Elapsed: 00:00:15.49

SQL> SELECT COUNT (*)

FROM myemp

WHERE salary BETWEEN 2000 AND 4000;

2 3

COUNT(*)

----------

5636096

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 28

Esercitazione 2-1: evitare gli errori comuni (continuazione)

Elapsed: 00:00:17.14 SQL> SELECT COUNT (*) FROM myemp WHERE salary>4000;

2

COUNT(*)

3

----------

8388608

Elapsed: 00:00:18.12 SQL>

23) In che modo è possibile riscrivere le istruzioni presenti nello script multiple1.sql per migliorare le prestazioni?

SQL> @multiple2 SQL> SELECT COUNT (CASE WHEN salary < 2000

2

THEN 1 ELSE null END) count1,

3

COUNT (CASE WHEN salary BETWEEN 2001 AND 4000

4

THEN 1 ELSE null END) count2,

5

COUNT (CASE WHEN salary > 4000

6

THEN 1 ELSE null END) count3

7

FROM myemp;

COUNT3

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

8388608

COUNT1

0

COUNT2

5636096

Elapsed: 00:00:18.19

SQL>

24) Uscire dalla sessione SQL*Plus.

SQL> exit

Disconnected from Oracle Database 11g Enterprise Edition Release

11.1.0.6.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

[oracle@edrsr33p1-orcl Common_Mistakes]$

25) Viene ora analizzato un quinto esempio che tratta le connessioni al database.

Eseguire lo script bad_connect.sh dalla finestra terminale dalla quale ci si

è connessi come utente oracle. Notare il tempo impiegato per il completamento.

[oracle@edrsr33p1-orcl Common_Mistakes]$ ./bad_connect.sh

Wed Mar 26 21:56:42 GMT-7 2008

Wed Mar 26 21:57:07 GMT-7 2008

[oracle@edrsr33p1-orcl Common_Mistakes]$

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

#!/bin/bash

cd /home/oracle/solutions/Common_Mistakes

export ORACLE_SID=orcl

export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 29

Esercitazione 2-1: evitare gli errori comuni (continuazione)

export

PATH=/u01/app/oracle/product/11.1.0/db_1/bin:/bin:/usr/bin:/usr/

local/bin:/usr/X11R6/bin:/usr/java/jdk1.5.0_11/bin:/bin

STREAM_NUM=0

MAX_STREAM=500

date

while [ $STREAM_NUM -lt $MAX_STREAM ]; do

# one more

let STREAM_NUM="STREAM_NUM+1"

# start one more stream

sqlplus -s jfv/jfv @select.sql >> /tmp/bad_connect.log 2>&1

done

date

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

select count(*) from dba_users; exit;

26) Analizzare lo script bad_connect.sh e provare a trovare una soluzione

migliore per ottimizzare le prestazioni di tale applicazione. Verificare la

soluzione e discuterla con l'istruttore.

[oracle@edrsr33p1-orcl Common_Mistakes]$ ./better_connect.sh

Wed Mar 26 22:00:48 GMT-7 2008

Wed Mar 26 22:00:50 GMT-7 2008

[oracle@edrsr33p1-orcl Common_Mistakes]$

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

#!/bin/bash

cd /home/oracle/solutions/Common_Mistakes

export ORACLE_SID=orcl

export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1

export

PATH=/u01/app/oracle/product/11.1.0/db_1/bin:/bin:/usr/bin:/usr/

local/bin:/usr/X11R6/bin:/usr/java/jdk1.5.0_11/bin:/bin

date

sqlplus -s jfv/jfv @select2.sql >> /tmp/better_connect.log 2>&1

Oracle Database 11g: workshop di ottimizzazione di istruzioni SQL

Appendice

A - 30

Esercitazione 2-1: evitare gli errori comuni (continuazione)

date

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

declare c number; begin for i in 1

select count(*) into c from dba_users; end loop; end;

/

exit;

500

loop

27) Eseguire il cleanup dell'ambiente eseguendo lo script cleanup_rest.sh