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.
Puoi testare una terza versione: 'SELEZIONA * DA UN INTERNO ENTRA B SU A.X = B.Y E B.Z = 1'? –
@ JoëlSalamin Questo ha circa lo stesso tempo di esecuzione della prima versione lenta. – user3726374
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' –