2017-03-24 61 views
1

我有一個約10,000用戶的表。我想按照score的排序觀看前10名,並在列表組成變化或前10名的任何分數發生變化時給予實時更新。Postgres觸發任何「頂部」行更改

用觸發器做到這一點的最好方法是什麼?這會是一個非常昂貴的觸發器,可以繼續運行嗎?

回答

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 */
這應該是一個很短的操作,比如向隊列中添加一些東西,否則最終可能會導致長事務和長鎖。

+0

如何將數據與退貨程序連接起來?例如,要發送一行,我在'CREATE TRIGGER'語句中使用'FOR EACH ROW EXECUTE PROCEDURE'。這是你用'/ *你的動作在這裏* /'確定的問題嗎?我是Postgres的新手,所以你可以提供更多的細節。 –

+0

是的,這將是一個'FOR EACH ROW'觸發器。我的疑問是,我不知道你打算在觸發中做什麼。它不應該說 - 在前端同步啓動刷新。 *您將數據與返回程序*連接起來是什麼意思? –