il database oracle 9ixoomer.virgilio.it/fabiobinotto/appuntioracle9i.pdfing. fabio binotto...

27
Ing. Fabio Binotto [email protected] Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un istanza di database si definisce come l'insieme dei processi attivi in background, più la SGA (System Global Area), cioè la memoria che Oracle si riserva allo startup. I processi di background eseguono l' I/O e tengono sotto controllo il funzionamento del database e di tutti gli altri processi. (Per vedere il nome dell'istanza sotto Unix: #echo $ORACLE_SID). La SGA è composta da: Shared Pool (parte di memoria usata per interpretare i comandi SQL e PL/SQL) Library Cache (in particolare carica i comandi, esegue il controllo di sintassi, dei privilegi etc.) Data Dictionary Cache (in particolare contiene le porzioni di dizionario dati che servono per lavorare) Database Buffer Cache (qui vengono caricati i dati di lavoro veri e propri, prelevati dai data files nei dischi rigidi; sono le copie dei blocchi di dati copiati dai data files; l'unità minima di lettura /scrittura dipende dal sistema operativo e generalmente è di 4kB oppure 8kB, ed inferiore a 64kB; questa unità viene definita dal parametro DB_BLOCK_SIZE; i dati vengono gestiti mediante un algoritmo LRU, per cui i dati non acceduti da un certo tempo vengono spostati per fare posto ai nuovi dati. Di fatto è costituita da tre sotto-caches indipendenti, definite mediante i parametri: DB_CACHE_SIZE (dimensione della cache di default), DB_KEEP_CACHE_SIZE (cache che memorizza i dati che si aspetta vengano riutilizzati), DB_RECYCLE_CACHE_SIZE (cache che memorizza i dati che si aspetta non vengano usati se non raramente)). Le informazioni sull'utilizzo sono memorizzate in V$DB_CACHE_ADVICE.

Upload: others

Post on 03-Oct-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

Ing. Fabio [email protected]

Il database Oracle 9iAppunti applicativi

[1] L'istanza, SGA e PGA

