【问题标题】:PostgreSQL : Is this because of locks(row level)?PostgreSQL:这是因为锁(行级)吗?
【发布时间】:2012-07-29 09:49:46
【问题描述】:

我有一个包含大约 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' ;

  • 当我尝试在整个表上运行它时,PostgreSQL 似乎什么也没做。已经等了一个半小时了。
  • 占用其正在运行的内核上 99% 的 CPU。
  • 不会弹出任何其他 PostgreSQL 实例来利用其他内核(因为请求来自单个用户?)。
  • 这是因为锁(行级)吗?
  • 如何规避这个问题?

附注我很确定这将作为题外话关闭。但是,我必须寻找答案。

【问题讨论】:

  • “我很确定这会因为离题而被关闭。”为什么?
  • @MarkByers 因为这不是与编程相关的问题。类似这样的stackoverflow.com/questions/11712318/…
  • 为什么这个与编程无关? 似乎对我来说 - 你甚至发布了一些程序代码,所以我不明白为什么它不应该与编程相关。我错过了什么吗?无论如何,如果您仍然觉得它与编程无关,您可以尝试将其发布到 dba.se。
  • @MarkByers 我现在对与编程相关的内容感到困惑(WRT 堆栈溢出),因为我看到了很多问题,这些问题似乎与编程相关,但由于 off topic而被关闭>.
  • 我不明白你想要完成什么。如果您想将 (x,y) 坐标编码为几何图形,您可以在普通的 sql 更新查询中使用 SET location = ST_SetSRID(ST_MakePoint(rt.xcoord, rt.ycoord), 4326) 之类的东西。将它们连接成一个字符串对我来说毫无意义。 (免责声明:我不是 GIS 专家)。

标签: database postgresql geospatial postgis postgresql-9.1


【解决方案1】:

我不知道是什么原因导致的,但听起来可能在此操作中获得了锁。不过,您可以轻松验证这一点:

SELECT * FROM pg_locks;

会告诉你当前使用了哪些锁。和

SELECT * FROM pg_stat_activities WHERE waiting;

会告诉你,如果有锁,哪些事务正处于空闲状态等待释放锁。这应该会为您指明正确的方向。

不会弹出任何其他 PostgreSQL 实例来利用其他内核(因为请求来自单个用户?)。

这就是 postgres 的工作方式。单个会话将分拆一个后端。单个查询不做任何排序多进程或并发操作。

如何规避?

为什么要循环播放?我认为你可以一口气做到这一点。为什么不这样做:

UPDATE list_of_location 
SET location = ST_GeogFromText('POINT(' || longitude || ' ' || latitude || ')');

(假设给你正确的结果)

【讨论】:

  • +1 表示这可以在单个语句中完成。
  • 我很愚蠢,因为我没有想到单一的陈述。感谢您提供有关锁的信息:)。
  • 正确。是的,在处理 SQL 时考虑“数据集”,应该会让你的生活更轻松。大多数情况下。
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2021-10-18
  • 2021-12-04
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
相关资源
最近更新 更多