Left join

Ciao a tutti, ho questa query:

SELECT b.somma1,b.somma2, a.Cod1,a.Cod2 FROM

(

( SELECT Cod1,Cod2 FROM tab1,tab2 ) AS a)

LEFT JOIN

(

( SELECT sum(valori1) as somma1,sum(valori2) as somma2, cod1,cod2

FROM TAB3  GROUP BY Cod1,Cod2 WITH ROLLUP ) AS b)

ON (a.Cod1=b.Cod1 AND a.Cod2=b.Cod2)

order by a.Cod1,a.Cod2;

Il problema è che ci mette troppo e mi da errore : più di 60 seconds ...., vorrei ottimizzare questa query le tabelle sono 3:

tab1 ha 8000 righe

tab2 ha 10 righe

tab3 ha 3.500.000 di righe

So che è una domanda un pò pretenziosa, ma se qualcuno può darmi un aiuto, GRAZIE  :)

inviato 10 anni fa
zr7s
zr7s
1
X 0 X

Perché usi questa subquery:

SELECT Cod1,Cod2 FROM tab1,tab2

E' un prodotto cartesiano tra le tabelle tab1 e tab2 senza condizione. Produce 80.000 righe ma dubito che abbiano un senso.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Si purtroppo ha un senso, devo unire le 80000 a tab3.

E poi mettere in una tabella in fincata le 8000 e testa le 10, ma questo già fatto e funziona.

Tab1 e tab2 sono scelte dall'utente in delle select. Questa è l'lunica conbinazione che mi da problemi, le altre sono :

10 * 10

5 * 10

etc.

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

Forse sarà più semplice aiutarti se descrivi la struttura delle 3 tabelle e quale risultato vuoi ottenere dalla select.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Allora

Tab1 :

cod1     varchar (6)

descr1  varchar (40)

Tab2:

cod2     varchar (1)

descr2  varchar (40)

Su queste tab faccio il prodotto per poi unirlo (Left join) a tab3

Tab3

cod1  varchar (6)

cod2  varchar (1)

valori1 int(8)

valori2 int(8)

il rusultato è:

                        cod2(1)                     cod2(2)                   cod2(...)    cod2(10)

                     valori1    valori2       valori1 valori2        ........................................

cod1(1)         somma1 somma1

cod1(2)          null         null

cod1(3)        .......

cod1(4)

cod1(...)

cod1(8000)

Spero di essere stato chiaro

 :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

Se provi a lanciare solo:

SELECT sum(valori1) as somma1,sum(valori2) as somma2, cod1,cod2

FROM TAB3  GROUP BY Cod1,Cod2 WITH ROLLUP

quanto tempo impiega?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

16203 Rows fetched in 3,6797s (24,3286s)

Non è male , ora devo fare la left join con il prodotto cartesiano per riempire tutte le righe, e credo che qui caschi l'asino!!

Dovrei indicizzare qualcosa, o sortare tab3 ... non so come DBA sono alle perime armi.

Grazie  :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

dammi anche il tempo necessario a fare il primo prodotto cartesiano.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Scusate l'intromissione...  :angel: ma cos'è il prodotto cartesiano?????  :-[

 :bye:

risposto 10 anni fa
Marco Dario
X 0 X

Il prodotto cartesiano tra due tabelle si ottiene con:

SELECT * FROM tab1, tab2

oppure

SELECT * FROM tab1 JOIN tab2

Il risultato di un prodotto cartesiano è una tabella con un numero di colonne pari alla somma delle colonne delle 2 tabellle ed un numero di righe pari al prodotto del numero di righe delle 2 tabelle.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Buongiorno Gianni,

durante il we non ho la connessione.

Il tempo per il prodotto cartesiano è:

16202 Rows fetched in 0,2077 (0,0204s)

 :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

Quindi sembra che le operazioni più gravose siano il calcolo delle somme e il JOIN tra queste ed il prodotto cartesiano.

Una possibile soluzione potrebbe essere quella di creare una tabella che conservi i dati attualmente restituiti dalla "SELECT sum(valori1) as somma1,sum(valori2) as somma2, cod1,cod2 FROM TAB3  GROUP BY Cod1,Cod2 WITH ROLLUP" indicizzando i campi usati per la JOIN con il prodotto cartesiano.

Ovviamente questa nuova tabella andrà aggiornata ogni volta che i dati di TAB3 cambieranno.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho provato ed è molto veloce!!!

Però devo creare una tabella ad ogni richiesta, non è "pesante" per il server?

E se ho + di un utente collegato?

Ciao  :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda