1

在分区表上执行常规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而不是访问所有分区

4

0 回答 0