Postgresql

Postgres 12:表 PARTITION BY (A) 上的 PRIMARY KEY(A, B) 和 PRIMARY KEY (B, A) 之間是否存在性能差異?

  • May 6, 2020

給定一個表這個表:

CREATE TABLE tbl (
 a int not null,
 b int not null,
 created timestamp not null default now(),
 primary key(a, b)
) PARTITION BY LIST(a)

用於查找列的查詢計劃a如下b所示:

EXPLAIN ANALYZE SELECT EXISTS(SELECT * FROM tbl WHERE a = 1 AND b = 1)

Result  (cost=2.37..2.38 rows=1 width=1) (actual time=0.013..0.013 rows=1 loops=1)
 InitPlan 1 (returns $0)
   ->  Index Only Scan using pkey on partition  (cost=0.15..2.37 rows=1 width=0) (actual time=0.012..0.012 rows=0 loops=1)
         Index Cond: ((a = 1) AND (b = 1))
         Heap Fetches: 0
Planning Time: 0.860 ms
Execution Time: 0.033 ms

我想知道是否以反向列順序定義主PRIMARY KEY (b, a) ) PARTITION BY LIST (a)a(在。

不,那不會有任何區別;=如果兩個列都在條件中進行比較,則索引中列的順序無關緊要WHERE(當然只有AND在條件之間存在時)。

索引將同時使用兩列掃描,重要的是匹配條件的索引條目的數量,這在兩種情況下都是相同的:

 a  |  b           b  |  a
-----+-----       -----+-----
  1 |  -1          -1 |   1
  1 |   1  <---    -1 |   2
  1 |   1  <---     1 |   1
  1 |   2           1 |   1  <---
  2 |  -1           1 |   2  <---
  2 |   1           2 |   1
  2 |   3           2 |   3

index on (a,b)   index on (b,a)

引用自:https://dba.stackexchange.com/questions/266580