CASO vs. DECODE

Facendo riferimento a una domanda precedente, mi chiedevo se è sempre ansible sostituire DECODE per CASE e quale è meglio per le prestazioni?

Come sempre con Oracle … AskTom …

Da questo post …

La decodifica è alquanto oscura: CASE è molto chiaro. Le cose che sono facili da fare in decodifica sono facili da fare in CASE, cose che sono difficili o quasi impossibili da fare con la decodifica sono facili da fare in CASE. CASO, in senso logico, vince a mani basse.

Dal punto di vista delle prestazioni sembra che siano all’incirca uguali, anche in questo caso l’articolo cita alcune differenze di velocità, ma senza mettere a confronto le dichiarazioni particolari che è difficile dire.

C’è una grande differenza tra DECODE e CASE e ha a che fare con il modo in cui i NULLs vengono confrontati. DECODE restituirà “true” se si confronta NULL con NULL . CASE no. Per esempio:

 DECODE(NULL, NULL, 1, 0) 

restituirà ‘1’.

 CASE NULL WHEN NULL THEN 1 ELSE 0 END 

restituirà ‘0’. Dovresti scriverlo come:

 CASE WHEN NULL IS NULL THEN 1 ELSE 0 END 

CASE è una dichiarazione e DECODE è una funzione. Possiamo usare la CASE nella clausola where e non possiamo usare DECODE nella clausola where. DECODE può controllare gli operatori di uguaglianza solo dove CASE può supportare tutti gli operatori relazionali. DECODE può essere usato in sql solo dove CASE può essere usato in SQL E PL / SQL CASE è meglio di DECODE.

Puoi trovare di più: http://www.oracleinformation.com/p/sql-tutorial.html

 select (DECODE(NULL, NULL, 1, 0)) from dual; select (CASE WHEN NULL IS NULL THEN 1 ELSE 0 END ) from dual; 

entrambi restituiscono 1

Dal punto di vista delle prestazioni, in Oracle decodifica e CASE non fa alcuna differenza.

Ma in Exadata, Decode è più veloce di CASE.

L’operazione di decodifica viene eseguita a livello di server di archiviazione in cui sono presenti i dati MA CASE viene eseguito a livello di istanza DB che riceve i dati dal livello di archiviazione DB.

Sebbene il trasferimento di dati di rete tra lo Storage e il server DB sia inferiore (connessione Infiniband), quel trasferimento viene evitato quando si usa la decodifica