我需要从PG数据库中删除大约200万行.我有一个我需要删除的ID列表.但是,我尝试这样做的任何方式都需要几天时间.
我尝试将它们放在一个表中,并在100个批次中进行.4天后,这仍然在运行,只删除了297268行.(我必须从ID表中选择100个id,删除该列表中的IN,从ids表中删除我选择的100个).
我试过了:
DELETE FROM tbl WHERE id IN (select * from ids)
Run Code Online (Sandbox Code Playgroud)
那也是永远的.很难判断多久,因为我看不到它的进展直到完成,但查询仍然在2天后运行.
当我知道要删除的特定ID时,只需要寻找从表中删除的最有效方法,并且有数百万个ID.
我在Postgres 9.2中有下表(简化形式)
CREATE TABLE log (
log_date DATE,
user_id INTEGER,
payload INTEGER
);
Run Code Online (Sandbox Code Playgroud)
它每个用户和每天最多包含一条记录.每天将有大约500,000条记录,为期300天.每个用户的running_total总是在增加.
我想在特定日期之前有效地检索每个用户的最新记录.我的查询是:
SELECT user_id, max(log_date), max(payload)
FROM log
WHERE log_date <= :mydate
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)
这非常慢.我也尝试过:
SELECT DISTINCT ON(user_id), log_date, payload
FROM log
WHERE log_date <= :mydate
ORDER BY user_id, log_date DESC;
Run Code Online (Sandbox Code Playgroud)
具有相同的计划,同样缓慢.
到目前为止,我在user_msg_log(aggr_date)上有一个索引,但没有多大帮助.我应该用什么其他索引来加快速度,还是以任何其他方式实现我的目标?
sql postgresql indexing greatest-n-per-group postgresql-performance
我有一张超过十亿条记录的桌子.为了提高性能,我将其分区为30个分区.最常见的查询(id = ...)
在where子句中有,所以我决定在id
列上对表进行分区.
基本上,分区是以这种方式创建的:
CREATE TABLE foo_0 (CHECK (id % 30 = 0)) INHERITS (foo);
CREATE TABLE foo_1 (CHECK (id % 30 = 1)) INHERITS (foo);
CREATE TABLE foo_2 (CHECK (id % 30 = 2)) INHERITS (foo);
CREATE TABLE foo_3 (CHECK (id % 30 = 3)) INHERITS (foo);
.
.
.
Run Code Online (Sandbox Code Playgroud)
我跑ANALYZE
了整个数据库,特别是,我id
通过运行它来收集这个表的列的额外统计信息:
ALTER TABLE foo ALTER COLUMN id SET STATISTICS 10000;
Run Code Online (Sandbox Code Playgroud)
但是,当我运行在id
列上过滤的查询时,计划程序会显示它仍在扫描所有分区.constraint_exclusion
设置为partition
,所以这不是问题.
EXPLAIN ANALYZE SELECT * …
Run Code Online (Sandbox Code Playgroud) 我想改进这个慢查询,我想添加一个索引,但我不知道哪种索引类型更适合我的情况。
SELECT COUNT(*) ct FROM events
WHERE dtt AT TIME ZONE 'America/Santiago'
>= date(now() AT TIME ZONE 'America/Santiago') + interval '1s'
Run Code Online (Sandbox Code Playgroud)
查询计划:
"Aggregate (cost=128032.03..128032.04 rows=1 width=0) (actual time=3929.083..3929.083 rows=1 loops=1)"
" -> Seq Scan on events (cost=0.00..125937.68 rows=837742 width=0) (actual time=113.080..3926.972 rows=25849 loops=1)"
" Filter: (timezone('America/Santiago'::text, dtt) >= (date(timezone('America/Santiago'::text, now())) + '00:00:01'::interval))"
" Rows Removed by Filter: 2487386"
"Planning time: 0.179 ms"
"Execution time: 3929.136 ms"
Run Code Online (Sandbox Code Playgroud)
注意:根据 Erwin 的建议,查询运行得更快一些,但我认为还不够快。
"Aggregate (cost=119667.76..119667.77 rows=1 width=0) (actual …
Run Code Online (Sandbox Code Playgroud) 是的,再次填充因子.我花了很多时间阅读,我无法确定每个案例哪个是更好的填充因子.问题是我不明白何时以及如何进行碎片化.我正在将数据库从MS SQL Server迁移到PostgreSQL 9.2.
情况1)连续(连续)PK中10-50次插入/分钟,每小时20-50次读数.
CREATE TABLE dev_transactions
(
transaction_id serial NOT NULL,
transaction_type smallint NOT NULL,
moment timestamp without time zone NOT NULL,
gateway integer NOT NULL,
device integer NOT NULL,
controler smallint NOT NULL,
token integer,
et_mode character(1),
status smallint NOT NULL,
CONSTRAINT pk_dev_transactions PRIMARY KEY (transaction_id)
)
WITH (
OIDS=FALSE
);
Run Code Online (Sandbox Code Playgroud)
情况2)PK顺序的类似结构索引将以每个2个月~50,000个寄存器的块(一次)写入,读数为10-50 /分钟.
50%的填充因子意味着在每个插入中将生成一个新页面并将50%的现有记录传输到新的生成页面?
50%的填充因子意味着在创建新页面时,复制的记录将被保留以避免插入之间?
只有在没有空间分配记录时才会生成新页面?
你可以看到我很困惑; 我会很感激它的一些帮助 - 也许是一个关于PostgreSQL和索引填充因子的好链接.
postgresql ×5
sql ×5
indexing ×2
bigdata ×1
count ×1
database ×1
partitioning ×1
sql-delete ×1
timezone ×1