Sono confuso dai tempi di esecuzione drasticamente diversi delle seguenti due query che producono output identico. Le query sono in esecuzione su Sqlite 3.7.9, su un tavolo con circa 4,5 milioni di righe e ciascuna produce ~ 50 righe di risultati.Sottoselezione Sqlite molto più veloce del distinto + ordine di
Ecco le domande:
% echo "SELECT DISTINCT acolumn FROM atable ORDER BY acolumn;" | time sqlite3 mydb
sqlite3 mydb 8.87s user 15.06s system 99% cpu 23.980 total
% echo "SELECT acolumn FROM (SELECT DISTINCT acolumn FROM atable) ORDER BY acolumn;" | time sqlite3 options
sqlite3 mydb 1.15s user 0.10s system 98% cpu 1.267 total
Non dovrebbe la performance delle due interrogazioni essere più vicini? Capisco che potrebbe accadere che il pianificatore delle query esegua le operazioni "ordinamento" e "distinto" in ordini diversi, ma in tal caso, è necessario? O dovrebbe essere in grado di capire come farlo più veloce?
Modifica: come richiesto qui è l'output del comando "PIANO DI QUANTITÀ EXPLAIN" per ogni query.
Per la prima (monolitico) query:
0|0|0|SCAN TABLE atable (~1000000 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT
Per il secondo (subquery) query:
1|0|0|SCAN TABLE atable (~1000000 rows)
1|0|0|USE TEMP B-TREE FOR DISTINCT
0|0|0|SCAN SUBQUERY 1 (~1000000 rows)
0|0|0|USE TEMP B-TREE FOR ORDER BY
prega di mostrare il [SPIEGARE QUERY PIANO] (http: // www. sqlite.org/eqp.html) per entrambe le query. –
interessante, hai eseguito query più volte? in ordine diverso? Voglio ripetere i tuoi esperimenti, puoi condividere db? che piattaforma usi? – Leonidos
Posso riprodurlo con l'ultimo SQLite su più piattaforme. Dati di test stupidi: [mydb.bz2.bz2] (http://cladisch.fastmail.net/mydb.bz2.bz2) (sì, compresso * due volte *). –