paolo@bimodesign.com | +34 608 61 64 10

DB Relational

        

Differenze tra Oracle e MySql (parte I)

Gli elementi in comune tra questi due RDBMS sono molto di piu’ delle differenze, che possiamo catalogarle seguendo questo schema


- Data Types
- Funzioni
- Ottimizzazione
- Stored Procedure
- Trigger
- Varie

Come premesso nell'introduzione a questo articolo, l'elenco delle differenze e' parziale e verra' integrato in futuro. Inoltre non trattero' quelle sull’architettura, l’installazione, il tuning, le prestazione, le replicación e i programmi di supporto in quanto le mie attuali conoscenze non mi permettono di appronfondirle in questo articolo.

Data types:

Nei tipi dati riscontriamo notevoli differenze.

  Oracle MySql
Numerici Presenta 1 tipo numerico, NUMBER, che contine fino a 38 digits. INT, FLOAT, etc sono compresi in Number. Piu' selettivo, consentendo di scegliere un datatype che richiede meno spazio. Non ha pero' il tipo NUMBER, ma INT, DECIMAL e FLOAT.
Varchar/Text Il tipo VARCHAR2 puo' contenere fino a 4000.

Per definire i Long Text si usa CLOB, BLOB.
Non esiste il tipo VARCHAR2 e il VARCHAR ha un limite di 255.

Per definire i Long Text si usa TEXT. E' possibile utilizzare anche BLOB, per i dati binari, anche se lavorano in maniera differente da Oracle
Date I tipi DATE e TIMESTAMP contengono entrambi la data e l'ora. I tipi DATE, TIME e DATETIME hanno separate la Data e l'Ora.
Sequence Si'. No. Si usa pero’ una colonna SERIAL autoincrement per definirla in tabella.
Materialized View Si' No.
Dimension, Bitmap index Si' No
Global Partitioned Index Si' No


Funzioni:

Le funzioni presentano le differenze piu' notevoli tra i due sistemi, dove di particolare rilievo e' quella sulla gestione delle date. (In un prossimo articolo verra' approfondito questo argomento)

Oracle MySql
DECODE()
NVL()
Non esistono, come valida alternativa si possono usare i costrutti condizionali, come
CASE, IF(), IFNULL(), NULLIF()
||, rappresenta una concatenazione di stringhe || rappresenta l'operatore logico!!!
Per concatenare usare le funzioni CONCAT() e CONCAT_WS () per inserire il separatore.
La gestione delle date completamente differente. (verra' approfondito in un prossimo articolo) Le date vengono convertite in stringhe o in numero in modo automatico ed intuitivo.
Sysdate() Esiste Sysdate() ma e' consigliabile utilizzare Now().
No ROW_COUNT() : riporta il numero di righe modificate dallo statement di DML precedente.
La clausola Rownum, non permette di paginare e non rispetta l'ordinamento. La clausola Limit permette di paginare e di ordinare i valori. Puo' essere usata sia con un solo valore (come per la Rownum) o con un intervallo.


Ottimizzazione:

Anche le differenze sull'ottimizzatore sono parecchie.

MySQL non ha tutte le strutture dati che Oracle supporta (eg. bitmapped indexes) e Oracle non ha un equivalente degli Storage Engine.

Il partitioning verra' supportato in MySQL dalla 5.1, ma comunque l'architettura degli Engine di MySQL offre in ogni caso molta flessibilita' e permette di scegliere la struttura ottimale per ogni oggetto.

MySQL non ha una Library Cache in senso stretto ma dispone di diversi parametri specifici (molti dei quali relativi agli Engine) come avveniva in Oracle 6. Al contrario MySQL possiede una Query Cache molto efficace: nel caso in cui la stessa query venga ripetuta questa non viene piu' eseguita ma viene restituito il result set mantenuto in cache.

Il tuning: Ottenere l'EXPLAIN PLAN con MySQL e' molto semplice:

EXPLAIN [EXTENDED] Select statement

Anche la sintassi per fornire gli hint all'ottimizzatore e' semplice ed utilizza le clausole

 USE | FORCE | IGNORE ] INDEX. 

Esiste un analogo del tkprof, si tratta del comando mysql_explain_log che analizza il general query log in modo semplice.

Stored Procedure

MySQL, dalla versione 5.0, supporta le Stored Routine ovvero un SQL procedurale analogo alle Stored Procedures di Oracle. Le differenze sintattiche tra il PL/SQL di Oracle e MySQL sono notevoli:
- Per richiamare la procedura il comando e' CALL procedure_name(parameters).
- I parametri della procedure possono essere di input (IN che e' il default) o di output (OUT). Raccogliere il risultato dei parametri di OUT e' molto semplice con mysql: call test1(@a); select @a;
- Il codice della Stored Procedure e' racchiuso tra un BEGIN ... END;
- Le variabili debbono essere dichiarate esplicitamente con la clausola DECLARE.
- Sono disponibili i normali controlli di flusso (eg. IF LOOP WHILE...), anche se con sintassi un poco differente, e naturalmente i comandi SQL che sono molto simili.
- Mancano parecchie cose...ad esempio i PACKAGE, le Java stored procedure, una quantita' innumerevole di funzioni, i costrutti piu' complessi (SQL dinamico, overloading, ...), ...
La quantita' di funzioni e packages disponibili nel PL/SQL non ha eguali in MySQL. Sono disponibili in MySQL Forge una serie di nuove funzioni... ma la differenza e' di due ordini di grandezza.

Trigger:

Anche con MySQL e' possibile definire trigger.

Non tutti i tipi di trigger supportati da Oracle sono anche disponibili con MySQL anche se quelli presenti hanno un comportamento analogo. In particolare la gestione dell'invalidation, che e' possibile in Oracle, non puo' essere gestita con MySQL.

Altro:

Una estrazione di valori di questo tipo

select a.* 
from table_01 a
....

non e' consentita in Oracle.

Non c'e' in Mysql la tabella di Oracle DUAL, ma non c'e' bisogno: e' possibile utilizzare una SELECT senza la clausola FROM. Anzi, per essere precisi, la tabella c'e' per compatibilita', ma non serve a nulla