рдпрд╣ рдЖрд▓реЗрдЦ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 12 рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдпрд╛ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд┐рднрд╛рдЬрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ред рд╣рд╛рдИрд▓реЗрдб ++ рд╕рд╛рдЗрдмреЗрд░рд┐рдпрд╛ 2019 рд╕рдореНрдореЗрд▓рди
рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреА
рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдПрдкреАрдкреА: рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ
рд╡реАрдбрд┐рдпреЛ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛)ред
рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:
=> SELECT version();
version ------------------------------------------------------------------------------------------------------------------ PostgreSQL 12beta1 on i686-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609, 32-bit (1 row)
рдЙрджрд╛рд╣рд░рдг рдбреЗрдореЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдмреБрдХрд┐рдВрдЧ рдФрд░ рдЯрд┐рдХрдЯ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрд░рдХреНрд╖рдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреВрди рд╕реЗ рдЕрдЧрд╕реНрдд 2017 рддрдХ рддреАрди рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
=> \d bookings
Table "bookings.bookings" Column | Type | Collation | Nullable | Default --------------+--------------------------+-----------+----------+--------- book_ref | character(6) | | not null | book_date | timestamp with time zone | | not null | total_amount | numeric(10,2) | | not null | Indexes: "bookings_pkey" PRIMARY KEY, btree (book_ref) Referenced by: TABLE "tickets" CONSTRAINT "tickets_book_ref_fkey" FOREIGN KEY (book_ref) REFERENCES bookings(book_ref)
рдПрдХ рдЖрд░рдХреНрд╖рдг рдореЗрдВ рдХрдИ рдЯрд┐рдХрдЯ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЯрд┐рдХрдЯ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛:
=> \d tickets
Table "bookings.tickets" Column | Type | Collation | Nullable | Default ----------------+-----------------------+-----------+----------+--------- ticket_no | character(13) | | not null | book_ref | character(6) | | not null | passenger_id | character varying(20) | | not null | passenger_name | text | | not null | contact_data | jsonb | | | Indexes: "tickets_pkey" PRIMARY KEY, btree (ticket_no) Foreign-key constraints: "tickets_book_ref_fkey" FOREIGN KEY (book_ref) REFERENCES bookings(book_ref) Referenced by: TABLE "ticket_flights" CONSTRAINT "ticket_flights_ticket_no_fkey" FOREIGN KEY (ticket_no) REFERENCES tickets(ticket_no)
рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╣рдо рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
тЖТ рдбреЗрдореЛ рдмреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ
рдпрд╣рд╛рдВредрд╢реНрд░реЗрдгреА рд╡рд┐рднрд╛рдЬрди
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмреБрдХрд┐рдВрдЧ рд░реЗрдВрдЬ рдХреЛ рдбреЗрдЯ рд░реЗрдВрдЬ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддрд╛рд▓рд┐рдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА:
=> CREATE TABLE bookings_range ( book_ref character(6), book_date timestamptz, total_amount numeric(10,2) ) PARTITION BY RANGE(book_date);
рдкреНрд░рддреНрдпреЗрдХ рдорд╛рд╣ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ:
=> CREATE TABLE bookings_range_201706 PARTITION OF bookings_range FOR VALUES FROM ('2017-06-01'::timestamptz) TO ('2017-07-01'::timestamptz); => CREATE TABLE bookings_range_201707 PARTITION OF bookings_range FOR VALUES FROM ('2017-07-01'::timestamptz) TO ('2017-08-01'::timestamptz);
рдХрд┐рд╕реА рдЕрдиреБрднрд╛рдЧ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рди рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ, рдмрд▓реНрдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рдЙрд╕ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
=> CREATE TABLE bookings_range_201708 PARTITION OF bookings_range FOR VALUES FROM (to_timestamp('01.08.2017','DD.MM.YYYY')) TO (to_timestamp('01.09.2017','DD.MM.YYYY'));
рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг:
=> \d+ bookings_range
Partitioned table "bookings.bookings_range" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------------+--------------------------+-----------+----------+---------+----------+--------------+------------- book_ref | character(6) | | | | extended | | book_date | timestamp with time zone | | | | plain | | total_amount | numeric(10,2) | | | | main | | Partition key: RANGE (book_date) Partitions: bookings_range_201706 FOR VALUES FROM ('2017-06-01 00:00:00+03') TO ('2017-07-01 00:00:00+03'), bookings_range_201707 FOR VALUES FROM ('2017-07-01 00:00:00+03') TO ('2017-08-01 00:00:00+03'), bookings_range_201708 FOR VALUES FROM ('2017-08-01 00:00:00+03') TO ('2017-09-01 00:00:00+03')
рдпрд╣ рдХрд╛рдлреА рд╣реИред рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ; рдХреЛрдИ CHECK рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВред CONSTRAINT_EXCLUSION рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдмрдВрдж рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
=> SET constraint_exclusion = OFF;
рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рднрд░рдирд╛:
=> INSERT INTO bookings_range SELECT * FROM bookings;
INSERT 0 262788
рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрднреА рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
=> SELECT tableoid::regclass, count(*) FROM bookings_range GROUP BY tableoid;
tableoid | count -----------------------+-------- bookings_range_201706 | 7303 bookings_range_201707 | 167062 bookings_range_201708 | 88423 (3 rows)
рд▓реЗрдХрд┐рди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ:
=> SELECT * FROM ONLY bookings_range;
book_ref | book_date | total_amount ----------+-----------+-------------- (0 rows)
рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рдмрд╣рд┐рд╖реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
=> EXPLAIN (COSTS OFF) SELECT * FROM bookings_range WHERE book_date = '2017-07-01'::timestamptz;
QUERY PLAN ---------------------------------------------------------------------------- Seq Scan on bookings_range_201707 Filter: (book_date = '2017-07-01 00:00:00+03'::timestamp with time zone) (2 rows)
рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрднрд╛рдЧ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ред
рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд┐рд░ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рде to_timestamp рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
=> EXPLAIN (COSTS OFF) SELECT * FROM bookings_range WHERE book_date = to_timestamp('01.07.2017','DD.MM.YYYY');
QUERY PLAN ------------------------------------------------------------------------------------ Append Subplans Removed: 2 -> Seq Scan on bookings_range_201707 Filter: (book_date = to_timestamp('01.07.2017'::text, 'DD.MM.YYYY'::text)) (4 rows)
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рддрдм рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рднрд╛рдЧ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рдмрдкреНрд▓рд╕ рд░рд┐рдореВрд╡рд▓ рд▓рд╛рдЗрди)ред
рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ SELECT рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдмрджрд▓рддреЗ рд╕рдордп, STABLE рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреБрднрд╛рдЧ рдмрд╣рд┐рд╖реНрдХрд░рдг рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
=> EXPLAIN (COSTS OFF) DELETE FROM bookings_range WHERE book_date = to_timestamp('01.07.2017','DD.MM.YYYY');
QUERY PLAN ------------------------------------------------------------------------------------ Delete on bookings_range Delete on bookings_range_201706 Delete on bookings_range_201707 Delete on bookings_range_201708 -> Seq Scan on bookings_range_201706 Filter: (book_date = to_timestamp('01.07.2017'::text, 'DD.MM.YYYY'::text)) -> Seq Scan on bookings_range_201707 Filter: (book_date = to_timestamp('01.07.2017'::text, 'DD.MM.YYYY'::text)) -> Seq Scan on bookings_range_201708 Filter: (book_date = to_timestamp('01.07.2017'::text, 'DD.MM.YYYY'::text)) (10 rows)
рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
=> EXPLAIN (COSTS OFF) DELETE FROM bookings_range WHERE book_date = '2017-07-01'::timestamptz;
QUERY PLAN ---------------------------------------------------------------------------------- Delete on bookings_range Delete on bookings_range_201707 -> Seq Scan on bookings_range_201707 Filter: (book_date = '2017-07-01 00:00:00+03'::timestamp with time zone) (4 rows)
рд╕реВрдЪрдХрд╛рдВрдХ рдЫрдБрдЯрд╛рдИ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдо SORT рдиреЛрдб рдФрд░ рдпреЛрдЬрдирд╛ рдХреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓рд╛рдЧрдд рджреЗрдЦрддреЗ рд╣реИрдВ:
=> EXPLAIN SELECT * FROM bookings_range ORDER BY book_date;
QUERY PLAN ------------------------------------------------------------------------------------------ Sort (cost=24649.77..25077.15 rows=170952 width=52) Sort Key: bookings_range_201706.book_date -> Append (cost=0.00..4240.28 rows=170952 width=52) -> Seq Scan on bookings_range_201706 (cost=0.00..94.94 rows=4794 width=52) -> Seq Scan on bookings_range_201707 (cost=0.00..2151.30 rows=108630 width=52) -> Seq Scan on bookings_range_201708 (cost=0.00..1139.28 rows=57528 width=52) (6 rows)
Book_date рдкрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдПрдВред рдПрдХрд▓ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдмрдЬрд╛рдп, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ:
=> CREATE INDEX book_date_idx ON bookings_range(book_date);
=> \di bookings_range*
List of relations Schema | Name | Type | Owner | Table ----------+-------------------------------------+-------+---------+----------------------- bookings | bookings_range_201706_book_date_idx | index | student | bookings_range_201706 bookings | bookings_range_201707_book_date_idx | index | student | bookings_range_201707 bookings | bookings_range_201708_book_date_idx | index | student | bookings_range_201708 (3 rows)
рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╡рд╛рд▓реА рдкрд┐рдЫрд▓реА рдХреНрд╡реЗрд░реА рдЕрдм рд╡рд┐рднрд╛рдЬрди рдХреБрдВрдЬреА рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рддреБрд░рдВрдд рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИред SORT рдиреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд▓рд╛рдЧрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
=> EXPLAIN SELECT * FROM bookings_range ORDER BY book_date;
QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------- Append (cost=1.12..14880.88 rows=262788 width=52) -> Index Scan using bookings_range_201706_book_date_idx on bookings_range_201706 (cost=0.28..385.83 rows=7303 width=52) -> Index Scan using bookings_range_201707_book_date_idx on bookings_range_201707 (cost=0.42..8614.35 rows=167062 width=52) -> Index Scan using bookings_range_201708_book_date_idx on bookings_range_201708 (cost=0.42..4566.76 rows=88423 width=52) (4 rows)
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╡рд┐рднрд╛рдЬрди рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдХреЗрдВрджреНрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ рдЦрдВрдб рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЦрдВрдб рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ:
=> DROP INDEX bookings_range_201706_book_date_idx;
ERROR: cannot drop index bookings_range_201706_book_date_idx because index book_date_idx requires it HINT: You can drop index book_date_idx instead.
рдХреЗрд╡рд▓ рдкреВрд░реЗ рдореЗрдВ:
=> DROP INDEX book_date_idx;
DROP INDEX
рднрд╛рд░рддреАрдп рдмрдирд╛рдПрдБ ... рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ
рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рд▓реЗрдХрд┐рди рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреЗрд╡рд▓ рдореБрдЦреНрдп рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛:
=> CREATE INDEX book_date_idx ON ONLY bookings_range(book_date);
=> SELECT indisvalid FROM pg_index WHERE indexrelid::regclass::text = 'book_date_idx';
indisvalid ------------ f (1 row)
рдлрд┐рд░ CONCURRENTLY рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдкрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрдирд╛рдПрдВ:
=> CREATE INDEX CONCURRENTLY book_date_201706_idx ON bookings_range_201706 (book_date); => CREATE INDEX CONCURRENTLY book_date_201707_idx ON bookings_range_201707 (book_date); => CREATE INDEX CONCURRENTLY book_date_201708_idx ON bookings_range_201708 (book_date);
рдЕрдм рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
=> ALTER INDEX book_date_idx ATTACH PARTITION book_date_201706_idx; => ALTER INDEX book_date_idx ATTACH PARTITION book_date_201707_idx; => ALTER INDEX book_date_idx ATTACH PARTITION book_date_201708_idx;
рдпрд╣ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред рдЬреИрд╕реЗ рд╣реА рд╕рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдЦрдВрдб рдЬреБрдбрд╝реЗ рд╣реЛрдВрдЧреЗ, рдореБрдЦреНрдп рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рджреЗрдЧрд╛:
=> SELECT indisvalid FROM pg_index WHERE indexrelid::regclass::text = 'book_date_idx';
indisvalid ------------ t (1 row)
рдХрдиреЗрдХреНрдЯ рдФрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдЕрдиреБрднрд╛рдЧ
рдЕрдиреБрднрд╛рдЧреЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд░реНрдорд╛рдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд┐рднрд╛рдЬрди рдХреБрдВрдЬреА рдХреЗ рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рдирдпрд╛ рдЦрдВрдб рдмрдирд╛рдПрдВрдЧреЗ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рд▓реЗрдирджреЗрди рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕реА рд╕рдордп рд╣рдо рддрд╛рд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ:
=> BEGIN; => SELECT count(*) FROM bookings_range WHERE book_date = to_timestamp('01.07.2017','DD.MM.YYYY');
count ------- 5 (1 row)
=> SELECT relation::regclass::text, mode FROM pg_locks WHERE pid = pg_backend_pid() AND relation::regclass::text LIKE 'bookings%';
relation | mode -----------------------+----------------- bookings_range_201708 | AccessShareLock bookings_range_201707 | AccessShareLock bookings_range_201706 | AccessShareLock bookings_range | AccessShareLock (4 rows)
AccessShareLock рд▓реЙрдХ рдореБрдЦреНрдп рдЯреЗрдмрд▓ рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрдпрд╛рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рддред To_timestamp рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдФрд░ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХрд╛ рдмрд╣рд┐рд╖реНрдХрд░рдг рдмрд╛рдж рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдмреБрдХрд┐рдВрдЧ_ рд╡реНрдпрд╡рд╕реНрдерд╛_201707 рдЕрдиреБрднрд╛рдЧ рд▓реЙрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ - рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ pg_locks рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд░реНрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдмрдврд╝ рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕рд╕реЗ рдЕрдзрд┐рдХрддрдо_locks_per_transaction рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдкрд┐рдЫрд▓реЗ рд▓реЗрдирджреЗрди рдХреЛ рдкреВрд░рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдПрдХ рдирдП рд╕рддреНрд░ рдореЗрдВ рд╕рд┐рддрдВрдмрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдПрдВ:
|| => CREATE TABLE bookings_range_201709 (LIKE bookings_range); || => BEGIN; || => ALTER TABLE bookings_range ATTACH PARTITION bookings_range_201709 FOR VALUES FROM ('2017-09-01'::timestamptz) TO ('2017-10-01'::timestamptz); || => SELECT relation::regclass::text, mode FROM pg_locks WHERE pid = pg_backend_pid() AND relation::regclass::text LIKE 'bookings%';
relation | mode -------------------------------------+-------------------------- bookings_range_201709_book_date_idx | AccessExclusiveLock bookings_range | ShareUpdateExclusiveLock bookings_range_201709 | ShareLock bookings_range_201709 | AccessExclusiveLock (4 rows)
рдПрдХ рдирдпрд╛ рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рддреЗ рд╕рдордп, ShareUpdateExclusiveLock рд▓реЙрдХ, AccessShareLock рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд, рдореБрдЦреНрдп рдЯреЗрдмрд▓ рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рднрд╛рдЬрди рдЬреЛрдбрд╝рдиреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
=> COMMIT;
|| => COMMIT;
рд╡рд┐рднрд╛рдЬрди рд╕рд╛рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рд╡рд┐рд╡рд░рдг рд╡рд┐рднрд╛рдЬрди рдЖрджреЗрд╢ред рдЕрдиреБрднрд╛рдЧ рд╕реНрд╡рдпрдВ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рддрд╛рд▓рд┐рдХрд╛ рдмрди рдЧрдИ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (ATTACH PARTITION)ред
рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк DROP рдЯреЗрдмрд▓ рдХрдорд╛рдВрдб рд╡рд╛рд▓реЗ рд╕реЗрдХреНрд╢рди рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк, рдбреАрдЖрд░рдУрдкреА рдЯреЗрдмрд▓ рдФрд░ рдбреАрдЯреИрдХ рдкрд╛рд░реНрдЯрд┐рд╢рди, рдореЗрди рдЯреЗрдмрд▓ рдкрд░ AccessExclusiveLock рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрднрд╛рдЧ
рдпрджрд┐ рдЖрдк рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрдВрдб рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рдпрджрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рдВрдЫрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрднрд╛рдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
=> CREATE TABLE bookings_range_default PARTITION OF bookings_range DEFAULT;
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд╕рд╣рд╕реНрд░рд╛рдмреНрджреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рддрд╛рд░реАрдЦ рдХреЛ рдорд┐рд▓рд╛рдпрд╛:
=> INSERT INTO bookings_range VALUES('XX0000', '0017-09-01'::timestamptz, 0) RETURNING tableoid::regclass, *;
tableoid | book_ref | book_date | total_amount ------------------------+----------+------------------------------+-------------- bookings_range_default | XX0000 | 0017-09-01 00:00:00+02:30:17 | 0.00 (1 row) INSERT 0 1
рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ (рд╡рд┐рднрд╛рдЬрди рдХреБрдВрдЬреА рдХреЛ рдмрджрд▓рдиреЗ) рдХреЗ рдмрд╛рдж, рд░рд┐рдХреЙрд░реНрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЯреНрд░рд┐рдЧрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
=> UPDATE bookings_range SET book_date = '2017-09-01'::timestamptz WHERE book_ref = 'XX0000' RETURNING tableoid::regclass, *;
tableoid | book_ref | book_date | total_amount -----------------------+----------+------------------------+-------------- bookings_range_201709 | XX0000 | 2017-09-01 00:00:00+03 | 0.00 (1 row) UPDATE 1
рдореВрд▓реНрдп рд╕реВрдЪреА рдЕрдиреБрднрд╛рдЧ
рдбреЗрдореЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, book_ref рдХреЙрд▓рдо рдмреБрдХрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪрдпрдирд┐рдд рд╡рд┐рднрд╛рдЬрди рдпреЛрдЬрдирд╛ рдРрд╕реА рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИ:
=> ALTER TABLE bookings_range ADD PRIMARY KEY(book_ref);
ERROR: insufficient columns in PRIMARY KEY constraint definition DETAIL: PRIMARY KEY constraint on table "bookings_range" lacks column "book_date" which is part of the partition key.
рд╡рд┐рднрд╛рдЬрди рдХреБрдВрдЬреА рдХреЛ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдорд╣реАрдиреЛрдВ рддрдХ рдЯреВрдЯрдиреЗ рдФрд░ рдЕрднреА рднреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдореЗрдВ book_ref рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмреБрдХрд┐рдВрдЧ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдпреЛрдЬрдирд╛ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд╛рдЬрди рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░рд░реНрдердХ рдХреЙрд▓рдо book_month рдЬреЛрдбрд╝реЗрдВ:
=> CREATE TABLE bookings_list ( book_ref character(6), book_month character(6), book_date timestamptz NOT NULL, total_amount numeric(10,2), PRIMARY KEY (book_ref, book_month) ) PARTITION BY LIST(book_month);
рд╣рдо рдмреБрдХрд┐рдВрдЧ рддрд╛рд▓рд┐рдХрд╛ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдПрдВрдЧреЗ:
=> WITH dates AS ( SELECT date_trunc('month',min(book_date)) min_date, date_trunc('month',max(book_date)) max_date FROM bookings ), partition AS ( SELECT to_char(g.month, 'YYYYMM') AS book_month FROM dates, generate_series(dates.min_date, dates.max_date, '1 month'::interval) AS g(month) ) SELECT format('CREATE TABLE %I PARTITION OF bookings_list FOR VALUES IN (%L)', 'bookings_list_' || partition.book_month, partition.book_month) FROM partition\gexec
CREATE TABLE CREATE TABLE CREATE TABLE
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:
=> \d+ bookings_list
Partitioned table "bookings.bookings_list" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------------+--------------------------+-----------+----------+---------+----------+--------------+------------- book_ref | character(6) | | not null | | extended | | book_month | character(6) | | not null | | extended | | book_date | timestamp with time zone | | not null | | plain | | total_amount | numeric(10,2) | | | | main | | Partition key: LIST (book_month) Indexes: "bookings_list_pkey" PRIMARY KEY, btree (book_ref, book_month) Partitions: bookings_list_201706 FOR VALUES IN ('201706'), bookings_list_201707 FOR VALUES IN ('201707'), bookings_list_201708 FOR VALUES IN ('201708')
рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рднрд░рдирд╛:
=> INSERT INTO bookings_list(book_ref,book_month,book_date,total_amount) SELECT book_ref,to_char(book_date, 'YYYYMM'),book_date,total_amount FROM bookings;
INSERT 0 262788
рдПрдХ рд╡рд╛рдкрд╕реА рдХреЗ рд░реВрдк рдореЗрдВред Book_month рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг 12 рдХреА рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛рд╡рдирд╛ рд╣реИ - рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдХреЙрд▓рдоред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдорд╣реАрдиреЗ рдХреЛ рднрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдкрд░ CHECK рдФрд░ NOT NULL рдЬреИрд╕реА рдЕрдЦрдВрдбрддрд╛ рдмрд╛рдзрд╛рдПрдВ рдЦрдбрд╝реА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде, INHERIT / NOINHERIT рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдмрдВрдз рд╕рднреА рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╡реЗрд╢:
=> ALTER TABLE bookings_range ALTER COLUMN book_date SET NOT NULL;
=> \d bookings_range
Partitioned table "bookings.bookings_range" Column | Type | Collation | Nullable | Default --------------+--------------------------+-----------+----------+--------- book_ref | character(6) | | | book_date | timestamp with time zone | | not null | total_amount | numeric(10,2) | | | Partition key: RANGE (book_date) Indexes: "book_date_idx" btree (book_date) Number of partitions: 5 (Use \d+ to list them.)
=> \d bookings_range_201706
Table "bookings.bookings_range_201706" Column | Type | Collation | Nullable | Default --------------+--------------------------+-----------+----------+--------- book_ref | character(6) | | | book_date | timestamp with time zone | | not null | total_amount | numeric(10,2) | | | Partition of: bookings_range FOR VALUES FROM ('2017-06-01 00:00:00+03') TO ('2017-07-01 00:00:00+03') Indexes: "book_date_201706_idx" btree (book_date)
рдПрдХ EXCLUDE рдмрд╛рдзрд╛ рдХреЗрд╡рд▓ рд╡рд┐рднрд╛рдЬрди рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред
Book_ref рдкрд░ рдПрдХ рдЦреЛрдЬ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХрд┐ book_ref рдкрд╣рд▓реЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИ:
=> EXPLAIN (COSTS OFF) SELECT * FROM bookings_list WHERE book_ref = '00000F';
QUERY PLAN -------------------------------------------------------------------------- Append -> Index Scan using bookings_list_201706_pkey on bookings_list_201706 Index Cond: (book_ref = '00000F'::bpchar) -> Index Scan using bookings_list_201707_pkey on bookings_list_201707 Index Cond: (book_ref = '00000F'::bpchar) -> Index Scan using bookings_list_201708_pkey on bookings_list_201708 Index Cond: (book_ref = '00000F'::bpchar) (7 rows)
Book_ref рдкрд░ рдПрдХ рдЦреЛрдЬ рдФрд░ рдХрдИ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реАрдорд╛ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
=> EXPLAIN (COSTS OFF) SELECT * FROM bookings_list WHERE book_ref = '00000F' AND book_month = '201707';
QUERY PLAN ----------------------------------------------------------------------------------- Index Scan using bookings_list_201707_pkey on bookings_list_201707 Index Cond: ((book_ref = '00000F'::bpchar) AND (book_month = '201707'::bpchar)) (2 rows)
INSERT ... ON CONFLICT рдХрдорд╛рдВрдб рд╕рд╣реА рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдЕрдиреБрднрд╛рдЧ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ:
=> INSERT INTO bookings_list VALUES ('XX0001','201708','2017-08-01',0) RETURNING tableoid::regclass, *;
tableoid | book_ref | book_month | book_date | total_amount ----------------------+----------+------------+------------------------+-------------- bookings_list_201708 | XX0001 | 201708 | 2017-08-01 00:00:00+03 | 0.00 (1 row) INSERT 0 1
=> INSERT INTO bookings_list VALUES ('XX0001','201708','2017-08-01',100) ON CONFLICT(book_ref,book_month) DO UPDATE SET total_amount = 100 RETURNING tableoid::regclass, *;
tableoid | book_ref | book_month | book_date | total_amount ----------------------+----------+------------+------------------------+-------------- bookings_list_201708 | XX0001 | 201708 | 2017-08-01 00:00:00+03 | 100.00 (1 row) INSERT 0 1
рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА
рдбреЗрдореЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рдЯрд┐рдХрдЯ рдЯреЗрдмрд▓ рдмреБрдХрд┐рдВрдЧ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрд▓рдо book_month рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЙрд╕реА рд╕рдордп рдЗрд╕реЗ рдорд╣реАрдиреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджреЗрдВ, рдЬреИрд╕реЗ рдмреБрдХрд┐рдВрдЧ_рд╕реВрдЪреАред
=> CREATE TABLE tickets_list ( ticket_no character(13), book_month character(6), book_ref character(6) NOT NULL, passenger_id varchar(20) NOT NULL, passenger_name text NOT NULL, contact_data jsonb, PRIMARY KEY (ticket_no, book_month), FOREIGN KEY (book_ref, book_month) REFERENCES bookings_list (book_ref, book_month) ) PARTITION BY LIST (book_month);
рдкреВрд░реНрд╡ рдкреНрд░рдореБрдЦ рдкреНрд░рддрд┐рдмрдВрдз рдПрдХ рдХрд░реАрдм рджреЗрдЦреЛ рд▓рд╛рдпрдХ рд╣реИред рдПрдХ рдУрд░, рдпрд╣ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ (рдЯрд┐рдХрдЯ_рд╕реВрдЪреА)
рд╕реЗ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА
рд╣реИ , рдФрд░ рджреВрд╕рд░реА рдУрд░, рдпрд╣ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ (рдмреБрдХрд┐рдВрдЧ_рд╕реВрдЪреА) рдХреА рдХреБрдВрдЬреА
рд╣реИ ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рднрд╛рдЬрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред
рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдПрдВ:
=> WITH dates AS ( SELECT date_trunc('month',min(book_date)) min_date, date_trunc('month',max(book_date)) max_date FROM bookings ), partition AS ( SELECT to_char(g.month, 'YYYYMM') AS book_month FROM dates, generate_series(dates.min_date, dates.max_date, '1 month'::interval) AS g(month) ) SELECT format('CREATE TABLE %I PARTITION OF tickets_list FOR VALUES IN (%L)', 'tickets_list_' || partition.book_month, partition.book_month) FROM partition\gexec
CREATE TABLE CREATE TABLE CREATE TABLE
=> \d+ tickets_list
Partitioned table "bookings.tickets_list" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ----------------+-----------------------+-----------+----------+---------+----------+--------------+------------- ticket_no | character(13) | | not null | | extended | | book_month | character(6) | | not null | | extended | | book_ref | character(6) | | not null | | extended | | passenger_id | character varying(20) | | not null | | extended | | passenger_name | text | | not null | | extended | | contact_data | jsonb | | | | extended | | Partition key: LIST (book_month) Indexes: "tickets_list_pkey" PRIMARY KEY, btree (ticket_no, book_month) Foreign-key constraints: "tickets_list_book_ref_book_month_fkey" FOREIGN KEY (book_ref, book_month) REFERENCES bookings_list(book_ref, book_month) Partitions: tickets_list_201706 FOR VALUES IN ('201706'), tickets_list_201707 FOR VALUES IN ('201707'), tickets_list_201708 FOR VALUES IN ('201708')
рд╣рдо рдЗрд╕рдореЗрдВ рднрд░рддреЗ рд╣реИрдВ:
=> INSERT INTO tickets_list (ticket_no,book_month,book_ref,passenger_id,passenger_name,contact_data) SELECT t.ticket_no,b.book_month,t.book_ref, t.passenger_id,t.passenger_name,t.contact_data FROM bookings_list b JOIN tickets t ON (b.book_ref = t.book_ref);
INSERT 0 366733
=> VACUUM ANALYZE tickets_list;
рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг:
=> SELECT tableoid::regclass, count(*) FROM tickets_list GROUP BY tableoid;
tableoid | count ---------------------+-------- tickets_list_201706 | 10160 tickets_list_201707 | 232755 tickets_list_201708 | 123818 (3 rows)
рдХрдиреЗрдХреНрд╢рди рдФрд░ рдПрдХрддреНрд░реАрдХрд░рдг рдЕрдиреБрд░реЛрдз
рдЙрд╕реА рддрд░рд╣ рд╡рд┐рднрд╛рдЬрд┐рдд рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ:
=> EXPLAIN (COSTS OFF) SELECT b.* FROM bookings_list b JOIN tickets_list t ON (b.book_ref = t.book_ref and b.book_month = t.book_month);
QUERY PLAN ---------------------------------------------------------------------------- Hash Join Hash Cond: ((t.book_ref = b.book_ref) AND (t.book_month = b.book_month)) -> Append -> Seq Scan on tickets_list_201706 t -> Seq Scan on tickets_list_201707 t_1 -> Seq Scan on tickets_list_201708 t_2 -> Hash -> Append -> Seq Scan on bookings_list_201706 b -> Seq Scan on bookings_list_201707 b_1 -> Seq Scan on bookings_list_201708 b_2 (11 rows)
рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд▓рд┐рдХрд╛ рдкрд╣рд▓реЗ рдЙрди рдЦрдВрдбреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдЬреЛ рдХреНрд╡реЗрд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЖрдк рдкрд╣рд▓реЗ рджреЛрдиреЛрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд╕рд┐рдХ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ enable_partitionwise_join рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
=> SET enable_partitionwise_join = ON; => EXPLAIN (COSTS OFF) SELECT b.* FROM bookings_list b JOIN tickets_list t ON (b.book_ref = t.book_ref and b.book_month = t.book_month);
QUERY PLAN ------------------------------------------------------------------------------------------ Append -> Hash Join Hash Cond: ((t.book_ref = b.book_ref) AND (t.book_month = b.book_month)) -> Seq Scan on tickets_list_201706 t -> Hash -> Seq Scan on bookings_list_201706 b -> Hash Join Hash Cond: ((t_1.book_ref = b_1.book_ref) AND (t_1.book_month = b_1.book_month)) -> Seq Scan on tickets_list_201707 t_1 -> Hash -> Seq Scan on bookings_list_201707 b_1 -> Hash Join Hash Cond: ((t_2.book_ref = b_2.book_ref) AND (t_2.book_month = b_2.book_month)) -> Seq Scan on tickets_list_201708 t_2 -> Hash -> Seq Scan on bookings_list_201708 b_2 (16 rows)
рдЕрдм, рдкрд╣рд▓реЗ, рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЬреЛрдбрд╝ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред
рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐:
=> EXPLAIN (COSTS OFF) SELECT count(*) FROM bookings_list;
QUERY PLAN ------------------------------------------------------------------- Finalize Aggregate -> Gather Workers Planned: 2 -> Partial Aggregate -> Parallel Append -> Parallel Seq Scan on bookings_list_201707 -> Parallel Seq Scan on bookings_list_201708 -> Parallel Seq Scan on bookings_list_201706 (8 rows)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдиреБрднрд╛рдЧ рд╕реНрдХреИрди рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЦрдВрдб рдПрдХ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдПрдХрддреНрд░реАрдХрд░рдг рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдПрдХрддреНрд░реАрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
=> SET enable_partitionwise_aggregate = ON; => EXPLAIN (COSTS OFF) SELECT count(*) FROM bookings_list;
QUERY PLAN ------------------------------------------------------------------- Finalize Aggregate -> Gather Workers Planned: 2 -> Parallel Append -> Partial Aggregate -> Parallel Seq Scan on bookings_list_201707 -> Partial Aggregate -> Parallel Seq Scan on bookings_list_201708 -> Partial Aggregate -> Parallel Seq Scan on bookings_list_201706 (10 rows)
рдпрджрд┐ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╣реИрдВ, рддреЛ рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рджреЛрдиреЛрдВ рдЕрдХреНрд╖рдо рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреБрдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдордп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣реИрд╢ рд╡рд┐рднрд╛рдЬрди
рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рддреАрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╣реИрд╢ рд╡рд┐рднрд╛рдЬрдиред
рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛:
=> CREATE TABLE bookings_hash ( book_ref character(6) PRIMARY KEY, book_date timestamptz NOT NULL, total_amount numeric(10,2) ) PARTITION BY HASH(book_ref);
рдПрдХ рд╡рд┐рднрд╛рдЬрди рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ book_ref рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЖрдк рддреБрд░рдВрдд рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддреАрди рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ:
=> CREATE TABLE bookings_hash_p0 PARTITION OF bookings_hash FOR VALUES WITH (MODULUS 3, REMAINDER 0); => CREATE TABLE bookings_hash_p1 PARTITION OF bookings_hash FOR VALUES WITH (MODULUS 3, REMAINDER 1); => CREATE TABLE bookings_hash_p2 PARTITION OF bookings_hash FOR VALUES WITH (MODULUS 3, REMAINDER 2);
рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рднрд░рдирд╛:
=> INSERT INTO bookings_hash SELECT * FROM bookings;
INSERT 0 262788
рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ:
=> SELECT tableoid::regclass AS partition, count(*) FROM bookings_hash GROUP BY tableoid;
partition | count ------------------+------- bookings_hash_p0 | 87649 bookings_hash_p1 | 87651 bookings_hash_p2 | 87488 (3 rows)
рд╡рд┐рднрд╛рдЬрди рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирдИ рдХрдорд╛рдВрдб:
=> \dP+
List of partitioned relations Schema | Name | Owner | Type | Table | Total size | Description ----------+--------------------+---------+-------------------+----------------+------------+------------- bookings | bookings_hash | student | partitioned table | | 13 MB | bookings | bookings_list | student | partitioned table | | 15 MB | bookings | bookings_range | student | partitioned table | | 13 MB | bookings | tickets_list | student | partitioned table | | 50 MB | bookings | book_date_idx | student | partitioned index | bookings_range | 5872 kB | bookings | bookings_hash_pkey | student | partitioned index | bookings_hash | 5800 kB | bookings | bookings_list_pkey | student | partitioned index | bookings_list | 8120 kB | bookings | tickets_list_pkey | student | partitioned index | tickets_list | 19 MB | (8 rows)
=> VACUUM ANALYZE bookings_hash;
рдЙрдкрд╢реНрд░реЗрдгреА рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдЬреБрдбрд╝рддреЗ рд╣реИрдВ
рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЕрдиреБрднрд╛рдЧ рдмрд╣рд┐рд╖реНрдХрд░рдг рд╕рдВрднрд╡ рд╣реИред
рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ 10 рдмреБрдХрд┐рдВрдЧ рдХрд╛ рд╡рд┐рддрд░рдг:
=> WITH top10 AS ( SELECT tableoid::regclass AS partition, * FROM bookings_hash ORDER BY book_ref LIMIT 10 ) SELECT partition, count(*) FROM top10 GROUP BY 1 ORDER BY 1;
partition | count ------------------+------- bookings_hash_p0 | 3 bookings_hash_p1 | 3 bookings_hash_p2 | 4 (3 rows)
рдЖрдЗрдП рдмреБрдХрд┐рдВрдЧ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЛ рдмреБрдХрд┐рдВрдЧ_рд╢рд╢ рд╕рд╛рд░рдгреА рдФрд░ рдкрд┐рдЫрд▓реА рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВ: => EXPLAIN (ANALYZE,COSTS OFF,TIMING OFF) WITH top10 AS ( SELECT tableoid::regclass AS partition, * FROM bookings ORDER BY book_ref LIMIT 10 ) SELECT bh.* FROM bookings_hash bh JOIN top10 ON bh.book_ref = top10.book_ref;
QUERY PLAN ----------------------------------------------------------------------------------------------------- Nested Loop (actual rows=10 loops=1) -> Limit (actual rows=10 loops=1) -> Index Only Scan using bookings_pkey on bookings (actual rows=10 loops=1) Heap Fetches: 0 -> Append (actual rows=1 loops=10) -> Index Scan using bookings_hash_p0_pkey on bookings_hash_p0 bh (actual rows=1 loops=3) Index Cond: (book_ref = bookings.book_ref) -> Index Scan using bookings_hash_p1_pkey on bookings_hash_p1 bh_1 (actual rows=1 loops=3) Index Cond: (book_ref = bookings.book_ref) -> Index Scan using bookings_hash_p2_pkey on bookings_hash_p2 bh_2 (actual rows=1 loops=4) Index Cond: (book_ref = bookings.book_ref) Planning Time: 0.632 ms Execution Time: 0.278 ms (13 rows)
рдХрдиреЗрдХреНрд╢рди рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдмрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╛рд╣рд░реА рд▓реВрдк рдХреЛ 10 рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЯреЗрдмрд▓-рд╕реЗрдХреНрд╢рди (рд▓реВрдк) рдкрд░ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдмрд╛рд╣рд░реА рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ book_ref рдорд╛рди рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╡рд╣ рдЦрдВрдб рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдорд╛рди bookings_hash рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдЕрдХреНрд╖рдо рдЕрдиреБрднрд╛рдЧ рдмрд╣рд┐рд╖реНрдХрд░рдг рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ: => SET enable_partition_pruning TO OFF; => EXPLAIN (ANALYZE,COSTS OFF,TIMING OFF) WITH top10 AS ( SELECT tableoid::regclass AS partition, * FROM bookings ORDER BY book_ref LIMIT 10 ) SELECT bh.* FROM bookings_hash bh JOIN top10 ON bh.book_ref = top10.book_ref;
QUERY PLAN ------------------------------------------------------------------------------------------------------ Nested Loop (actual rows=10 loops=1) -> Limit (actual rows=10 loops=1) -> Index Only Scan using bookings_pkey on bookings (actual rows=10 loops=1) Heap Fetches: 0 -> Append (actual rows=1 loops=10) -> Index Scan using bookings_hash_p0_pkey on bookings_hash_p0 bh (actual rows=0 loops=10) Index Cond: (book_ref = bookings.book_ref) -> Index Scan using bookings_hash_p1_pkey on bookings_hash_p1 bh_1 (actual rows=0 loops=10) Index Cond: (book_ref = bookings.book_ref) -> Index Scan using bookings_hash_p2_pkey on bookings_hash_p2 bh_2 (actual rows=0 loops=10) Index Cond: (book_ref = bookings.book_ref) Planning Time: 0.886 ms Execution Time: 0.771 ms (13 rows)
=> RESET enable_partition_pruning;
рдпрджрд┐ рдЖрдк рдПрдХ рдЖрд░рдХреНрд╖рдг рдореЗрдВ рдЪрдпрди рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рджреЛ рдЦрдВрдб рдмрд┐рд▓реНрдХреБрд▓ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗ: => EXPLAIN (ANALYZE,COSTS OFF,TIMING OFF) WITH top AS ( SELECT tableoid::regclass AS partition, * FROM bookings ORDER BY book_ref LIMIT 1 ) SELECT bh.* FROM bookings_hash bh JOIN top ON bh.book_ref = top.book_ref;
QUERY PLAN --------------------------------------------------------------------------------------------------- Nested Loop (actual rows=1 loops=1) -> Limit (actual rows=1 loops=1) -> Index Only Scan using bookings_pkey on bookings (actual rows=1 loops=1) Heap Fetches: 0 -> Append (actual rows=1 loops=1) -> Index Scan using bookings_hash_p0_pkey on bookings_hash_p0 bh (actual rows=1 loops=1) Index Cond: (book_ref = bookings.book_ref) -> Index Scan using bookings_hash_p1_pkey on bookings_hash_p1 bh_1 (never executed) Index Cond: (book_ref = bookings.book_ref) -> Index Scan using bookings_hash_p2_pkey on bookings_hash_p2 bh_2 (never executed) Index Cond: (book_ref = bookings.book_ref) Planning Time: 0.250 ms Execution Time: 0.090 ms (13 rows)
рдПрдХ рдЙрдкрд╢реНрд░реЗрдгреА рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗрдЯ рдХреА рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдЯ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: => CREATE OR REPLACE FUNCTION get_book_ref(top int) RETURNS SETOF bookings AS $$ BEGIN RETURN QUERY EXECUTE 'SELECT * FROM bookings ORDER BY book_ref LIMIT $1' USING top; END;$$ LANGUAGE plpgsql STABLE;
=> EXPLAIN (ANALYZE,COSTS OFF,TIMING OFF) SELECT * FROM bookings_hash bh JOIN get_book_ref(10) f ON bh.book_ref = f.book_ref;
QUERY PLAN ----------------------------------------------------------------------------------------------------- Nested Loop (actual rows=10 loops=1) -> Function Scan on get_book_ref f (actual rows=10 loops=1) -> Append (actual rows=1 loops=10) -> Index Scan using bookings_hash_p0_pkey on bookings_hash_p0 bh (actual rows=1 loops=3) Index Cond: (book_ref = f.book_ref) -> Index Scan using bookings_hash_p1_pkey on bookings_hash_p1 bh_1 (actual rows=1 loops=3) Index Cond: (book_ref = f.book_ref) -> Index Scan using bookings_hash_p2_pkey on bookings_hash_p2 bh_2 (actual rows=1 loops=4) Index Cond: (book_ref = f.book_ref) Planning Time: 0.175 ms Execution Time: 0.843 ms (11 rows)
рдкрд░рд┐рдгрд╛рдо
рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ PostgreSQL 12 рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдпрд╛ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореГрджреНрдз рд╕реЗрдЯ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред