sql select annidate

Raccoglitore di domande e risposte relative a ScriptCase, il generatore di codice php per lo sviluppo rapido di applicazioni.
Regole del forum
Nel forum è vietato fare pubblicità senza avere l'autorizzazione dello staf di Netspecial.
Rispondi
Giampiero
Messaggi: 138
Iscritto il: 13 set 2014, 10:19

sql select annidate

Messaggio da Giampiero » 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`

Fabio
Messaggi: 439
Iscritto il: 20 feb 2014, 11:43

Re: sql select annidate

Messaggio da Fabio » 06 set 2023, 20:11

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.

Giampiero
Messaggi: 138
Iscritto il: 13 set 2014, 10:19

Re: sql select annidate

Messaggio da Giampiero » 07 set 2023, 11:05

grazie Fabio,

fatto ma non cambia

rino
Messaggi: 621
Iscritto il: 18 giu 2015, 15:42
Località: Pinerolo
Contatta:

Re: sql select annidate

Messaggio da rino » 07 set 2023, 16:22

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 .
Rino Lo Turco
Consulente Informatico; Analista e Sviluppatore; ex IT Manager; Cons. Direzionale di Organizzazione; Consulente Tecnico legale; Esperto protezione dati personali; Internet Service Provider
felice utente e fruitore di ScriptCase

magre66
Messaggi: 39
Iscritto il: 14 mar 2017, 08:04

Re: sql select annidate

Messaggio da magre66 » 20 set 2023, 19:09

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

Rispondi

Chi c’è in linea

Visitano il forum: Ahrefs [Bot] e 1 ospite