Un istanza di database si definisce come l'insieme dei processi attivi in background, piùla SGA (System Global Area), cioè la memoria che Oracle si riserva allo startup.I processi di background eseguono l' I/O e tengono sotto controllo il funzionamento deldatabase e di tutti gli altri processi.(Per vedere il nome dell'istanza sotto Unix: #echo $ORACLE_SID).

La SGA è composta da:

Shared Pool (parte di memoria usata per interpretare i comandi SQL e PL/SQL)

Library Cache (in particolare carica i comandi, esegue il controllo di sintassi, dei privilegi etc.)

Data Dictionary Cache (in particolare contiene le porzioni di dizionario dati che servono per lavorare)

Database Buffer Cache (qui vengono caricati i dati di lavoro veri e propri, prelevati daidata files nei dischi rigidi; sono le copie dei blocchi di dati copiati dai data files; l'unitàminima di lettura /scrittura dipende dal sistema operativo e generalmente è di 4kBoppure 8kB, ed inferiore a 64kB; questa unità viene definita dal parametroDB_BLOCK_SIZE; i dati vengono gestiti mediante un algoritmo LRU, per cui i dati nonacceduti da un certo tempo vengono spostati per fare posto ai nuovi dati. Di fatto ècostituita da tre sotto-caches indipendenti, definite mediante i parametri:DB_CACHE_SIZE (dimensione della cache di default), DB_KEEP_CACHE_SIZE (cacheche memorizza i dati che si aspetta vengano riutilizzati), DB_RECYCLE_CACHE_SIZE(cache che memorizza i dati che si aspetta non vengano usati se non raramente)).Le informazioni sull'utilizzo sono memorizzate in V$DB_CACHE_ADVICE.

Page 2: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

Java Pool (utilizzata per le stored procedure in Java, e per alcune librerie; sconsigliata permotivi di performance; meglio stored procedure in PL/SQL)

Redo Log Buffer (area di memoria utilizzata per registrare i cambiamenti nei dati, primache questi vengano consolidati nel database; lo scopo primario è il recovery dei dati, cioèricostruire le transazioni sul database; contiene tutte le informazioni per ricreare icambiamenti fatti da: INSERT, UPDATE, DELETE, CREATE, ALTER, DROP; è un buffercircolare, la cui dimensione è definita dal parametro LOG_BUFFER)Nota: all'avvio di Oracle il processo SMON esegue dei controlli di coerenza, e nel caso diproblemi può applicare tutta una serie di transazioni o di roll-back fino a portarsi ad unasituazione coerente; SMON interviene se, ad esempio, il database è stato chiuso male, equindi il Control File registra delle incoerenze di sincronizzazione.

Large Pool (area di memoria usata per creare una unica area di memoria, condivisa, permolti utenti, come nel caso di un sito web a cui accedono migliaia di utenti).

Quando un utente si connette ad un server, attiva un processo server il quale esegue leistruzioni SQL per l'utente. Quando per ogni utente si attiva un processo si usa la modalitàchiamata “dedicated server connection”; altrimenti si parla di “shared server connection”.Nel caso di “dedicated server connection” la memoria allocata da ogni utente si chiamaPGA (program global area).

Quindi le aree di memoria fondamentalmente usate sono la SGA e la PGA; ogni utenteavrà (“dedicated server connection”) la propria PGA.

Per vedere l'area di memoria SGA dare: SQL> SHOW SGAA partire dalla versione 9i, la SGA può essere ridimensionata (per quel che riguardaDatabases Buffer Cache, Shared Pool e Large Pool) senza chiudere l'istanza, e quindi acaldo.

I parametri fondamentali della SGA sono:

SGA_MAX_SIZE (massima dimensione della SGA)

DB_CACHE_SIZE (cache del database, default 48MB su Unix, 52MB su Nt)

LOG_BUFFER (buffer allocati dai redo log, attorno a 500kB)

SHARED_POOL_SIZE (area per PL/SQL e dizionario dati, default 16 o 64MB)

LARGE_POOL_SIZE (generalmente a 0, a meno che non vi siaPARRALEL_AUTOMATIC_TUNING=TRUE; Può servire per il Restore mediante RMAN, chediventa velocissimo: in questo caso andrà alta, per esempio a 24MB; è chiaro che puòessere generalmente lasciata a 0, e messa a 24MB dinamicamente (a caldo) nel momento incui serve il restore.)

JAVA_POOL_SIZE (area per stored procedure Java; default 24MB; meglio mettere a 0,

Page 3: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

salvo casi particolari, poiché purtroppo alcune stored procedure Oracle sono in Java(anche se ufficialmente sconsigliate))

Come vedere i parametri (esempio)

SQL>SHOW PARAMETER LARGE (mostra tutti i parametri che contengono la parolalarge)SQL>SHOW PARAMETER JAVA (idem ma per la parola java)

Esempi di modifica dei parametri a caldo:

SQL> ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;SQL> ALTER SYSTEM SET DB_CACHE_SIZE=96M;SQL> ALTER SYSTEM SET LARGE_POOL_SIZE=24M;(tenere presente che la somma delle aree non può eccedere la SGA_MAX_SIZE).

La SGA ed i suio componenti Database Buffer Cache, Shared Pool e Large Pool possonocrescre o decrescere in modo granulare: i granuli sono di 4MB se SGA<128MB, altrimenti igranuli sono di 16MB.

I parametri fondamentali della PGA sono:

OPEN_CURSORS (default 50)

La memoria viene gestita per default in automatico con Oracle 9i (precedentemente vierano parametri quali SORT_AREA_SIZE, HASH_AREA_SIZE,BITMAP_MERGE_AREA_SIZE, CREATE_BITMAP_AREA_SIZE)

Ecco un esempio di parametri dando il comando SQL> SHOW PARAMETER

SQL> show parameterNAME TYPE VALUE ------------------------------------ ----------- ------------------------------ active_instance_count integer aq_tm_processes integer 0 archive_lag_target integer 0 audit_file_dest string ?/rdbms/audit audit_sys_operations boolean FALSE audit_trail string NONE background_core_dump string partial background_dump_dest string /oracle/admin/ORA1/bdump backup_tape_io_slaves boolean FALSE bitmap_merge_area_size integer 1048576 blank_trimming boolean FALSE NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ buffer_pool_keep string buffer_pool_recycle string circuits integer 0 cluster_database boolean TRUE cluster_database_instances integer 2 cluster_interconnects string commit_point_strength integer 1 compatible string 9.2.0 control_file_record_keep_time integer 7 control_files string /metafora/oradata/ORA/controlO

Page 4: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

RA1.ctl, /engi/oradata/ORA/con NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ trolORA2.ctl core_dump_dest string /oracle/admin/ORA1/cdump cpu_count integer 3 create_bitmap_area_size integer 8388608 cursor_sharing string EXACT cursor_space_for_time boolean FALSE db_block_buffers integer 0 db_block_checking boolean FALSE db_block_checksum boolean TRUE db_block_size integer 16384 db_cache_advice string ON NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_cache_size big integer 134217728 db_create_file_dest string db_create_online_log_dest_1 string db_create_online_log_dest_2 string db_create_online_log_dest_3 string db_create_online_log_dest_4 string db_create_online_log_dest_5 string db_domain string db_file_multiblock_read_count integer 16 db_file_name_convert string db_files integer 100 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_keep_cache_size big integer 0 dblink_encrypt_login boolean FALSE db_name string ORA db_recycle_cache_size big integer 0 dbwr_io_slaves integer 0 db_writer_processes integer 1 db_16k_cache_size big integer 0 db_2k_cache_size big integer 0 db_32k_cache_size big integer 0 db_4k_cache_size big integer 0 db_8k_cache_size big integer 0 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ dg_broker_config_file1 string ?/dbs/[email protected] dg_broker_config_file2 string ?/dbs/[email protected] dg_broker_start boolean FALSE disk_asynch_io boolean TRUE dispatchers string distributed_lock_timeout integer 60 dml_locks integer 2440 drs_start boolean FALSE enqueue_resources integer 1024 event string fal_client string NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ fal_server string fast_start_io_target integer 0 fast_start_mttr_target integer 0 fast_start_parallel_rollback string LOW file_mapping boolean FALSE filesystemio_options string setall fixed_date string gc_files_to_locks string global_context_pool_size string global_names boolean FALSE hash_area_size integer 2097152 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ hash_join_enabled boolean TRUE hi_shared_memory_address integer 0 hs_autoregister boolean TRUE ifile file /oracle/admin/ORA1/pfile/confi gORA.ora instance_groups string instance_name string ORA instance_number integer 1 java_max_sessionspace_size integer 0 java_pool_size big integer 16777216 java_soft_sessionspace_limit integer 0

Page 5: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ job_queue_processes integer 4 large_pool_size big integer 0 license_max_sessions integer 0 license_max_users integer 0 license_sessions_warning integer 0 local_listener string lock_name_space string lock_sga boolean FALSE log_archive_dest string log_archive_dest_state_1 string enable log_archive_dest_state_10 string enable NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_state_2 string enable log_archive_dest_state_3 string enable log_archive_dest_state_4 string enable log_archive_dest_state_5 string enable log_archive_dest_state_6 string enable log_archive_dest_state_7 string enable log_archive_dest_state_8 string enable log_archive_dest_state_9 string enable log_archive_dest_1 string log_archive_dest_10 string log_archive_dest_2 string NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_3 string log_archive_dest_4 string log_archive_dest_5 string log_archive_dest_6 string log_archive_dest_7 string log_archive_dest_8 string log_archive_dest_9 string log_archive_duplex_dest string log_archive_format string %t_%s.dbf log_archive_max_processes integer 2 log_archive_min_succeed_dest integer 1 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_start boolean FALSE log_archive_trace integer 0 log_buffer integer 1048576 log_checkpoint_interval integer 0 log_checkpoints_to_alert boolean FALSE log_checkpoint_timeout integer 1800 log_file_name_convert string logmnr_max_persistent_sessions integer 1 log_parallelism integer 1 max_commit_propagation_delay integer 99 max_dispatchers integer 5 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ max_dump_file_size string UNLIMITED max_enabled_roles integer 30 max_rollback_segments integer 122 max_shared_servers integer 20 mts_circuits integer 0 mts_dispatchers string mts_listener_address string mts_max_dispatchers integer 5 mts_max_servers integer 20 mts_multiple_listeners boolean FALSE mts_servers integer 0 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ mts_service string ORA mts_sessions integer 0 nls_calendar string nls_comp string nls_currency string nls_date_format string nls_date_language string nls_dual_currency string nls_iso_currency string nls_language string AMERICAN nls_length_semantics string BYTE

Page 6: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ nls_nchar_conv_excp string FALSE nls_numeric_characters string nls_sort string nls_territory string AMERICA nls_time_format string nls_timestamp_format string nls_timestamp_tz_format string nls_time_tz_format string object_cache_max_size_percent integer 10 object_cache_optimal_size integer 102400 olap_page_pool_size integer 33554432 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ open_cursors integer 300 open_links integer 4 open_links_per_instance integer 4 optimizer_dynamic_sampling integer 1 optimizer_features_enable string 9.2.0 optimizer_index_caching integer 0 optimizer_index_cost_adj integer 100 optimizer_max_permutations integer 2000 optimizer_mode string CHOOSE oracle_trace_collection_name string oracle_trace_collection_path string ?/otrace/admin/cdf NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ oracle_trace_collection_size integer 5242880 oracle_trace_enable boolean FALSE oracle_trace_facility_name string oracled oracle_trace_facility_path string ?/otrace/admin/fdf os_authent_prefix string ops$ os_roles boolean FALSE O7_DICTIONARY_ACCESSIBILITY boolean FALSE parallel_adaptive_multi_user boolean FALSE parallel_automatic_tuning boolean FALSE parallel_execution_message_size integer 2176 parallel_instance_group string NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_max_servers integer 5 parallel_min_percent integer 0 parallel_min_servers integer 0 parallel_server boolean TRUE parallel_server_instances integer 2 parallel_threads_per_cpu integer 2 partition_view_enabled boolean FALSE pga_aggregate_target big integer 0 plsql_compiler_flags string INTERPRETED plsql_native_c_compiler string plsql_native_library_dir string NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ plsql_native_library_subdir_count integer 0 plsql_native_linker string plsql_native_make_file_name string plsql_native_make_utility string plsql_v2_compatibility boolean FALSE pre_page_sga boolean FALSE processes integer 500 query_rewrite_enabled string false query_rewrite_integrity string enforced rdbms_server_dn string read_only_open_delayed boolean FALSE NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ recovery_parallelism integer 0 remote_archive_enable string true remote_dependencies_mode string TIMESTAMP remote_listener string remote_login_passwordfile string NONE remote_os_authent boolean FALSE remote_os_roles boolean FALSE replication_dependency_tracking boolean TRUE resource_limit boolean FALSE resource_manager_plan string rollback_segments string NAME TYPE VALUE

Page 7: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

------------------------------------ ----------- ------------------------------ row_locking string always serializable boolean FALSE serial_reuse string DISABLE service_names string ORA, ORA1, ORA2 session_cached_cursors integer 0 session_max_open_files integer 10 sessions integer 555 sga_max_size big integer 522161952 shadow_core_dump string partial shared_memory_address integer 0 shared_pool_reserved_size big integer 15938355 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ shared_pool_size big integer 318767104 shared_servers integer 0 shared_server_sessions integer 0 sort_area_retained_size integer 1048576 sort_area_size integer 1048576 spfile string sql_trace boolean FALSE sql_version string NATIVE sql92_security boolean FALSE standby_archive_dest string ?/dbs/arch standby_file_management string MANUAL NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ star_transformation_enabled string FALSE statistics_level string TYPICAL tape_asynch_io boolean TRUE thread integer 1 timed_os_statistics integer 0 timed_statistics boolean TRUE trace_enabled boolean TRUE tracefile_identifier string transaction_auditing boolean TRUE transactions integer 610 transactions_per_rollback_segment integer 5 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_suppress_errors boolean TRUE undo_tablespace string undotbs1 use_indirect_data_buffers boolean FALSE user_dump_dest string /oracle/admin/ORA1/udump utl_file_dir string * workarea_size_policy string MANUAL

Page 8: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[2]I files del database

I dati vengono memorizzati entro files sui dischi rigidi.I files sono di tre tipi:

Data files: contengono i dati del database;

Online redo log files: contengono una registrazione di tutti gli ultimi cambiamenti fattisul database, per permettere anche il recovery del database in caso di failure;

Control files: contengono tutte le informazioni per mantenere e verificare l'integrità del database.Gestiscono quindi la sincronizzazione di tutte le informazioni sul database. Senza questi files ildatabase non può partire.

Vi sono poi altri files:

il file dei parametri (initINSTANCE.ora);

il password files (autentica gli utenti privilegiati alla gestione del database);

gli Archived redo log files: sono copie offline dei redo log files; applicando tutte queste copie epartendo da un punto di backup, si possono ricostruire tutte le ultime transazioni di un database.

Page 9: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[3]I processi di backgroundI processi di background mantengono le relazioni tra le strutture di memorizzazione fisicae quelle di memorizzazione temporanea.I processi obbligatori (per il funzionamento del database) sono:

DBWnE' il processo Database Writer; trascrive i blocchi dal database buffer cache ai data files suidischi; scrive quando: avviene un checkpoint, i dirty buffer raggiungono un valore disoglia, non ci sono buffer liberi, vi sono timeout, quando una tablespace viene postaoffline, quando una tablespace viene posta in readonly, quando vi è un drop o truncate diuna tabella, quando comincia un backup (SQL>ALTER TABLESPACE PIPPO BEGINBACKUP), quando vi è una richiesta RAC di ping.

PMONSorveglia i processi server; nel caso di problemi, fa il rollback delle transazioni, rilascia ilock, rilascia altre risorse (nella versione 9, ogni 30-60 secondi killa i processi server chericonosce come anomali o terminati non correttamente).

CKPTIL processo di Checkpoint scrive ogni 3 secondi e memorizza dati nel control file permemorizzare in quale posizione dei redolog on line il recovery debba cominciare, nel casodi crash. Tiene quindi conto di quanto il DBWn abbia già scritto nei data files, e di quandosia stato scritto dai redolog online ai redolog files.

LGWRE' il processo di log writer; scrive quando è vera una di queste condizioni: quando c'è uncommit, quando è pieno per un terzo (siccome è piccolino, 500kB per esempio, scrivefrequentemente), quando vi è 1MB di redo buffer, ogni tre secondi, prima che scriva ilDBWn.Il processo LGWR chiede al DBWn di scrivere.LGWR conferma le sue operazioni sono dopo che il redo buffer è stato scritto su disco.

SMONDopo un crash ripristina la situazione (rollback o rollforward).

ARCnE' il processo opzionale che automaticamente archivia gli online redo buffer quando èsettato il modo ARCHIVELOG; preserva una registrazione di tutti i cambiamenti fatti suldatabase. E' una modalità cruciale per il recupero dei dati dopo la perdita di un disco.Di solito un database di produzione è configurato con gli ARCHIVELOG attivi.

Regole per i processi di background:1) i processi DBW e LGWR si fermeranno assieme, allo shutdown;2) LGWR deve stare sempre avanti a DBWR, nella scrittura su disco;3) LGWR starà avanti quanto definito da alcuni parametri che tengono conto del tempo

