一段时间后,POSTGIS插入变慢

时间:2016-02-05 08:25:04

标签: python postgresql python-2.7 postgis psycopg2

我有一个具有以下结构的位置表:

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 

我在一个循环中运行这个代码块10,000,000次,但在100万次插入后的某个地方,插入速度急剧下降。当我重新启动脚本时速度恢复正常但它再次下降大约一百万个文档并且相同的趋势继续。我想不通为什么? 任何帮助。

1 个答案:

答案 0 :(得分:2)

这里有一些提示。

这是插入一个点的方法:

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

如果您想一次插入更多记录,请参阅Don't format a string to insert,您可以在其中准备要插入的参数列表(例如[(msisdn, lon, lat), (msisdn, lon, lat), ..., (msisdn, lon, lat)])。