Pagina 1 di 1

sql select annidate

Inviato: 06 set 2023, 19:35
da Giampiero
Buonasera a tutti,

ho creato un calendario che mi riporta le scadenze degli incarichi ricevuta dai clienti.

ma avendo la necessità di raggruppare gli incarichi ho dovuto creare una 'vista' sul db l'unico problema che sto avendo è sulla velocità di esecuzione, impiega circa 17 secondi.
vi chiedo se sbaglio nell'impostare la subquery

CREATE ALGORITHM=UNDEFINED DEFINER=`Giampiero`@`%` SQL SECURITY DEFINER VIEW `cale` AS select `p`.`ID` AS `ID`,sum(`p`.`IMPORTOGESTITO`) AS `Importo`,concat(`p`.`CLIENTE`,' - ',`p`.`IDIMPORTAZIONE`,' - ',count(`p`.`FILIALE`))
AS `Committente`,`p`.`Proroga` AS `Proroga`,`p`.`IDIMPORTAZIONE` AS `Lotti`,(select sum(`anagrafica`.`IMPORTOGESTITO`) from `anagrafica` where (`anagrafica`.`IDIMPORTAZIONE` = `p`.`IDIMPORTAZIONE`))
AS `Importo Affidato`,(select sum(`anagrafica`.`TotaleRes`) from `anagrafica` where (`anagrafica`.`IDIMPORTAZIONE` = `p`.`IDIMPORTAZIONE`)) AS `Importo Reso` from `anagrafica` `p` where (`p`.`SCARICATA` = 'A') group by `p`.`IDIMPORTAZIONE`,`p`.`Proroga`

Re: sql select annidate

Inviato: 06 set 2023, 20:11
da Fabio
Buonasera Giampiero,
assicurati di aver creato i seguenti indici:
1) tabella anagrafica, indice sul campo IDIMPORTAZIONE
2) tabella anagrafica, indice sul campo SCARICATA

Potrebbe servire anche sul campo FILIALE, fai una prova.

Dovresti guadagnare qualche secondo.

Re: sql select annidate

Inviato: 07 set 2023, 11:05
da Giampiero
grazie Fabio,

fatto ma non cambia

Re: sql select annidate

Inviato: 07 set 2023, 16:22
da rino
Giampiero ha scritto: 06 set 2023, 19:35 Buonasera a tutti,

ho creato un calendario che mi riporta le scadenze degli incarichi ricevuta dai clienti.

ma avendo la necessità di raggruppare gli incarichi ho dovuto creare una 'vista' sul db l'unico problema che sto avendo è sulla velocità di esecuzione, impiega circa 17 secondi.
vi chiedo se sbaglio nell'impostare la subquery

CREATE ALGORITHM=UNDEFINED DEFINER=`Giampiero`@`%` SQL SECURITY DEFINER VIEW `cale` AS select `p`.`ID` AS `ID`,sum(`p`.`IMPORTOGESTITO`) AS `Importo`,concat(`p`.`CLIENTE`,' - ',`p`.`IDIMPORTAZIONE`,' - ',count(`p`.`FILIALE`))
AS `Committente`,`p`.`Proroga` AS `Proroga`,`p`.`IDIMPORTAZIONE` AS `Lotti`,(select sum(`anagrafica`.`IMPORTOGESTITO`) from `anagrafica` where (`anagrafica`.`IDIMPORTAZIONE` = `p`.`IDIMPORTAZIONE`))
AS `Importo Affidato`,(select sum(`anagrafica`.`TotaleRes`) from `anagrafica` where (`anagrafica`.`IDIMPORTAZIONE` = `p`.`IDIMPORTAZIONE`)) AS `Importo Reso` from `anagrafica` `p` where (`p`.`SCARICATA` = 'A') group by `p`.`IDIMPORTAZIONE`,`p`.`Proroga`
per prima cosa non capisco il perchè usi security definer e non invoker , poi non definire l algorithm , gestisce il motore da solo .
che tipo di motore usi? non usare myisam , innodb è preferibile anch eper velocità.
detto ciò
usare un group by nella view è tremendamente malsano il principio da seguire è quello di creare una tabella non raggruppata che abbia le colonne che ti interessano, queste possono essere composte come vuoi, la tabella view che crei la leggi come una tabella normale e su questa applichi i ragguppamenti che ti interssano.
In pratica con la vista è come se ti creassi una nuova tabella "composta" inquesot modo i tempi di generazioen sono limitati al solo momento in cui si modificano le tabelle fisiche , tu interroghi la vista , tempi tremendamente diversi .

Re: sql select annidate

Inviato: 20 set 2023, 19:09
da magre66
Ciao,
se esegui la query pura anteponendo EXPLAIN dovresti avere delle informazioni su eventuali "colli di bottiglia".
Personalmente metterei un alias sulla seconda subselect che fa riferimento alla tabella anagrafica che è già richiamata nella prima sub