Re: UniqueKey v2 - Mailing list pgsql-hackers
From | jian he |
---|---|
Subject | Re: UniqueKey v2 |
Date | |
Msg-id | CACJufxHuU7fj2Y1hWGdRHxyzw+L8YeJ3nXnDaaVJgX5F7a8OTw@mail.gmail.com Whole thread Raw |
In response to | Re: UniqueKey v2 (zhihuifan1213@163.com) |
Responses |
Re: UniqueKey v2
|
List | pgsql-hackers |
On Tue, Oct 17, 2023 at 11:21 AM <zhihuifan1213@163.com> wrote: > > > thanks for the really good suggestion. Here is the newer version: > --- a/src/backend/optimizer/path/meson.build +++ b/src/backend/optimizer/path/meson.build @@ -10,4 +10,5 @@ backend_sources += files( 'joinrels.c', 'pathkeys.c', 'tidpath.c', + 'uniquekey.c' ) diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 3ac25d47..5ed550ca 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -264,7 +264,10 @@ extern PathKey *make_canonical_pathkey(PlannerInfo *root, int strategy, bool nulls_first); extern void add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, List *live_childrels); - +/* + * uniquekey.c + * uniquekey.c related functions. + */ --------- i did some simple tests using text data type. it works with the primary key, not with unique indexes. it does not work when the column is unique, not null. The following is my test. begin; CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false); CREATE COLLATION upper_first (provider = icu, locale = 'und-u-kf-upper'); commit; begin; CREATE TABLE test_uniquekey3(a text, b text); CREATE TABLE test_uniquekey4(a text, b text); CREATE TABLE test_uniquekey5(a text, b text); CREATE TABLE test_uniquekey6(a text, b text); CREATE TABLE test_uniquekey7(a text not null, b text not null); CREATE TABLE test_uniquekey8(a text not null, b text not null); CREATE TABLE test_uniquekey9(a text primary key COLLATE upper_first, b text not null); CREATE TABLE test_uniquekey10(a text primary key COLLATE case_insensitive, b text not null); create unique index on test_uniquekey3 (a COLLATE case_insensitive nulls first) nulls distinct with (fillfactor = 80); create unique index on test_uniquekey4 (a COLLATE case_insensitive nulls first) nulls not distinct with (fillfactor = 80); create unique index on test_uniquekey5 (a COLLATE upper_first nulls first) nulls distinct; create unique index on test_uniquekey6 (a COLLATE upper_first nulls first) nulls not distinct; create unique index on test_uniquekey7 (a COLLATE upper_first nulls first) nulls distinct; create unique index on test_uniquekey8 (a COLLATE case_insensitive nulls first) nulls not distinct; insert into test_uniquekey3(a,b) select g::text, (g+10)::text from generate_series(1,1e5) g; insert into test_uniquekey4(a,b) select g::text, (g+10)::text from generate_series(1,1e5) g; insert into test_uniquekey5(a,b) select g::text, (g+10)::text from generate_series(1,1e5) g; insert into test_uniquekey6(a,b) select g::text, (g+10)::text from generate_series(1,1e5) g; insert into test_uniquekey7(a,b) select g::text, (g+10)::text from generate_series(1,1e5) g; insert into test_uniquekey8(a,b) select g::text, (g+10)::text from generate_series(1,1e5) g; insert into test_uniquekey9(a,b) select g::text, (g+10)::text from generate_series(1,1e5) g; insert into test_uniquekey10(a,b) select g::text, (g+10)::text from generate_series(1,1e5) g; insert into test_uniquekey3(a) VALUES(null),(null),(null); insert into test_uniquekey4(a) VALUES(null); insert into test_uniquekey5(a) VALUES(null),(null),(null); insert into test_uniquekey6(a) VALUES(null); commit; ANALYZE test_uniquekey3, test_uniquekey4, test_uniquekey5 ,test_uniquekey6,test_uniquekey7, test_uniquekey8 ,test_uniquekey9, test_uniquekey10; explain (costs off) select distinct a from test_uniquekey3; explain (costs off) select distinct a from test_uniquekey4; explain (costs off) select distinct a from test_uniquekey5; explain (costs off) select distinct a from test_uniquekey6; explain (costs off) select distinct a from test_uniquekey7; explain (costs off) select distinct a from test_uniquekey8; explain (costs off) select distinct a from test_uniquekey9; explain (costs off) select distinct a from test_uniquekey10; explain (costs off) select distinct a from test_uniquekey3 where a < '2000'; explain (costs off) select distinct a from test_uniquekey4 where a < '2000'; explain (costs off) select distinct a from test_uniquekey5 where a < '2000'; explain (costs off) select distinct a from test_uniquekey6 where a < '2000'; explain (costs off) select distinct a from test_uniquekey7 where a < '2000'; explain (costs off) select distinct a from test_uniquekey8 where a < '2000'; explain (costs off) select distinct a from test_uniquekey9 where a < '2000'; explain (costs off) select distinct a from test_uniquekey10 where a < '2000'; --very high selectivity explain (costs off) select distinct a from test_uniquekey3 where a < '1001'; explain (costs off) select distinct a from test_uniquekey4 where a < '1001'; explain (costs off) select distinct a from test_uniquekey5 where a < '1001'; explain (costs off) select distinct a from test_uniquekey6 where a < '1001'; explain (costs off) select distinct a from test_uniquekey7 where a < '1001'; explain (costs off) select distinct a from test_uniquekey8 where a < '1001'; explain (costs off) select distinct a from test_uniquekey9 where a < '1001'; explain (costs off) select distinct a from test_uniquekey10 where a < '1001'; explain (costs off,ANALYZE) select distinct a from test_uniquekey9 where a < '1001'; explain (costs off,ANALYZE) select distinct a from test_uniquekey10 where a < '1001';
pgsql-hackers by date: