PostgreSQL :这是因为锁(行级)吗?

Thi*_*key 2 postgresql spatial

我有一个大约有 210 万个元组的表。其中有纬度和经度列。我正在尝试将其转换为地理类型(带有 SRID 的点)。

我编写的函数(程序)在我限制条目时工作正常(比如 : SELECT id,longitude,latitude FROM list_of_location limit 50)。

CREATE OR REPLACE FUNCTION convertlatlon() RETURNS VOID AS $$
DECLARE rec RECORD;
BEGIN
    FOR rec IN SELECT id,longitude,latitude FROM list_of_location
    LOOP
    UPDATE list_of_location SET location= concat('SRID=4326;POINT(',rec.longitude,' ',rec.latitude,')') WHERE id=rec.id;    
    END LOOP;
END;
$$ LANGUAGE 'plpgsql' ;
Run Code Online (Sandbox Code Playgroud)
  • 当我尝试在整个表上运行它时,PostgreSQL 似乎什么都不做。已经等了一个半小时。
  • 在它运行的核心上消耗 99% 的 CPU。
  • 不会启动任何其他 PostgreSQL 实例以使用其他内核(因为请求来自单个用户?)。
  • 这是因为锁(行级)吗?
  • 如何规避这种情况?

a_h*_*ame 6

在循环中运行 DML 语句从来都不是一个好主意。您正在成倍增加要完成的工作量。关系数据库在对集合进行操作时是最好的,当您执行循环时,您一次对单行进行操作。

您可以通过在单个语句中进行更新来实现相同的效果:

UPDATE list_of_location
   SET location = ST_MakePoint(longitude,latitude)::geography;
Run Code Online (Sandbox Code Playgroud)

我不是 100% 关于计算实际点的语法,因为我不使用几何的东西,但我想你会明白的。