Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-09-2010, 14:45   #1
sonic85
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 )
Ma è lentissima questa query! ci mette oltre 16 secondi per eseguirla!!!

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!
sonic85 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 19:39   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2010, 04:40   #3
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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 ) succhia CPU come un dannato e rallenta, o addirittura blocca, le altre query, per cui dobbiamo ammazzare la query incriminata.

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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2010, 09:02   #4
taurus
Member
 
L'Avatar di taurus
 
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"
taurus è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2010, 09:51   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2010, 10:38   #6
sonic85
Member
 
Iscritto dal: Mar 2005
Città: Padova
Messaggi: 140
Quote:
Originariamente inviato da taurus Guarda i messaggi
..e per piacere, togli tutte quelle parentesi, non si possono guardare e formatta meglio la join...

scusa, ma che c'è che nn va??
__________________
Datemi un punto d'appoggio e vi
sollevero` il mondo!
sonic85 è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2010, 10:42   #7
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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.
eh mysql!!!! farò una statua ad Ellison se riuscirà a farlo sparire

postgresql for ever
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2010, 14:22   #8
sonic85
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!
sonic85 è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2010, 15:16   #9
sonic85
Member
 
Iscritto dal: Mar 2005
Città: Padova
Messaggi: 140
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
C

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.
Scusa, come si fa???
__________________
Datemi un punto d'appoggio e vi
sollevero` il mondo!
sonic85 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Ceres-2 e Lunga Marcia 3B: la Cina falli...
Motorola edge 70 appena uscito e già in ...
ARC Raiders non si accontenta: nel 2026 ...
Germania, bonus per le auto elettriche d...
Nella causa OpenAI, Elon Musk rivendica...
DJI Osmo 360 in offerta su Amazon: video...
Canada: raggiunto accordo con la Cina, c...
500 terabyte di libri pirata per addestr...
Mandiant le pubblica rainbow table Net-N...
Robot aspirapolvere top di gamma al mini...
Changan prepara l'offensiva in Europa: 8...
Call of Duty rallenta: finisce l'era del...
Colossus 2 entra in funzione: il superco...
Ningtendo PXBOX 5: PS5, Xbox Series X e ...
Scossone in Ubisoft: il boss di The Divi...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v