1
我通過Python試圖選擇(用WHERE
條款)和排序一個龐大的數據庫表中的sqlite3。目前這種排序大約有36 MB的數據需要30分鐘以上。我有一種感覺,它可以比索引更快的工作,但我認爲我的代碼的順序可能不正確。排序多索引的大型數據庫表SQLite中
代碼按此處列出的順序執行。
我
CREATE TABLE
聲明是這樣的:c.execute('''CREATE table gtfs_stop_times ( trip_id text , --REFERENCES gtfs_trips(trip_id), arrival_time text, -- CHECK (arrival_time LIKE '__:__:__'), departure_time text, -- CHECK (departure_time LIKE '__:__:__'), stop_id text , --REFERENCES gtfs_stops(stop_id), stop_sequence int NOT NULL --NOT NULL )''')
中的行然後插入下一步:
stop_times = csv.reader(open("tmp\\avl_stop_times.txt")) c.executemany('INSERT INTO gtfs_stop_times VALUES (?,?,?,?,?)', stop_times)
接下來,我創建一個索引了兩列(
trip_id
和stop_sequence
):c.execute('CREATE INDEX trip_seq ON gtfs_stop_times (trip_id, stop_sequence)')
最後,我運行一個
SELECT
聲明與排序由索引使用的兩列該數據的WHERE
條款,然後寫一個CSV文件:c.execute('''SELECT gtfs_stop_times.trip_id, gtfs_stop_times.arrival_time, gtfs_stop_times.departure_time, gtfs_stops.stop_id, gtfs_stop_times.stop_sequence FROM gtfs_stop_times, gtfs_stops WHERE gtfs_stop_times.stop_id=gtfs_stops.stop_code ORDER BY gtfs_stop_times.trip_id, gtfs_stop_times.stop_sequence; )''') f = open("gtfs_update\\stop_times.txt", "w") writer = csv.writer(f, dialect = 'excel') writer.writerow([i[0] for i in c.description]) # write headers writer.writerows(c) del writer
有什麼加快步驟4(可能改變我如何添加和/或使用索引)或者我應該在這段時間去吃午飯?
我已經加入註記語句來嘗試提高性能無濟於事:
c.execute('PRAGMA main.page_size = 4096')
c.execute('PRAGMA main.cache_size=10000')
c.execute('PRAGMA main.locking_mode=EXCLUSIVE')
c.execute('PRAGMA main.synchronous=NORMAL')
c.execute('PRAGMA main.journal_mode=WAL')
c.execute('PRAGMA main.cache_size=5000')
有一個'gtfs_stops'表。對不起,我忘了提到這一點。我會試一試'stop_code'的索引。 – lando
真的很有幫助,謝謝!我還在'gtfs_stop_times'中爲'stop_id'添加了另一個索引。總運行時間現在不到一分鐘。我想我現在已經從指數的價值中吸取了教訓。 – lando
用[EXPLAIN QUERY PLAN](http://www.sqlite.org/eqp.html)檢查該索引是否實際使用。 –