Ottimizzare query - join 2 tabelle 2 indici

ciao a tutti , volevo sapere se è possibile ottimizzare la seguente query immaginando che nel db ci siano migliaia e migliaia di righe

select* from speodr,supspe where speodr.idc=$idcl and (speodr.ido=supspe.ido and speodr.nspe=supspe.nspe) and speodr.ido=$ido and speodr.nspe=$nspe

in pratica si fa il join delle due tabelle SPEODR (con 20 campi)  e SUPSPE (con 5 campi)

la coppia chiave è IDO e NSPE  per le 2 tabelle  in questione in relazione 1:1 , IDC è un indice. dopo il join mi prendo solo un record che ha la coppia di valori specificata nelle variabili .

è possibile fare di meglio ?

grazie mille

inviato 7 anni fa
urbanus
X 0 X
è possibile fare di meglio ?

Si...che database usi? MySql?

Prova ad usare i "veri" join della sintassi sql.

Puoi fornire anche la struttura delle due tabelle?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

struttura per entità ORDINE

SPEODR

_______

* IDO

* NSPE

IDC (indice)

Attiva

Tipo

data (date)

trasferita

dataacc (date)

datamod (date)

qtaf (tinyint)

qtah (tinyint)

qtaq (tinyint)

qtae (tinyint)

campo_testo1 (varchar 50)

campo_testo2

campo_testo3

campo_testo4

campo_testo5

.

.

.

ecc...

SUPSPE

____

*IDO

*NSPE

IDC (indice)

verg (tinyint)

verm (tinyint)

vers (tinyint)

trfa (tinyint)

la relazione è 1:1 con chiavi IDO e NSPEe un indice IDC

la domanda è : dati IDO e NSPE quale è il modo più veloce di recuperare le informazioni da entrambe le tabelle? (in sostanza recuperare tutte le info sull ' entità ORDINE)

la query che ho fatto sotto è corretta e funziona (provata) ma è ottimizzata??? (senza ipotizzare il db dovrà contenere circa 10K di righe che nel corso del tempo vengono rimpiazzate , ma il numero più o meno sarà intorno a quella cifra)

risposto 7 anni fa
urbanus
X 0 X

Potresti provare ad usare direttamente il join, esempio:

SELECT * FROM speodr INNER JOIN supspe ON speodr.ido=supspe.ido WHERE speodr.idc=$idcl AND speodr.ido=$ido AND speodr.nspe=$nspe

La relazione fra le due tabelle la fai con una sola chiave, cioè una chiave primaria nella tabella ipotetica A e la chiave esterna importata (mi riferisco alla chiave primaria) nell'ipotetica tabella B. In genere si usa l'id di una delle due tabelle. Non vedo l'utilità di utilizzare due "chiavi" per relazionare le due tabelle...

Dovresti però valutare meglio i parametri del WHERE, io li ho lasciati come ce li hai dati.

Per vedere se funziona meglio devi semplicemente valutare il tempo di esecuzione delle due query.

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

le due chiavi sono fatte apposta in quanto ad esempio la gestione dell' ordine è fatta così

IDO 1 - NSPE (1 - 2 - 3 - 4 ecc....)

IDO 2 - NSPE (1 - 2 - 3 - 4 ecc....)

IDO 3 - NSPE (1 - 2 - 3 - 4 ecc....)

da cui le chiavi (per entrambe le tabelle) sono

1-1 1-2 1-3 ecc...

2-1 2-2 2-3 ec... 

ec..  le coppie sono sempre uniche

se io però voglio il dettaglio dell' ordine 1-3 devo recuperare sia nella tabella SPEODR sia SUPSPE tutte le informazioni e per farlo devo necessariamente filtrare per le 2 chiavi, 1 non mi basta!

spero di essermi spiegato meglio..  ;)

 o forse non ho capito quello che intendevi.  :-\

risposto 7 anni fa
urbanus
X 0 X

TU  (voi) come la fareste la query?

risposto 7 anni fa
urbanus
X 0 X

Al posto tuo avrei creato una terza tabella per fare la relazione tra le due...non avrei fatto in questo modo la struttura del database...

Cioè la terza tabella relazionava le chiavi primarie delle due tabelle...mi sono spiegato?

Ciò renderebbe anche le interrogazioni più semplici e ogni tabella ha una sua unica funzione senza aggiungere record in più.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

