2013-07-30 55 views
1

我通過Python試圖選擇(用WHERE條款)和排序一個龐大的數據庫表中的sqlite3。目前這種排序大約有36 MB的數據需要30分鐘以上。我有一種感覺,它可以比索引更快的工作,但我認爲我的代碼的順序可能不正確排序多索引的大型數據庫表SQLite中

代碼按此處列出的順序執行。

  1. 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 
    )''') 
    
  2. 中的行然後插入下一步:

    stop_times = csv.reader(open("tmp\\avl_stop_times.txt")) 
    c.executemany('INSERT INTO gtfs_stop_times VALUES (?,?,?,?,?)', stop_times) 
    
  3. 接下來,我創建一個索引了兩列(trip_idstop_sequence):

    c.execute('CREATE INDEX trip_seq ON gtfs_stop_times (trip_id, stop_sequence)') 
    
  4. 最後,我運行一個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')  

回答

2

SELECT的執行速度極快,因爲沒有gtfs_stops表,你會得到什麼,但一個錯誤信息。

如果我們假設有一個gtfs_stops表,那麼您的trip_seq索引已經非常適合查詢。 但是,您還需要在gtfs_stops列中查找stop_code值的索引。

+0

有一個'gtfs_stops'表。對不起,我忘了提到這一點。我會試一試'stop_code'的索引。 – lando

+0

真的很有幫助,謝謝!我還在'gtfs_stop_times'中爲'stop_id'添加了另一個索引。總運行時間現在不到一分鐘。我想我現在已經從指數的價值中吸取了教訓。 – lando

+0

用[EXPLAIN QUERY PLAN](http://www.sqlite.org/eqp.html)檢查該索引是否實際使用。 –