Re: SQL: incrementare valore

2017-04-29 Per discussione Giuliano Curti
On 4/29/17, Federico Di Gregorio  wrote:
> ...

On 4/29/17, Alessandro Pellizzari  wrote:
> On 29/04/17 14:10, Giuliano Curti wrote:
> 

Federico e Alessandro, grazie;

ciao,
giuliano



Re: SQL: incrementare valore

2017-04-29 Per discussione Alessandro Pellizzari
On 29/04/17 14:10, Giuliano Curti wrote:

>> UPDATE mee SET r_co = (SELECT max(r_co) FROM mee) + r_to - r_fr WHERE
>> r_id =

> la funzione UPDATE itera su tutti i record, la funzione SELECT
> nidificata, che anch'essa itera su tutti i record, non risulta
> penalizzante? si avrebbe un algoritmo di complessità N**2;

Questo vale solo se non hai indici sul DB.

La sub-select viene eseguita per prima.

Se hai un indice su r_co lo usa, ed essendo gia` ordinato puo`
risolversi in una singola lettura o poco piu`.

Se non hai l'indice su r_co fa un table scan.

Alla fine prende il risultato e lo sostituisce nella query principale.

A questo punto se hai un indice su r_id (e visto il nome dovresti
averlo) fa un singolo accesso anche nella update, perche` prima prende
la riga puntandola direttamente, prende r_to e r_fr, fa il calcolo, la
aggiorna e la scrive.

> non è possibile memorizzare MAX(r_co) in una variabile temporanea e
> poi usarla nel ciclo UPDATE in modo da avere un algoritmo di
> complessita N? la domanda deriva dal fatto che non conosco se in SQL è
> possibile farlo (in uno script python non avrei dubbi);

Se lo fai in python devi lockare la tabella, fare la prima query,
calcolare il valore, fare l'update e togliere il lock.