ehm.. non ho capito :-[

cioè?  come avresti fatto?

risposto 7 anni fa
urbanus
X 0 X

Per creare la relazione fra le due tabelle avrei creato una terza tabella, non riesco a capire gli acronimi che usi nelle tue tabelle, le puoi rendere più esemplificative così faccio un esempio sul tuo database?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

ok.. vorrei capire..

SPEODR

IDO = numero di ordine

NSPE = numero di spedizione (per ogni ordine ci possono essere appunto più spedizioni)

IDC = id del cliente

attiva = se la spedizione è valida oppure no

Tipo = il tipo di spedizione

data

trasferita = (una sorta di visibilità della spedizione 1= solo utente 2 = solo adim 3=invisibile )

dataacc (data accettazione)

datamod (data ultima modifica stato)

qtaf (quantità)

qtah (quantità)

qtaq (quantità)

qtae (quantità)

ecc...

____________

SUPSPE

*IDO

*NSPE

IDC (indice cliente)

verg (stato di giacenza 1/0 si no)

verm (stato di modifica 1/0 si no)

vers (storno costo 1/0 si no)

trfa (doc associato)

ecc..

...

in questo modo ho tutti i dettagli principali di ogni singola "spedizione" , entrando nella singola spedizione devo poterne vedere lo stato in maniera completa,

altresì  devo poter vedere in una griglia quante giacenze ho , quante modifiche ho , quante storni ho.. e richiamare eventualmente la spedizione relativa.

...

spero di averti fatto capire...

...

vorrei capire come lo avresti fatto tu. e come avresti fatto la 3° tabella.

risposto 7 anni fa
urbanus
X 0 X

Credo che avrei fatto:

1) Tabella_Cliente

ID_cliente <---- come chiave primaria

[e poi qui i vari campi del cliente]

2) Tabella_Spedizione

ID_NSPE <----come chiave primaria

attiva = se la spedizione è valida oppure no

Tipo = il tipo di spedizione

data

trasferita = (una sorta di visibilità della spedizione 1= solo utente 2 = solo adim 3=invisibile )

dataacc (data accettazione)

datamod (data ultima modifica stato)

qtaf (quantità)

qtah (quantità)

qtaq (quantità)

qtae (quantità)

ecc...

3) Tabella_Giacenza

ID_IDO <--- chiave primaria

verg (stato di giacenza 1/0 si no)

verm (stato di modifica 1/0 si no)

vers (storno costo 1/0 si no)

trfa (doc associato)

ecc..

4) Tabella_Ordine

ID <--- chiave primaria

ID_cliente <--- chiave esterna

ID_NSPE <--- chiave esterna

ID_IDO <--- chiave esterna

Ho aggiunto una tabella in più che è quella relativa al cliente.

In poche parole suddivido la "realtà delle cose" in tabelle più piccole, ognuna dedicata alla descrizione e immagazzinamento di alcuni "oggetti" (es. cliente, ordine, spedizione, ecc...).

Queste varie entità poi le relaziono tramite una tabella che raccoglie le chiavi primarie come chiavi esterne (la Tabella_Ordine).

Non so se mi sono spiegato così...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

mh... bhe diciamo che sia la tabella dei clienti che quella ad esempio della giacenza ci sono..

come c'è una tabella per le modifiche effettuate.. per gli storni di costo ecc...

la tabella SUPSPE aiuta (appunto supporto spedizioni) come "raccoglitore" di tutta una serie di informazioni che la spedizione ha.. in questo modo facendo un join per ad esempio per mostrare i dati in una griglia ho una sintesi di tutte le informazioni principali della spedizione (non mi interessa as esempio sapere i dettagli della giacenza nella griglia, mi interessa sapere chè c'è una giacenza aperta, come ad esempio non mi interessa sapere lo storno a quanto ammonta , piuttosto che ce n'è stato uno) non so se mi sono spiegato..

e aapunto i campi di supspe sono tutti 1 o 0, se trovo 1 allora so che la spedizione ha quella "particolarità" e posso andare a vedere i dettagli.

inoltre la doppia chiave è stata fatta per avere una "cronologia" delle varie spedizioni

attualmente IDO è una chiave costruita (non autoincrement) mentre NSPE è un valore che parte da 1 per ogni ordine e aumenta a seconda dell' esigenza.  esempio.

IDO (555) NSPE (1.2.3.4.5....)

IDO (777) NSPE (1.2.3.4.5.6.7...)

come la proponi tu dovrei fare un join con 4 tabelle se non di più. (risparmio invece su

tornando alla domanda iniziale con le tabelle attuali , volendo avere il dettaglio di una singola spedizione

avendo a disposizione IDO e NSPE? il join che ho fatto funziona , ma è ottimizzato?

risposto 7 anni fa
urbanus
X 0 X
avendo a disposizione IDO e NSPE? il join che ho fatto funziona , ma è ottimizzato?

Io risponderei di no perchè non hai creato, a parer mio(per cui contestabile), una buona struttura di un database relazionale.

Inoltre per rispondere rimando al messaggio che ti ho lasciato precedentemente:

Potresti provare ad usare direttamente il join, esempio:

SELECT * FROM speodr INNER JOIN supspe ON speodr.ido=supspe.ido WHERE speodr.idc=$idcl AND speodr.ido=$ido AND speodr.nspe=$nspe

La relazione fra le due tabelle la fai con una sola chiave, cioè una chiave primaria nella tabella ipotetica A e la chiave esterna importata (mi riferisco alla chiave primaria) nell'ipotetica tabella B. In genere si usa l'id di una delle due tabelle. Non vedo l'utilità di utilizzare due "chiavi" per relazionare le due tabelle...

Dovresti però valutare meglio i parametri del WHERE, io li ho lasciati come ce li hai dati.

Per vedere se funziona meglio devi semplicemente valutare il tempo di esecuzione delle due query.

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda