密集写作滚动窗口Postgresql数据库

时间:2014-07-02 08:12:04

标签: sql postgresql

我有一个集中编写的数据库(连续流量为50000行/分钟),几乎所有值都在同一个表中逐个插入。之前我曾经拥有一个带有一个表的常规数据库,但是表变得非常大,查询花了太多时间。

现在我设计了一个滚动窗口数据库。我有一个父表测量和一组子表 meas_1,meas_2 ... meas_7 。在 meas_1 中,我插入了今天的值,在 meas_2 中插入了昨天的值,依此类推。当第二天到来时,我创建了一个新的 meas_x 子表,我删除了最旧的表 meas_7 ,并设置了一个在向插入数据时触发的函数测量(父表),以便将值重定向到 meas_x (新子表)。通过这样做,我可以在查询时利用contraint_exclusion,我也可以删除最旧的表( meas_7 ),而无需运行真空操作来释放光盘中的空间。

触发器和函数如下所示:

CREATE TRIGGER insert_measurements_trigger 
                BEFORE INSERT ON measurements 
                FOR EACH ROW EXECUTE PROCEDURE measurements_insert_trigger();'


CREATE OR REPLACE FUNCTION measurements_insert_trigger() 
        RETURNS TRIGGER AS $$
        BEGIN
            IF ( NEW.timestamp >= d1_0 AND NEW.timestamp < d1_1 ) THEN
                INSERT INTO "meas_1" VALUES (NEW.*);
            ELSEIF ( NEW.timestamp >= d2_0 AND NEW.timestamp < d2_1 ) THEN 
                INSERT INTO "meas_2" VALUES (NEW.*); 
            ELSE 
                INSERT INTO "CatchLostRows" VALUES (NEW.*); 
            END IF; 
            RETURN NULL; 
        END; 
        $$ 
        LANGUAGE plpgsql;

请注意 d1_1&gt; d1_0 = d2_1&gt; d2_0

我有一个Python脚本负责更新滚动窗口数据库中的所有设置。我有另一个Python脚本负责插入所有数据。

我的问题是这个操作花费了太多时间而我无法处理如此高的输入速率。我逐个插入行,因为函数是按行执行的,所以需要花费很多时间(即我的访客)。如何提高Rolling Database脚本的性能?设置规则会更好吗?

1 个答案:

答案 0 :(得分:0)

让Python决定应该插入哪个子节点并不昂贵。我假设有7个孩子,每周一个孩子。

import psycopg2
from datetime import datetime
from psycopg2.extensions import AsIs

conn = psycopg2.connect("host=localhost4 port=5432 dbname=cpn")
cursor = conn.cursor()

insert_query = """
    insert into %(child)s (id, value, "timestamp")
    values
    (%(id)s, %(value)s, %(timestamp)s)
"""
timestamp = datetime(2014, 1, 1, 0, 0, 0)
insert_dict = {
    'child': AsIs('meas_' + str(timestamp.isoweekday())),
    'id': 1,
    'value': 1,
    'timestamp': timestamp
}

cursor.execute(insert_query, insert_dict)
conn.commit()

下一步是评估输入流的某种形式的缓存,以便后续批量插入。数据来自哪里?怎么样?