per eseguire le transazioni.

Page 10: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

Per memorizzare: il processo LGWR si può paragonare alla lepre, inseguita dal cane SanBernardo, il processo di DBW. Tipicamente LGWR scatta ogni decimo di secondo; ilDBW scatta ogni 15-20 minuti.

Page 11: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[4] Struttura logica del database

La struttura è la seguente:

tablespace (la più piccola entità amministrabile del database)Le tablespace possono essere messe fuori linea, eccetto per la system e per la undo attiva.Di una tablespace si può fare il backup separato.Una tablespace può essere messa in read/write o in read-only.

segments (tabelle, indici)extents (insiemi di blocchi allocati dai segmenti)blocchi (la più piccola entità letta o scritta)

[5] Gli utenti amministratori del database

Gli utenti sys e system sono creati automaticamente durante la creazione del database.Essi hanno i diritti di DBA.Sys è il possessore del dizionario dei dati del database.System è il possessore delle tabelle addizionali e delle viste usate per la gestione deldatabase.Per motivi di sicurezza, le password di sys e system vanno cambiate subito dopo lainstallazione del database.

Modalità di connessione per sys:

$sqlplus /nologsql>connect / as sysdba

Page 12: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[6] I files di inizializzazione (dei parametri)

Il file dei parametri può essere statico o dinamico (modificabile a caldo).File statico: pfile, file di testo, initSID.oraFile dinamico: spfile, file binario, spfileSID.oraI file si trovano in $ORACLE_HOME/dbs

Posso creare un file a partire dall'altro:SQL>CREATE SPFILE FROM PFILESQL>CREATE PFILE FROM SPFILE

Cosa userà Oracle?In ordine:$ORACLE_HOME/dbs/spfileSID.ora$ORACLE_HOME/dbs/spfile.ora$ORACLE_HOME/dbs/initSID.ora$ORACLE_HOME/dbs/init.ora

Oppure a mano bisogna dare:SQL> startup pfile='xyz';(non esiste startup spfile).

Nota bene: le modifiche a caldo vengono registrate nell'spfile solo se il database è partitocon quell'spfile.

Le modifiche possibili sono del tipo:

SQL>ALTER SYSTEM SET SHARED_POOL_SIZE=4M;SQL>ALTER SYSTEM SET UNDO_TABLESPACE=UNDO2;SQL>ALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=spfile(so che l'ultimo parametro non può essere modificato a caldo, ma registra la modificanell'spfile per la prossima partenza)

Esempio di pfile:

ifile = /oracle/admin/ORA1/pfile/configORA.orabackground_dump_dest = /oracle/admin/ORA1/bdumpuser_dump_dest = /oracle/admin/ORA1/udumpcore_dump_dest = /oracle/admin/ORA1/cdumpinstance_number = 1instance_name = ORAthread = 1undo_tablespace = undotbs1job_queue_processes = 4job_queue_interval = 10open_links = 4

Page 13: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

il file configORA.ora a cui si fa riferimento ha il seguente contenuto:

cluster_database = truecontrol_files =(/metafora/oradata/ORA/controlORA1.ctl,/engi/oradata/ORA/controlORA2.ctl)compatible = 9.2.0db_block_size = 16384db_cache_size = 120Mdb_file_multiblock_read_count = 16db_files = 100db_name = ORAenqueue_resources = 1024java_pool_size = 8Mlog_buffer = 1048576open_cursors = 300optimizer_mode = CHOOSEprocesses = 500service_names = (ORA, ORA1, ORA2)shared_pool_size = 300Msort_area_retained_size = 1048576sort_area_size = 1048576undo_management = auto# rimuovere quando non ci saranno piu' "SET TRANSACTION" stmts inapplicazioniundo_suppress_errors = trueutl_file_dir = *

Page 14: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[7] Partenza e chiusura del databaseGli stati del database sono i seguenti:

OPENMOUNT

NOMOUNTSHUTDOWN

in salita si possono percorrere tutti i gradini; in discesa si può fare solo shutdown.

SQL>STARTUP NOMOUNT (parte solo l'istanza; posso in questo stato creare undatabase con CREATE DATABASE...; serve inoltre per il backup con RMAN)(si passa al livello successivo con ALTER DATABASE PIPPO MOUNT)

SQL>STARTUP MOUNT (vengono aperti e letti i control files; serve per gestire iproblemi di recovery)(si passa al livello successivo con ALTER DATABASE PIPPO OPEN oppure, per esempio,ALTER DATABASE PIPPO OPEN READ ONLY)

SQL>STARTUP (si aprono tutti i files, eventualmente si fa un recovery se il db non ècosnistente).(oppure SQL>STARTUP RESTRICTED; solo il dba può lavorare; equivalente ad ALTERSYSTEM ENABLE RESTRICTED SESSION, che si può usare quando il db è già partito,avendo cura di far terminare le sessioni già terminate).

La chiusura del database si effettua in questi modi:

SQL>SHUTDOWN (normal)Oracle aspetta che tutti gli utenti finiscano le transazioni; non permette nuove connessioni,ma si aspetta un tempo lunghissimo.

SQL>SHUTDOWN ABORTOracle chiude il db chiudendo immediatamente tutti i processi; non fa eventuali rollback;non adrebbe mai fatto se non in casi di reale emergenza.

SQL>SHUTDOWN IMMEDIATEOracle chiude in subito in modo corretto; termina i processi attivi e fa il rollback delletransazioni non terminate; salva il db in uno stato consistente. E' la modalità da utilizzare.(sotto Windows vi sono le chiavi di registro: ORA_ORCL_SHUTDOWN='TRUE' edORA_ORCL_SHUTDOWNTYPE='I', per garantire questa modalità alla chiusura delservizio)

SQL>SHUTDOWN TRANSACTIONALE' analogo allo shutdown (normal); chiude subito le select, ma aspetta per le transazioniattive.

Page 15: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[8] Strumenti diagnostici

Per vedere dove vengono mandati i messaggi di log, dare il comando:SQL>SHOW PARAMETER DUMP_DEST(il parametro da vedere è BACKGROUND_DUMP_DEST).

Il file principale è: alert SID.log.Tiene la storia di tutto quello che è successo nel database; posso vedere le corruzionifisiche, gli errori (cercare “error” oppure “ORA-”); se non vi sono problemi si puòcancellare tranquillamente.

Poi vi sono i files di trace: sono sotto ../admin/udump (user)../admin/cdump../admin/bdump (background processes)

L'utility tkprof permette di formattare l'output dei files in modo comprensibile.

E' possibile mettere sotto trace una sessione:SQL>ALTER SESSION SET SQL_TRACE=TRUE

oppure

SQL>DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION

Si può dare il comando anche a livello di istanza, ma è sconsigliato:SQL_TRACE=TRUE

Page 16: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[9] Il dizionario datiIl dizionario dati descrive il database ed i suoi oggetti.Contiene tabelle readonly e viste.Sono memorizzate nella tablespace System, e possedute da Sys.

Le viste sono di tre tipi:

dba_xxxquello che c'è in tutti gli schemi

all_xxxquello a cui un utente può accedere (grazie a dei privilegi)

user_xxxquello che esiste nello schema dell'utente

Viste interessanti:DICTIONARY, DICT_COLUMNSDBA_TABLES, DBA_INDEXES...DBA_SEGMENTS, DBA_EXTENTS...DBA_TABLESPACES, DBA_DATA_FILES...

Oracle gestisce se stesso mediante i comandi DDL (data definition language) che sonoessenzialmente: CREATE, ALTER, DROP, TRUNCATE, GRANT/REVOKE, ANALYZE.Tali comandi non hanno bisogno del commit, sono auto-committanti. Quindi non si tornaindietro mediante rollback!

Il comando analyze merita dei commenti.Il comando analyze serve per creare delle statistiche sull'utilizzo delle tabelle; in pratica sivanno a compilare dei campi (che contengono contatori) già esistenti, e che altrimentirimarrebbero sempre vuoti.Se Oracle dispone di questi dati può ottimizzare i suoi piani di esecuzione.

Esercizio;

SQL> SELECT * FROM DBA_TABLES;(vedo le informazioni su tutte le tabelle)SQL> SELECT * FROM DBA_TABLES WHERE TABLE_NAME='ANTO';(vedo i campi vuoti relativamente alla tabella anto)

SQL> ANALYZE TABLE ANTO COMPUTE STATISTICS;(calcolo le statistiche su anto)SQL> ANALYZE TABLE ANTO ESTIMATE STATISTICS;(stimo le statistiche su anto; meglio il comando precedente)

SQL> SELECT * FROM DBA_TABLES WHERE TABLE_NAME='ANTO';

Page 17: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

(ora i campi statistici su anto sono compilati)

Le viste di dizionarioalcune viste sono le seguenti (ottenibili mediante i seguenti script):

SQL> SELECT * FROM USER_TABLES;SQL> SELECT TABLE_NAME FROM USER_TABLES;SQL> SELECT TABLE_NAME FROM DBA_TABLES; (se ho i privilegi di select anydictionary)SQL> SELECT * FROM DBA_TABLES WHERE OWNER='PIPPO';SQL> SELECT * FROM DBA_SEGMENTS;SQL> SELECT * FROM DBA_EXTENTS WHERE OWNER='PIPPO' ANDSEGMENT_TYPE='TABLE';SQL> SELECT * FROM DICTIONARY;

Le V$* sono virtual tables (viste delle tabelle del dizionario), e sono create al runtimeperchè riflettono l'attività corrente del database. Sono continuamente aggiornatedurante l'attività del database. Sono usate per monitorizzare il database al runtime.

Esempi di V$* sono:

V$SGASTATV$SESSIONV$CONTROLFILEV$DATAFILEV$INSTANCEV$PARAMETERV$SGAV$TABLESPACEV$VERSIONV$THREADV$DATABASEV$SPPARAMETER

Page 18: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[10] Il control file

Il control file è un piccolo file binario, che definisce lo stato corrente del database. Server amantenere l'integrità del database. E' richiesto al mount del database durante lo startupdel database; la perdita del control file richiede il recovery del database.Contiene:– il nome del database– il time stamp della creazione del database– i nomi delle tablespaces– nomi e localizzazioni dei data files e dei redo log files– il numero di sequenza del redo log file corrente– informazioni sui checkpoint– inizio e fine dei segmenti di undo– informazioni sugli archivi di redo log– informazioni sui backup

Si raccomanda fortemente che i control file siano più di uno e memorizzati su dischidiversi, per evitare problemi dovuti alla corruzione di uno di essi.Il control file va salvato subito dopo una modifica al database.

Informazioni sul contro file si trovano in:

v$controlfilev$parameter

inoltre si può dare il comando

SQL>SHOW PARAMETER CONTROL_FILE

Page 19: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[11] I redo log files

I redo log files hanno le seguenti caratteristiche:

– registrano tutti i cambiamenti effettuati sui dati– forniscono un meccanismo per il recovery dei dati– possono essere organizzati in gruppi– servono almeno due gruppi

Quando un database sta lavorando, tutte le transazioni vengono scritte in modosincrono anche nei buffers di redo log, i quali vengono poi scaricati nei files di redo log;Questo serve a creare un meccanismo per recuperare le transazioni, in caso del crash deldatabase o di un media (a meno che vi sia una clausola di NOLOGGING abilitata, adesempio caricando i dati con SqlLoader).Quindi i redo log files sono utilizzati per recuperare dati committati ma che non sonoancora stati scritti sui data files.Gli online redo log files sono usati solo per il recovery.

I redo log sono organizzati in gruppi; ogni gruppo contiene files identici (copie ridondantiper sicurezza); i file identici vanno messi su dischi diversi.Il processo di LGWR (log writer) scrive le informazioni in contemporanea su tutte le copiedi un gruppo. I gruppi devono essere almeno due.

Gli on line redo log files sono usati in modo ciclico; quando un gruppo è pieno, il LGWRmuove al prossimo gruppo, con una azione chiamata “switch”; in questo caso avvieneanche un checkpoint e l'informazione viene scritta sul control file.

Si può forzare sia uno switch che un checkpoint:

SQL>ALTER SYSTEM SWITCH LOGFILE;SQL>ALTER SYSTEM CHECKPOINT;

Si possono aggiungere file ai log file:

SQL>ALTER DATABASE PIPPO ADD LOGFILE GROUP 2('/usr/oracle/esempio/a.rdo') SIZE 2M;

Se un gruppo di redo log non è attivo, si può cancellare:SQL> ALTER DATABASE DROP LOGFILE GROUP 3;

Analogamente si può cancellare un file:SQL> ALTER DATABASE DROP LOGFILE MEMBER '/usr/oracle/esempio/a.rdo';(se è attivo l'archivelog mode, bisogna che il file sia stato archiviato prima che vi sia lapossibilità di cancellarlo).

Può succedere che un redo log file si corrompa mentre il database stà funzionando; allorasi può reinizializzare senza chiudere il database:

Page 20: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

SQL>ALTER DATABASE CLEAR LOGFILE GROUP 2;

Naturalmente in questo caso non si può più eseguire il recover del database dall'ultimobackup.

Nota: guardando l'alert log, se il processo di LGWR deve attendere frequentemente ungruppo perchè il checkpoint non è avvenuto o il gruppo non è stato archiviato, allorabisogna aggiungere un gruppo.

Dove trovare informazioni sui membri:

V$LOG, V$LOGFILE

Gli stati corrispondenti sono:

UNUSED: mai usatoCURRENT: attualmente in usoACTIVE: attivo, ma non corrente; è necessario per il recovery, nel caso succeda un crashCLEARING: è nella fase di ricreazioneCLEARING_CURRENT: nella fase di ricreazione, anomalaINACTIVE: non in uso e non necessario per il recovery.

Il database può essere attivo in ARCHIVELOG mode o NOARCHIVELOG; convieneattivare il modo ARCHIVELOG, così i redo log files vengono attivati in automatico daiprocessi di ARC.Per vedere se è attivo il processo di ARC:

SQL> select archiver from v$instance;

ARCHIVE-------STOPPED

Page 21: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[12] Le tablespace ed i data files

I dati sono memorizzati fisicamente nei datafiles e logicamente nelle tablespace.

La tablespace principale è quella di SYSTEM, creata assieme al database. Contiene ildizionario dei dati ed il segmento di UNDO di sistema.

Altre tablespace possono essere create dall'amministratore. TEMP ed UNDO sonoproposte di default all'atto della creazione di un database.

SQL>CREATE TABLESPACE userdata DATAFILE '/usr/prova/dati_001.dbf' SIZE 10M;

I parametri fondamentali sono:

DATAFILE: specifica il file di dati;LOGGING (è il default): significa che i cambiamenti di tabelle, indici e partizioni sonoscritti entro i redo log files);OFFLINE: tablespace fuori linea;PERMANENT: la tablespace può essere utilizzata per contenere oggetti permanenti;TEMPORARY: la talblespace può essere usata solo per oggetti temporanei, come adesempio per contere le tabelle temporanee usate da ORDER BY etc.EXTENT MANAGEMENT LOCAL (default per la 9i): gestione automatica e locale degliextents; è contrario di DICTIONARY MANAGED TABLESPACE;Vantaggio: evita operazioni ricorsive di management, si riduce la contesa sulle tabelle didizionario dati, si libera automaticamente lo spazio libero adiacente non essendo piùnecessaria l'azione di Coalesce, non si generano informazioni di UNDO relativamenteall'aggiornamento delle tabelle di dizionario;NEXT: prossimo incremento della tab. su disco, se richiesto;MAXSIZE: massimo spazio su disco consentito per estensione automatica di un datafile;Dare sempre un massimo, mai mettere UNLIMITED.

Nota: non migrare la System da DICTIONARY A LOCAL: è PERICOLOSO;

UNDO TABLESPACE: usate per memorizzare le vecchie informazioni

TEMPORARY TABLESPACE: usate per memorizzare risultati di ORDER BY, GROUPBY, DISTINCT, UNION, INTERSECT...

E' IMPORTATE CREARE LA DEFAULT TEMPORARY TABLESPACE, ALTRIMENTI ILDATABASE USA LA TABLESPACE SYSTEM PER MEMORIZZARE I DATITEMPORANEI!!!

La tabella temporanea viene svuotata solo allo shutdown; altrimenti bisogna aggiungereuna tablespace vuota, metterla come tablespace di default, cancellare la vecchia.

Per vedere informazioni sulle tablespace temporanee: SQL> SELECT * FROM DATABASE_PROPERTIES;

Page 22: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

SQL> SHOW PARAMETERS OPEN_CURSORSopen_cursors = 6000 per ogni pgasort_area_size = 65536 è l'area a disposizione di un utente per gli ordinamenti in memoriaRAM, dopo di che si comincia ad occupare la zona di memoria TEMP;pga_aggregate_target = 24M utilizzando questo parametro evito swap su disco in quantogli ordinamenti vengono eseguiti all'interno di questo spazio; se pga_aggregate_target=0significa che non è utilizzato questo spazio.

Mettere la tablespace in Read Only:SQL> ALTER TABLESPACE PIPPO READ ONLY;Questa istruzione causa un checkpoint;i dati sono disponibili solo in lettura;gli oggetti sono cancellabili entro la tablespace (ad esempio posso cancellare un indice ericostruirlo).

Mettere la tablespace offline (ed online):

SQL>ALTER TABLESPACE PIPPO OFFLINE [normal | temporary|immediate|forrecovery];SQL>ALTER TABLESPACE PIPPO ONLINE;

La tablespace System non può essere messa offline;Non possono essere messe offline le tablespace on attivi segmenti di UNDO;Non può essere messa offline la default temporary tablespace.

L'operazione di Coalesce

L'operazione di coalesce serve a togliere le flag che suddividono ancora gli extent liberi, inmodo da aumentare lo spazio contiguo libero, altrimenti lo spazio risulta libero, ma selibero, per es., a frammenti da 4k e mi serve un frammento da 8k non posso utilizzarlo.

L'operazione di coalesce è la seguente:

SQL> ALTER TABLESPACE PIPPO COALESCE;

E' compito del dba lanciare il coalesce, perchè generalmente il processo di SMON non lofa.Se la tablespace è DICTIONARY MANAGED, il coalesce è necessario; se la tablespace èLOCALLY MANAGED, il coalesce non è necessario, perchè gli extents sono gestiti inautomatico all'interno della tablespace.

Operazioni consigliate periodicamente:per non avere frammentazione e per ottimizzare gli indici:export – drop – import.

Page 23: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[13] Le tabelle ed indiciFanno parte dei Segments che generalmente sono:Tabelle, indici, table partition, cluster (composti da una o più tabelle), nested tables,LOBs, undo segments, temporary segments, etc.

LE TABELLE

Esempio di comando per la creazione di una tabella:

CREATE TABLE PIPPO(nome varchar2(30),cognome varchar2(30),codice number(12))STORAGE(INITIAL 200KNEXT 200KPCT INCREASE 0MINEXTENT 1MAXEXTENT 10)TABLESPACE ESEMPIO;

Altri parametri:INITRANS: minimo numero di transazioni concorrenti per il blocco;

MAXTRANS: massimo numero di transazioni concorrenti (default 255) per il blocco;

PCT FREE (default 10%; quanto spazio rimane libero entro un blocco)(se il parametro è giusto, sarà simile all' AVG_SPACE= spazio medio libero in un blocco, evi saranno poche riche concatenate o spostate (CHAIN_CNT); questi parametri li vedotramite le statistiche che il dba deve lanciare periodicamente per garantire l'uso di buonipiani di esecuzione); PCT FREE serve per permettere le modifiche all'interno del blocco;

PCTUSED (default 40%): spazio minimo occupato nel blocco; un blocco vieno messo nellalista dei blocchi liberi (FREELIST) quando lo spazio occupato scende sotto il 40%;

Nota: il numero giusto da dare a pct increase è 0; infatti, perchè avere tabelle che cresconoesponenzialmente? Pct increase è generalmente responsabile della frammentazione.

Nota: conviene gestire in automatico lo spazio entro i blocchi (pctused, feelist e freelistgroups possono essere gestiti automaticamente). Come fare:

SQL> CREATE TABLESPACE PIPPOTAB DATAFILE 'usr/file1' EXTENTMANAGEMENT LOCAL UNIFORM SIZE 64K SEGMENT SPACE MANAGEMENTAUTO;(è prerequisito extent management local!).

Page 24: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

MOVE: il comando di move serve a muovere fisicamente i dati; li compatta e li ottimizza;un tempo esisteva solo la sequenza: EXPORT, TRUNCATE, IMPORT, CREATE INDEX,ABILITA I CONSTRAINTS, ma questo causava disservizio;il comando è il seguente:

SQL> ALTER TABLE PIPPO MOVE;(esegue una create table as select ..., cancella la tabella vecchia, rinomina la nuova con lostesso nome; gli indici sono a carico nostro => bisogna fare il rebuild degli indici, perchègli indici continuerebbero ad esistere, ma le rowid punterebbero alla vecchia tabellacancellata; sono marcati allora UNUSABLE);

Posso anche spostare una tabella da una tablespace all'altra:

SQL> ALTER TABLE PIPPO MOVE TABLESPACE ESEMPIO;

Come fare con gli indici?

SQL> select * from dba_indexes where table_name='PIPPO';supponiamo esista un indice di nome PIPPO_INDICE_01

SQL> ALTER INDEX ESEMPIO.PIPPO_INDICE_01 REBUILD;

Allo scopo conviene creare degli scripts così:

SQL> SELECT 'ALTER INDEX '||index_name||' REBUILD;' FROM DBA_INDEXESWHERE STATUS='UNUSABLE';

TRUNCATE:cancella i dati nella tabella resettando la watermark; rilascia tutti gli extent non richiesti daminextent;è il modo più veloce per svuotare una tabella.SQL> TRUNCATE TABLE ESEMPIO.PIPPO;

DROP:cancello la tabella;SQL> DROP TABLE ESEMPIO.PIPPO CASCADE COSTRAINT;(cascade costraint è necessaria se esiste una foreign key);Attenzione: se specifico anche ON DELETE CONSTRAINT mi cancella anche il camporelatino della foreign key!

OPERAZIONI SULLE COLONNE: SQL> ALTER TABLE PIPPO DROP COLUMN COMMENTI CASCADE CONSTRAINTSCHECKPOINT 1000; (pesante)

Page 25: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

SQL> ALTER TABLE PIPPO RENAME COLUMN COGNOME TO COGNOME2;

SQL> ALTER TABLE PIPPO MODIFY COLUMN COGNOME NULL;

SQL> ALTER TABLE PIPPO SET UNUSED COLUMN COMMENTS CASCADECONSTRAINTS; (rende assolutamente inutilizzabile la colonna);

GLI INDICI

Gli indici possono essere di tipo:– UNIQUE O NONUNIQUE– FUNCTION BASED (esempio UPPER(NOME))– DOMAIN (per ricerche particolari)

Gli indici occupano spazio e sono onerosi (ad esempio, un update in tabella implicacancellazione ed inserimento entro un indice, scrittura nei Roll_back e nei Redo_log);

Se faccio una ricerca vediamo quando uso l'indice:

...where nome='fabio' usa l'indice

...where nome in ('fabio','laura') può usare l'indice

...where nome <> 'fabio' non usa l'indice

...where nome like 'fab%' usa l'indice

...where nome like '%bio' non usa l'indice

...where nome is null non usa l'indice

Per quel che riguarda le tipologie di indici utilizzabili, B-tree e Bitmap, vediamo quandosono utili:

B-tree index: selettività < 5%Bitmap index: selettività < 20%

i bitmap vanno bene per bassa cardinalità e sono efficienti per il datawarehousing; da nonusare per le transazioni online (mettono il lock su tutto uno stream), perchè sonotremendamente onerosi;

SQL> CREATE INDEX I1 ON PIPPO(CODICE) TABLESPACE INDX; (B-TREE)

SQL> CREATE BITMAP INDEX I1 ON PIPPO(CODICE) TABLESPACE INDX; (BITMAP)

Operazioni sugli indici:

SQL> ALTER INDEX I1 REBUILD;(ricostruisce l'indice ed abbandona il vecchio; durante il lavoro mette un lock sull'indice);

Page 26: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

SQL> ALTER INDEX I1 REBUILD ONLINE;(sconsigliato se le modifiche on line sono molte)

SQL> ALTER INDEX I1 COALESCE; (compatta i blocchi, se possibile)

SQL> DROP INDEX I1;

SQL> ALTER INDEX I1 DEALLOCATE UNUSED; (libera i blocchi non usati)

SQL> ALTER INDEX I1 VALIDATE STRUCTURE; (verifica se vi sono blocchi corrotti;popola la vista INDEX_STATS);

COME VEDERE SE GLI INDICI SONO UTILIZZATI E QUANTO:

SQL> ALTER INDEX I1 MONITORING USAGE; (POI NOMONITORING)

lo lascio attivo per esempio una settimana e poi vedo le statistiche di uso inV$OBJECT_USAGE

COME FORZARE L'USO DELL'INDICE:

SQL> SELECT /*+ INDEX(PIPPO, I1) */ FROM PIPPO WHERE MATRICOLA>0;FUNCTION BASED INDEX:

Se ho un indice su COLONNA1 e faccio una ricerca dove vi è:

select ... where to_char(COLONNA1)='XX';

la ricerca non segue l'indice; allora devo fare un function based index su to_char(COLONNA1).

Analogamente sul to_number di un parametro e così via.

Page 27: Il database Oracle 9ixoomer.virgilio.it/fabiobinotto/AppuntiOracle9i.pdfIng. Fabio Binotto bnfabio@netscape.net Il database Oracle 9i Appunti applicativi [1] L'istanza, SGA e PGA Un

[*] Appendice: alcune note 1) Gli indici vanno ricostruiti frequentemente, anche ogni sera se serve; l'istruzione da

