Condividi:        

[SQL] lentezza query - inner join

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

[SQL] lentezza query - inner join

Postdi 12 » 13/07/08 03:26

Ciao a tutti :P

Da qualche settimana mi sono messo a sviluppare un piccolo cms / catalogo in php / sql (dbms : mysql)

La tabella prodotti conta circa 5000 records, a questa si aggiunge una tabella di altri 18000 records la cui funzione è quella di contenere degli "alias" (non è esattamente così ma facciamola breve..) per i vari articoli della prima tabella prodotti.

Il problema si verifica nello script per la ricerca di un articolo nel database.

Questo script si occupa di effettuare una ricerca incrociata fra la tabella prodotti e la tabella relazioni.

Per ogni articolo ci sono "x" relazioni, ogni relazione appartiene ad una "marca" (ad esempio, se fossero scarpe potremmo dire "nike").

Una volta effettuata la ricerca immettendo soltanto la marca, (attendomi a quanto scritto , "nike") vorrei visualizzare soltanto una sola volta l'articolo e non "x" volte quante sono le relazioni, per ovviare a questo "problema" ho provato ad utilizzare GROUP BY id_articolo .. una catastrofe: la query dura fino a 14 secondi.

Così ho provato a fare un "SELECT DISTINCT id_articolo, codice_articolo .. " .. In alcuni casi migliora , in altri si gira attorno agli 8 secondi.

Questa è la query:

Codice: Seleziona tutto
SELECT DISTINCT ( b.codice_articolo ), id_categoria, descrizione_it, descrizione_en FROM vtx_prodotti as a INNER JOIN vtx_prodotti_rel as b ON a.codice_articolo = b.codice_articolo WHERE a.id_categoria !=2 AND b.marca LIKE "%something%" ORDER by a.codice_articolo ASC


Avete qualche idea per migliorare la situazione?
12
Utente Senior
 
Post: 1413
Iscritto il: 12/01/04 19:45
Località: Milèn

Sponsor
 

Postdi archimede » 13/07/08 14:02

Forse
Codice: Seleziona tutto
SELECT * FROM vtx_prodotti WHERE codice_articolo IN
   (SELECT DISTINCT codice_articolo FROM vtx_prodotti a, vtx_prodotti_rel b
     WHERE a.codice_articolo  = b.codice_articolo AND
           b.marca         LIKE "%something%" AND
           a.id_categoria    != 2)
ORDER BY codice_articolo
Inoltre darei anche una controllata agli indici definiti sulle due tabelle.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi 12 » 13/07/08 16:29

Ciao Archimede, grazie per la risposta.

Comunque, nulla da fare. Per ora rimane un suicidio.. siamo sopra ai 15 secondi.

Non riesco a capire perchè soltanto con group by o distinct la query diventa così dispendiosa in termini di tempo/risorse.

Se potessi lasciar perdere la questione di group by o distinct, la query impiegherebbe il "normale" tempo di esecuzione.

Che alternative ci sono a queste due soluzioni per avere la lista con articoli non ripetuti?

Magari potrei trovare soluzione agendo direttamente sullo script, però non mi sembra molto elegante..

Grazie ancora,
12
12
Utente Senior
 
Post: 1413
Iscritto il: 12/01/04 19:45
Località: Milèn

Postdi archimede » 13/07/08 16:52

Che indici hai definito sulle due tabelle?

Suppongo codice_articolo sia la chiave primaria di vtx_prodotti. C'è una chiave su vtx_prodotti_rel.codice_articolo? Se ancora non fosse sufficiente, puoi provare a definire anche un indice su vtx_prodotti_rel.marca e/o vtx_prodotti.id_categoria.

Francamente non mi pare una query in grado di mettere un db in ginocchio (nemmeno MySql :P): vtx_prodotti e vtx_prodotti_rel sono tabelle o viste (che a loro volta contengono dei join)?

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi 12 » 13/07/08 19:52

Mistero: ho reimpostato gli indici ed ora è una scheggia, anche con la query che avevo postato inizialmente.

Gli indici sono prodotti erano gli stessi di prima:

id_categoria (usato poi per una relazione con la tabella corrispondente)
id_articolo
codice_articolo

per quella di prodotti_rel

l'unico indice era l'id e il codice_articolo ..

togliendo questi indici e reimpostandoli il tempo di esecuzione è calato notevolmente (massimo 1 secondo), seguendo il tuo consiglio ho poi aggiunto anche "marca" agli indici..

La query ha impiegato 0.1482 sec


Per 4800 records

Ti amo :D

Grazie infinitamente,
12
12
Utente Senior
 
Post: 1413
Iscritto il: 12/01/04 19:45
Località: Milèn


Torna a Programmazione


Topic correlati a "[SQL] lentezza query - inner join":

Lentezza pc
Autore: Cinequale
Forum: Assistenza Hardware
Risposte: 11

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti