2014-09-30 17 views
5

La velocità di esecuzione delle seguenti query è notevolmente diversa. Il secondo completa ordini di grandezza più veloci del primo.SQL INNER JOIN ottimizzazione automatica in HSQLDB

SELECT * FROM A INNER JOIN B ON A.X=B.Y WHERE B.Z=1 
SELECT * FROM A INNER JOIN (SELECT * FROM B) ON A.X=B.Y WHERE B.Z=1 

Sarebbe bello se qualcuno scrivesse perché questo è. Il database è HSQLDB con JDBC.

Ulteriori informazioni: La versione di HSQLDB è 2.3.2. E la colonna A.X è indicizzata ma la colonna B.Y no.

+1

Puoi testare una terza versione: 'SELEZIONA * DA UN INTERNO ENTRA B SU A.X = B.Y E B.Z = 1'? –

+0

@ JoëlSalamin Questo ha circa lo stesso tempo di esecuzione della prima versione lenta. – user3726374

+0

Può essere causato dal fatto che 'B.Y' non è indicizzato. Puoi provare quest'altra versione e dirmi se c'è un guadagno/perdita di prestazioni: 'SELEZIONA * DA UN JOINT INTERNO (SELEZIONA * DA B WHERE BZ = 1) SU AXE = BY' –

risposta

1

La risposta è: indexing

Immaginate che ho un dizionario e qualcuno mi dà un compito di trovare 5000 parole in esso. Questo compito mi richiederebbe diverse ore.
Ma ora immagina che questo dizionario sia non ordinato. Ci vorrebbero anni per trovare tutte queste parole in esso.
Il computer è più veloce e per la prima attività sono necessari solo millisecondi mentre il secondo compito rimane diversi secondi.

Perché la prima query è così lenta?

Questo perché c'è INNER JOIN ed è fatto su una colonna non indicizzata.

Perché la seconda query è così veloce?

Questo perché c'è subquery. Questa sottoquery viene materializzata nella tabella temporanea e l'indice viene creato per la colonna di join. Quindi non ti unisci ora con una tabella B non indicizzata ma con una tabella temporanea indicizzata. HSQLDB crea questa indicizzazione sulla tabella temporanea per facilitare l'adesione. Anche se si modifica la condizione di join in modo più complesso (ad esempio: A.X = B.Y + 2*B.Z), questa query sarà comunque veloce. Ciò significa che HSQLDB crea l'indice sull'espressione utilizzata nella condizione di join.

+0

Questo ha decisamente senso. Hai forse qualche riferimento per ciò che hai descritto? – user3726374