usare è: rebuild; questa operazione si fa al runtime;2) Attenzione: l'istruzione “select * from tabella” non usa l'indice, ma fa full scan sulla

tabella;3) Nella versione 9 di Oracle è stata inserita anche l'istruzione: merge (oltre a insert,

update, delete, select);4) Quanto si modificano dei dati, i dati vecchi vengono salvati nella tablespace di UNDO (i

vecchi roll back segments); se si fanno grosse modifiche, il commit va dato subito,altrimenti gli utenti che fanno select sono forzati a leggere negli UNDO i vecchi dati,con grossa perdita di prestazioni. Poiché inoltre il Lock viene tolto alla successiva select(per motivi di ottimizzazione), conviene lanciare, dopo un commit su grosse quantità didati, una select che legga tutti i record interessati; generalmente se faccio questeoperazioni la sera, il mattino dopo gli utenti trovano tutti i record senza Lock, e non ènecessario nessun ulteriore controllo sui record.Una select che legge tutti i record non è “select count(*) from tabella” perchè si basasull'indice per eseguire il conteggio; “select * from tabella” non va bene perchè provocaun grosso output; bisogna dare “select count(colonna_nullable) from tabella” perchè lacolonna che permette null sarà letta senza usare indici.

5) Modalità con cui si eseguono le select e si conserva la consistenza temporale dei dati:faccio select all'istante 50faccio update di alcuni degli stessi record all'istante 51faccio il commit all'istante 53se la select dura molto posso ottenere due risultati:a) “snapshot too old” se il roll back segment su cui leggo i dati vecchi dell'istante 50 èstato sovrascritto;b) vedo i dati all'istante 50 (pur essendo in istanti > 53) se il roll back segment non èstato sovrascritto;

6) Come vedere le dimensioni di una tabella: select sum(bytes) from tabella;7) I software di Oracle si scarica da: http://otn.oracle.com8) Wrapping = nascondere; di soligo si usa per alcune storage procedures per preservare

la proprietà intellettuale.