我有一个集中编写的数据库(连续流量为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脚本的性能?设置规则会更好吗?
答案 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()
下一步是评估输入流的某种形式的缓存,以便后续批量插入。数据来自哪里?怎么样?