2016-02-05 31 views
2

我有如下結構的位置表之後變得緩慢:POSTGIS插入一段時間

CREATE TABLE location 
     ( 
      id BIGINT, 
      location GEOMETRY, 
      CONSTRAINT location_pkey PRIMARY KEY (id, location), 
      CONSTRAINT enforce_dims_geom CHECK (st_ndims(location) = 2), 
      CONSTRAINT enforce_geotype_geom CHECK (geometrytype(location) = 'POINT'::TEXT OR location IS NULL), 
      CONSTRAINT enforce_srid_geom CHECK (st_srid(location) = 4326) 
     ) 
    WITH ( 
      OIDS=FALSE 
     ); 

    CREATE INDEX location_geom_gist ON location 
    USING 
    GIST (location); 

我運行下面的查詢插入數據:

def insert_location_data(msisdn, lat, lon): 
    if not (lat and lon):  
      return 
    query = "INSERT INTO location (id, location) VALUES ('%s', ST_GeomFromText('POINT(%s %s)', 4326))"%(str(id), str(lat), str(lon)) 
    try: 
     cur = get_cursor() 
     cur.execute(query) 
     conn.commit() 
    except: 
     tb = traceback.format_exc() 
     Logger.get_logger().error("Error while inserting location in sql: %s", str(tb)) 
     return False 
    return True 

我運行的代碼塊1000萬次在一個循環中卻有一百萬插入插入速度急劇下降。當我重新啓動腳本時,速度恢復正常,但它又下降了大約一百萬個文檔,並繼續保持相同的趨勢。我無法弄清楚爲什麼? 任何幫助。

+0

使用擴展插入語句。在循環中準備查詢,然後將其發送到PostgreSQL –

+0

這裏有一個關於在postgres上加載批量數據的指南:http://www.postgresql.org/docs/current/interactive/populate.html –

+0

但是爲什麼情況在發生。查詢起初速度很快,但隨着時間的推移,速度正在下降。數據庫大小不是問題,因爲重新啓動腳本會將速度恢復到最大值。 –

回答

1

這裏有一些提示。

這是如何插入一個點:

cur.execute(
    "INSERT INTO location (id, location) " 
    "VALUES (%s, ST_SetSRID(ST_MakePoint(%s, %s), 4326))", 
    (msisdn, lon, lat)) 

而且看executemany,如果你想在同一時間,在那裏你會準備的參數插入表中插入更多的記錄(即[(msisdn, lon, lat), (msisdn, lon, lat), ..., (msisdn, lon, lat)])。

+0

你能告訴我爲什麼插入一段時間後變得緩慢 –

+0

@ArijitBasu我不能再現這種行爲;我只得到* O(n)*(或線性)。 –