|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2005
Città: Padova
Messaggi: 140
|
[SQL-MYSQL] Query annidata lentissima!Motivi?
Ciao a tutti,
ho un quesito da porvi... Sto costruendo un db con interfaccia web con php e Mysql, in cui sono presenti delle pubblicazioni su riviste e gli autori di esse, divisi in ricercatori e autori esterni. Le tabelle sn così formate: Pubblicazioni - AutoriPubblicazioni - Ricercatori. Ed ho scritto questa query per trovare i ricercatori che sono in ultima posizione tra gli autori. Codice:
SELECT count(*) as 'ultimo' FROM (autoripubblicazioni inner join ricercatori on autoripubblicazioni.idricercatorefk=ricercatori.idricercatore) inner join pubblicazioni on autoripubblicazioni.idpubblicazionefk=pubblicazioni.idpubblicazione WHERE idricercatorefk IS NOT NULL AND ricercatori.idUOFK=16 AND anno=2007 AND (appendice='N') AND (idpubblicazionefk,posizione) IN (SELECT idpubblicazionefk, MAX(posizione) as 'test' FROM autoripubblicazioni GROUP BY idpubblicazionefk HAVING test>2 ) e la devo lanciare tantissime volte per tutti autori che sono circa 200!!! Come mai? cosa sbaglio? Consigli? Suggerimenti? PS. Utilizzo MYSQL 5.0 con InnoDB
__________________
Datemi un punto d'appoggio e vi sollevero` il mondo! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Fanne una sola che ti restuisca tutto insieme.
Scommetto che magari 16 secondi no, ma 30 per tutti insieme puo' anche farcela.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Credo che il problema stia nella subquery usando la IN.
L'ottimizzatore (per modo di dire) di query di MySQL fa letteralmente cacare e capita spesso che esegua una full table scan PER OGNI RECORD della prima tabella / join. In ufficio ce ne accorgiamo quando vediamo che un processo appeso da più di un'ora (abbiamo tabelle LEGGERMENTE grandi Nello specifico il mio consiglio è di far diventare la subquery una derived-table, e quindi effettuarci una JOIN coi campi interessati. Funzionalmente è la stessa cosa, ma in termini prestazionali siamo un po' di parsec avanti.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Dec 1999
Messaggi: 260
|
..e per piacere, togli tutte quelle parentesi, non si possono guardare e formatta meglio la join...
__________________
"There is no quiet before the tempest, there is only tempest" |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Codice:
SELECT ricercatori.idUOFK, anno, count(*) as 'ultimo' FROM (autoripubblicazioni inner join ricercatori on autoripubblicazioni.idricercatorefk=ricercatori.idricercatore) inner join pubblicazioni on autoripubblicazioni.idpubblicazionefk=pubblicazioni.idpubblicazione WHERE idricercatorefk IS NOT NULL AND appendice='N' AND (idpubblicazionefk,posizione) IN (SELECT idpubblicazionefk, MAX(posizione) as 'test' FROM autoripubblicazioni GROUP BY idpubblicazionefk HAVING test>2 ) GROUP BY ricercatori.idUOFK, anno
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: Mar 2005
Città: Padova
Messaggi: 140
|
Quote:
scusa, ma che c'è che nn va??
__________________
Datemi un punto d'appoggio e vi sollevero` il mondo! |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Mar 2005
Città: Padova
Messaggi: 140
|
Ho fatto un pò di prove e ho visto che modificandola nel seguente modo è MOLTO + veloce!
Al massimo 1.2818 secondi... rispetto ai agli oltri 16 sec! Penso proprio che il problema sia nella Inner join con 3 tabelle... sbaglio? Visualizzazione record 0 - 0 (1 Totali, La query ha impiegato 1.2818 sec) Codice:
SELECT COUNT( idpubblicazionefk ) AS 'ultimo' FROM autoripubblicazioni INNER JOIN ricercatori ON autoripubblicazioni.idricercatorefk = ricercatori.idricercatore WHERE ricercatori.idUOFK =16 AND idricercatorefk IS NOT NULL AND ( idpubblicazionefk, posizione ) IN ( SELECT idpubblicazionefk, MAX( posizione ) AS 'test' FROM autoripubblicazioni INNER JOIN pubblicazioni ON autoripubblicazioni.idpubblicazionefk = pubblicazioni.idpubblicazione WHERE autoripubblicazioni.appendice = 'N' AND pubblicazioni.anno =2007 GROUP BY idpubblicazionefk HAVING test >2 )
__________________
Datemi un punto d'appoggio e vi sollevero` il mondo! |
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Mar 2005
Città: Padova
Messaggi: 140
|
Quote:
__________________
Datemi un punto d'appoggio e vi sollevero` il mondo! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:07.



















