我有一个具有以下结构的位置表:
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万次插入后的某个地方,插入速度急剧下降。当我重新启动脚本时速度恢复正常但它再次下降大约一百万个文档并且相同的趋势继续。我想不通为什么? 任何帮助。
答案 0 :(得分:2)
这里有一些提示。
str(id)
,它始终返回字符串'<built-in function id>'
,因为id
未显示为问题中的变量,并且是内置的{{3} }}。id()
function。这是插入一个点的方法:
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)]
)。