Postgres触发任何" top"行更改

时间:2017-03-24 13:36:59

标签: postgresql triggers

我有一个包含大约10,000个用户的表。我希望按照score排序前十名,并在列表的组成发生变化或前十名的任何分数发生变化时进行实时更新。

使用触发器执行此操作的最佳方法是什么?这将是一个非常昂贵的触发器来继续运行吗?

1 个答案:

答案 0 :(得分:0)

只要您拥有score的索引,拥有包含以下内容的AFTER UPDATE触发器FOR EACH ROW便宜:

IF (SELECT count(*)
    FROM (SELECT 1
          FROM users
          WHERE score > NEW.score
          LIMIT 10
         ) top_users
   ) < 10
  OR
   (SELECT count(*)
    FROM (SELECT 1
          FROM users
          WHERE score > OLD.score
          LIMIT 10
         ) top_users
   ) < 10
THEN
   /* your action here */
END IF;

您还需要DELETE触发器,该触发器仅包含查询的第二部分,而INSERT触发器仅包含第一部分。

我在这里看到的问题是/* your action here */ 这应该是一个简短的操作,比如在队列中添加一些东西,否则你可能会遇到长事务和长锁。