我對以下兩個查詢產生相同輸出的截然不同的運行時間感到困惑。查詢在Sqlite 3.7.9上運行,在一個約450萬行的表上,每個查詢產生大約50行結果。Sqlite的子查詢速度遠快於distinct + order by
這裏有疑問:
% 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
應該不是兩個查詢的性能更接近?我知道查詢計劃員可能會以不同的順序執行「排序」和「不同」操作,但如果是這樣,它是否需要?還是應該能夠弄清楚如何做到最快?
編輯:按照要求,這裏是每個查詢的「EXPLAIN QUERY PLAN」命令的輸出。
對於第(單片)的查詢:
0|0|0|SCAN TABLE atable (~1000000 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT
對於第二(子查詢)的查詢:
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
請出示[解釋查詢計劃(HTTP:// WWW。 sqlite.org/eqp.html)輸出兩個查詢。 –
intresting,你幾次運行查詢?按不同的順序?我想重複你的實驗,你可以分享db嗎?你使用什麼平臺? – Leonidos
我可以在多個平臺上使用最新的SQLite重現此操作。愚蠢的測試數據:[mydb.bz2.bz2](http://cladisch.fastmail.net/mydb.bz2.bz2)(是的,壓縮*兩次*)。 –