Puoi usare una stored procedure che fa lo stesso, ma evita il traffico
di rete (e probabilmente la query e` precompilata) eseguendo tutto sul DB.

Ma se usi la update con subquery (se il DB le supporta. Non e` scontato)
e` automaticamente atomica e non devi preoccuparti di fare il lock a mano.

Bye.



Re: SQL: incrementare valore

2017-04-29 Per discussione Federico Di Gregorio
Il motore del database e in grado di capire quando una subquery non dipende 
dalla riga dell'update ed eseguirla una volta sola anche in casi molto ma molto 
più complessi di questo.

Ovviamente puoi cercare di sostituirti all'ottimizzatore scrivendo delle stored 
procedure ogni volta che la query si complica ma raramente è una buona idea. 
Nel 99% dei casi l'ottimizzatore produce i risultati più velocemente. (Sempre 
che il database sotto non sia una caccola tipo MySQL.)

federico


Il 29 aprile 2017 15:02:14 CEST, Giuliano Curti  ha 
scritto:
>On 4/29/17, Federico Di Gregorio  wrote:
>> Puoi fare:
>>
>> UPDATE mee SET r_co = (SELECT max(r_co) FROM mee) + r_to - r_fr WHERE
>r_id =
>> ...
>
>domanda x capire, non per obiettare :-)
>la funzione UPDATE itera su tutti i record, la funzione SELECT
>nidificata, che anch'essa itera su tutti i record, non risulta
>penalizzante? si avrebbe un algoritmo di complessità N**2;
>
>non è possibile memorizzare MAX(r_co) in una variabile temporanea e
>poi usarla nel ciclo UPDATE in modo da avere un algoritmo di
>complessita N? la domanda deriva dal fatto che non conosco se in SQL è
>possibile farlo (in uno script python non avrei dubbi);
>
>
>> Ciao,
>> Federico
>
>grazie, ciao,
>giuliano

-- 
Inviato dal mio dispositivo Android con K-9 Mail. Perdonate la brevità.

Problema con Thunderbird (Ver. 45.8.0)

2017-04-29 Per discussione Portobello

Buon Giorno Lista,

Utilizzo thunderbird con Debian Stable Jessie.
Da qualche giorno c'è stato un aggiornamento che ha tolto Ice... (ora mi 
sfugge il nome ) ed ha rimesso thunderbird come client di posta.


Il problema, che ho notato, è che su due degli account di posta che ho, 
non riesco più a cancellare i messaggi. Posso soltanto segnarli come 
spam e posta indesiderata.


Ho guardato le impostazioni di tutti gli account di posta che ho e non 
vedo differenze tra loro. Sugli altri account invece riesco ancora a 
cancellare i messaggi come prima.


Grazie
Ciao



Re: SQL: incrementare valore

2017-04-29 Per discussione Giuliano Curti
On 4/29/17, Federico Di Gregorio  wrote:
> Puoi fare:
>
> UPDATE mee SET r_co = (SELECT max(r_co) FROM mee) + r_to - r_fr WHERE r_id =
> ...

domanda x capire, non per obiettare :-)
la funzione UPDATE itera su tutti i record, la funzione SELECT
nidificata, che anch'essa itera su tutti i record, non risulta
penalizzante? si avrebbe un algoritmo di complessità N**2;

non è possibile memorizzare MAX(r_co) in una variabile temporanea e
poi usarla nel ciclo UPDATE in modo da avere un algoritmo di
complessita N? la domanda deriva dal fatto che non conosco se in SQL è
possibile farlo (in uno script python non avrei dubbi);


> Ciao,
> Federico

grazie, ciao,
giuliano



Re: SQL: incrementare valore

2017-04-29 Per discussione Gian Uberto Lauri

On 29/04/2017 10:17, Federico Di Gregorio wrote:

Puoi fare:

UPDATE mee SET r_co = (SELECT max(r_co) FROM mee) + r_to - r_fr WHERE 
r_id = ...


Questa soluzione è sicuramente corretta solo se l'update va fatta su una 
singola riga.


Se invece si devono aggiornare in blocco N righe (i.e. 'where id in 
...), allora AFAIK il risultato
dipende da come è stato implementato l'ottimizzatore di query: se decide 
di calcolare la max
una volta per tutte all'inizio si avrà un risultato, altrimenti se ne 
avrà un altro e tempi di

esecuzione più lunghi.

[E può anche esserci uno standard che sancisce uno o l'altro 
comportamento, bisogna

comunque vedere se il DBMS lo rispetta.]

In ogni caso, in dipendenza dalle esigenze della logica di business, si 
possono avere
due situazioni a seconda o meno che serva che venga ricalcolato il max 
per ogni riga, e
comunque affidarsi alla buona grazia dell'implementazione 
dell'ottimizzatore non è una
soluzione accettabile oggi. Lavorare come Mel andava bene negli anni 
'50/60 del secolo

scorso.

La stored procedure rimane una soluzione affidabile ed elegante.
--
Gian, stavolta non su uno smartphone.




Re: SQL: incrementare valore

2017-04-29 Per discussione Federico Di Gregorio
Puoi fare:

UPDATE mee SET r_co = (SELECT max(r_co) FROM mee) + r_to - r_fr WHERE r_id = ...

Ciao,
Federico


Il 28 aprile 2017 20:53:07 CEST, Leonardo Boselli  ha 
scritto:
>Un po'ot ma chiedere non costa nulla:
>ho un file SQL che contiene la tabella 'mee' con le colonne r_id r_fr
>r_to 
>e r_co dove r_id è un intero(5) e r_co un decimale(8,2)
>esiste un comando che mi faccia:
>UPDATE mee SET r_co= *non_lo_so*  WHERE r_id = *qualcosa*;
>
>*qualcosa* è l'id unico del record, e ovviamente lo conosco
>
>il *non_lo_so* è la cosa per cui chiedo aiuto: si tratta del valore più
>
>alto presente nella colonna r_co prima dell'aggiornamento più la 
>differenza tra r_to e r_fr della corrispondente riga.
>C'è un modo elegante di fare questa operazione ?
>
>
>--
>Leonardo Boselli
>Dipartimento Ingegneria Civile e Ambientale UNIFI
>tel +39 0552758808  +39 3488605348

-- 
Inviato dal mio dispositivo Android con K-9 Mail. Perdonate la brevità.

Re: SQL: incrementare valore

2017-04-29 Per discussione Federico Di Gregorio
Aveva chiesto una soluzione elegante! :)

federico


Il 28 aprile 2017 21:10:53 CEST, Gian Uberto Lauri  ha scritto:
>Store procedure
>
>Sent from my smartphone 
>
>> On 28 Apr 2017, at 20:53, Leonardo Boselli 
>wrote:
>> 
>> Un po'ot ma chiedere non costa nulla:
>> ho un file SQL che contiene la tabella 'mee' con le colonne r_id r_fr
>r_to e r_co dove r_id è un intero(5) e r_co un decimale(8,2)
>> esiste un comando che mi faccia:
>> UPDATE mee SET r_co= *non_lo_so*  WHERE r_id = *qualcosa*;
>> 
>> *qualcosa* è l'id unico del record, e ovviamente lo conosco
>> 
>> il *non_lo_so* è la cosa per cui chiedo aiuto: si tratta del valore
>più alto presente nella colonna r_co prima dell'aggiornamento più la
>differenza tra r_to e r_fr della corrispondente riga.
>> C'è un modo elegante di fare questa operazione ?
>> 
>> 
>> --
>> Leonardo Boselli
>> Dipartimento Ingegneria Civile e Ambientale UNIFI
>> tel +39 0552758808  +39 3488605348
>> 
>> 

-- 
Inviato dal mio dispositivo Android con K-9 Mail. Perdonate la brevità.