在分区表上执行常规UPDATE
语句 似乎比在常规表中执行更糟糕。
设置
CREATE TABLE users
(
id VARCHAR(10) NOT NULL,
name VARCHAR(10) NOT NULL
) PARTITION BY HASH (id);
ALTER TABLE users ADD PRIMARY KEY (id);
CREATE TABLE users_p0 PARTITION OF users FOR VALUES WITH (MODULUS 3, REMAINDER 0);
CREATE TABLE users_p1 PARTITION OF users FOR VALUES WITH (MODULUS 3, REMAINDER 1);
CREATE TABLE users_p2 PARTITION OF users FOR VALUES WITH (MODULUS 3, REMAINDER 2);
INSERT INTO users (id, name) VALUES ('1', 'Blue');
INSERT INTO users (id, name) VALUES ('2', 'Green');
INSERT INTO users (id, name) VALUES ('3', 'Red');
INSERT INTO users (id, name) VALUES ('4', 'Yellow');
SELECT
语句查询计划
EXPLAIN SELECT * FROM users WHERE id = '1';
结果(成本=0.15..2.37)
Append (cost=0.15..2.37 rows=1 width=76)
-> Index Scan using users_p0_pkey on users_p0 (cost=0.15..2.37 rows=1 width=76)
Index Cond: ((id)::text = '1'::text)
UPDATE
语句查询计划
EXPLAIN UPDATE users SET name = 'New blue' WHERE id = '1';
结果(成本=0.15..7.10)
Update on users (cost=0.15..7.10 rows=3 width=82)
Update on users_p0
Update on users_p1
Update on users_p2
-> Index Scan using users_p0_pkey on users_p0 (cost=0.15..2.37 rows=1 width=82)
Index Cond: ((id)::text = '1'::text)
-> Index Scan using users_p1_pkey on users_p1 (cost=0.15..2.37 rows=1 width=82)
Index Cond: ((id)::text = '1'::text)
-> Index Scan using users_p2_pkey on users_p2 (cost=0.15..2.37 rows=1 width=82)
Index Cond: ((id)::text = '1'::text)
我希望查询计划器直接访问users_p0而不是访问所有分区