Newsgroup: it.comp.software.database
Titolo: E' + pesante x un database...

Ciao a tutti!!!
... gestire la modifica di tutti i campi di un record(tramite un update
mirato tramite l'id del record) oppure cancellare il record tramite l'id e
reinserire un nuovo record mettendo come id quello cancellato?
Parliamo di un DB Oracle ma penso valga x tutti i DB...
Grazie!!!

 reinserire un nuovo record mettendo come id quello cancellato?
Dato che l'update fa' esattamente quello (cancella e re-inserisce),
ritengo che la differenza sia nulla.
Davide
-- 
| Type cat vmlinuz > /dev/audio to hear the Voice of God. 
| 
| 
| 

 
ma da quando? un update non cambia il rowid. un update non fa scattare i 
trigger di insert o delete. un update è un update, e un insert un insert.
tornando alla domanda: l'update sull'id è polto piu performante di un 
delete seguito da un insert, primo perchè è un'istruzione unica, secodno 
perchè con un delete/insert, oracle deve andare a validare eventuali 
constraint sul delete, e poi eventuali constraint sull'insert: cioè due 
operazioni al posto di una. fai un pò te...

 
No. Non e' vero.
Anche se non tenessimo conto di triggers e constraints, un DELETE/INSERT 
e' quasi sempre piu' lento di un UPDATE.
Calcola che quando cancelli un record devi aggiornare gli indici, anche 
quelli che non sarebbero stati toccati dall'UPDATE, e poi con il 
successivo INSERT devi reinserire gli stessi indici, mentre con 
l'UPDATE, se modifichi campi non indicizzati, l'operazione e' quasi 
indolore.
L'UPDATE non cancella, ma riutilizza lo spazio occupato dal vecchio 
record per metterci i valori variati. Nel caso si inseriscano campi a 
lunghezza variabile (VARCHAR, BLOB), puo' esserci un rallentamento, ma 
l'operazione e' senz'altro piu' veloce della combinazione DELETE/INSERT.
A parte le considerazioni di efficienza, considera che effettuare un 
DELETE/INSERT invece di un UPDATE puo' avere effetti catastrofici se il 
record ha un constraint di integrita' referenziale con cancellazione a 
cascata. Se cancelli il record "provincia di ROMA" per correggere 
"provincia" in maiuscolo, potresti cancellare dal DB tutte le citta' 
della provincia, che a loro volta si porterebbero dietro tutti i record 
che hanno un ID di tali citta'. Pensa quanti danni puoi fare usando due 
righe di SQL invece di una!
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

Grazie a tutti x le delucidazioni...

 ritengo che la differenza sia nulla.
Non conosco Oracle ma se questa affermazione è vera la cosa mi stupisce non
poco (ma i post di yoghurt e gmax in un certo senso mi confortano :-) )
Il discorso della doppia operazione è vero soltanto nel caso in cui venga
aggiornato un campo che definisce la chiave dell'indice clustered. Poichè
questo tipo di indice presenta al livello foglia i dati ordinati secondo la
chiave clustered, appare evidente che una operazione del tipo
UPDATE MyTable
SET campo1 = 'zzz'
WHERE campo1 = 'aaa'
debba comportare, internamente, una duplice operazione di DELETE + INSERT
per spostare fisicamente il record da una pagina all'altra. Al di fuori di
questi casi, cioè in tutti quelli in cui l'aggiornamento NON coinvolge uno
dei campi della chiave clustered oppure, anche qualora coinvolgesse la
chiave clustered, l'attività di modifica cambiasse si il "rank" del record
ma non la pagina fisica in cui debba essere memorizzato, un aggiornamento è
è rimane un semplice aggiornamento.
Quanto sopra è quello che avviene in SQL Server e (ho ragione di credere) in
ogni DBMS...
Ciao
-- 
Luca Bianchi
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org