SQLite e ottimizzazione query

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
lennynero
Linux 3.x
Linux 3.x
Messaggi: 641
Iscritto il: lun 3 mag 2004, 0:00
Nome Cognome: Luigi Picaro
Slackware: 15.0-x64
Kernel: 6.1
Desktop: Xfce-4.16
Località: Salerno

SQLite e ottimizzazione query

Messaggio da lennynero »

Ciao a tutti, vorrei esporre un piccolo dubbio/richiesta su come simulare una full join su sqlite o riuscire a ottimizzare la mia query.
In sostanza la query che ho scritto è piuttosto complessa e serve per effettuare delle statistiche su dei dati, in sintesi fa questo:
somma i pasti per un cliente in una data, somma gli scarichi di magazzino per quel cliente in quella data e mette in relazione le 2 quantità

La relazione tra le 2 "viste" può essere vuota da un lato, quindi il mio approccio è il seguente:
Ho una query che mi calcola i pasti P, e una che mi calcola gli scarichi S, così lo pseudocodice diventa:

Codice: Seleziona tutto

select * from P left join S on P.cliente=S.cliente and P.data=S.data union
select * from S left join P on P.cliente=S.cliente and P.data=S.data
Il mio problema sostanzialmente sta nel fatto che le query P e S sono piuttosto complesse e mi scoccia doverle eseguire 2 volte per ottenere il risultato voluto.
Un modo per ottimizzare la query è appunto una full join scritta così:

Codice: Seleziona tutto

select * from P inner join S on P.cliente=S.cliente and P.data=S.data
ma so che questo non è possibile(in sqlite), quindi chiedo a voi come potrei ottimizzare questa query per ridurre il tempo di calcolo. Grazie in anticipo.

Avatar utente
alexxxius
Linux 2.x
Linux 2.x
Messaggi: 275
Iscritto il: mar 28 feb 2006, 0:09
Slackware: 13.1
Kernel: 2.6.33.4
Desktop: Kde 4.4.3
Località: Dove vola l'aquila rosanero

Re: SQLite e ottimizzazione query

Messaggio da alexxxius »

Ciao non conosco sqLite, ma un modo per fare la full join senza il costrutto join e quello di fare la theta join (se no sbaglio si dice così) usando il where:

Codice: Seleziona tutto

select * from P,S where P.cliente=S.cliente and P.data=S.data
ciao

Avatar utente
lennynero
Linux 3.x
Linux 3.x
Messaggi: 641
Iscritto il: lun 3 mag 2004, 0:00
Nome Cognome: Luigi Picaro
Slackware: 15.0-x64
Kernel: 6.1
Desktop: Xfce-4.16
Località: Salerno

Re: SQLite e ottimizzazione query

Messaggio da lennynero »

Grazie per la risposta alexxxius, solo che a me non interessa il theta join poichè quello serve per prendere solo le righe di P e S che matchano le clausole, a me interessa un full join o un workaround per prendere sia le tuple che matchano le clausole sia quelle che da un lato hanno il join vuoto, per intenderci un letf join + un right join con distinct. In ogni caso per adesso mi accontento di creare una tabella temporanea con la query in esame, l'unico inconveniente è che per creare la tabella comunque impiegherò un pò di tempo(sto parlando di 15secondi circa), inoltre devo prevedere un trigger che nel caso di aggiunte/modifiche di pasti o scarichi deve ricreare la table...Non mi soddisfa molto questa soluzione, poichè ad ogni modifica potrei dover aggiornare la table, oppure dovrei scegliere di creare ad ogni prima richiesta di quei dati. Preciso inoltre che quei dati saranno poi ulteriormente filtrati con dei where per facilitarne la navigazione ma a quel punto il + sarebbe fatto... Attendo altri consigli. Grazie.

Rispondi