PostgreSQL 9 рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд╕рдордЭрдирд╛

PostgreSQL 10 рдХреЛ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЕрдХреНрдЯреВрдмрд░ 2017 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдирдИ "рд╕реБрд╡рд┐рдзрд╛рдУрдВ" рдореЗрдВ рд╕реЗ рдПрдХ рдмрд┐рдирд╛ рд╢рд░реНрдд рдШреЛрд╖рд┐рдд рд╡рд┐рднрд╛рдЬрди рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк 10k рдкрд░ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдореЗрдЬрд╝реЕрди рдХреЛрдИ рдЬрд▓реНрджреА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдлрд░рд╡рд░реА 2018 рдХреЗ рдЕрдВрддрд┐рдо рджрд┐рдиреЛрдВ рдореЗрдВ рд╣реА рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ 10 рд╕рдорд░реНрдерди рдкреЗрд╢ рдХрд┐рдпрд╛ ред

рдлрд┐рд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ рд╡рд┐рднрд╛рдЬрди рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЯреИрдХреНрд╕реА рдХрдВрдкрдиреА рдореЗрдВ рд╡рд┐рддреНрдд рд╡рд┐рднрд╛рдЧ рдХрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдВ рдпрд╛рддреНрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдВрдЧреЗ (рд╣рдо рджреВрд╕рд░реА рдмрд╛рд░ рдзрди рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ)ред

рдЪреВрдВрдХрд┐ рд╣рдордиреЗ 2015 рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рддреНрддреАрдп рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдЬрдм рдореИрдВ рдмрд╕ рдХрдВрдкрдиреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдпрд╛, рддреЛ рдХрд┐рд╕реА рднреА рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд┐рднрд╛рдЬрди рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реБрдИред рдЗрд╕рд▓рд┐рдП рдЖрдЬ рддрдХ, рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХ рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдореВрд▓ рдХрд╛рд░рдг рдпрд╣ рдерд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдореБрдЭреЗ рдЖрдП рдереЗ, рд╡реЗ рдмрд╣реБрдд рдмреБрдирд┐рдпрд╛рджреА рдереЗред рдпрд╣рд╛рдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдПрдХ рд╕реНрддрдВрдн рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдЕрдкрдирд╛ рд╕рдорд╛рдпреЛрдЬрди рдЦреБрдж рдХрд░рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджреЛ рдХреЙрд▓рдореЛрдВ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдпрд╛рддреНрд░рд╛ рдХреА рддрд╛рд░реАрдЦреЗрдВ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЖрдЗрдП рд╢реБрд░реВ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:

create table rides ( id bigserial not null primary key, tenant_id varchar(20) not null, ride_id varchar(36) not null, created_at timestamp with time zone not null, metadata jsonb -- Probably more columns and indexes coming here ); 

рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рд░рд╛рдпреЗрджрд╛рд░ рдХреЗ рд▓рд┐рдП, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рддрд┐ рдорд╛рд╣ рд▓рд╛рдЦреЛрдВ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрд┐рд░рд╛рдпреЗрджрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдбреЗрдЯрд╛ рдХрднреА рднреА рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдХрдард┐рди рдЕрдиреБрд░реЛрдз рдПрдХ рдпрд╛ рджреЛ рдорд╣реАрдиреЗ рдХреЗ рдХрдЯреМрддреА рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реАрдХреНрдпреВ рд╡рд┐рднрд╛рдЬрди рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ (рдУрд░реЗрдХрд▓, рд╣реИрд▓реЛ! рд╕реЗ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА!), рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

PostgreSQL рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рджреЛ "рдлреАрдЪрд░реНрд╕" рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдЯреЗрдмрд▓, рдЯреЗрдмрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕, рдФрд░ рдЪреЗрдХ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред

рдЪрд▓реЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред INHERITS рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИред рдпрд╣ рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдмрдВрдз рднреА рдмрдирд╛рддрд╛ рд╣реИ: рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдПрдХ рдХреНрд╡реЗрд░реА рдмрдирд╛рддреЗ рд╣реБрдП, рд╣рдо рдмрдЪреНрдЪреЛрдВ рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, PostgreSQL рдЕрдиреБрдХреВрд▓рдХ рдХреНрд╡реЗрд░реА рд╕реЗ рдбреЗрдЯрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдХреЗ рдмрдЪреНрдЪреЗ рдХреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдХрд╛рдЯ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд╣рд▓рд╛ рдиреБрдХрд╕рд╛рди рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: рдХрд┐рд╕реА рднреА рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХрд┐рд░рд╛рдпреЗрджрд╛рд░_рд┐рдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдлрд┐рд░ рднреА, рдпрджрд┐ рдЖрдк рд▓рдЧрд╛рддрд╛рд░ рдЦреБрдж рдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдпрд╛рдж рдирд╣реАрдВ рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЖрдк рдЦреБрдж рдХрд╕реНрдЯрдо SQL рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЗрд╕ tenant_id рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рд╕рднреА рд╡рд┐рднрд╛рдЬрдиреЛрдВ рдХрд╛ рд╕реНрдХреИрди рдФрд░ рдПрдХ рдЧреИрд░-рдХрд╛рд░реНрдпрд╢реАрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ред

рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рдЬреЛ рд╣рдо рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрд╡реЗрджрди рд╕реНрддрд░ рдкрд░, рдореИрдВ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ - рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдЪреБрдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдПред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 CREATE OR REPLACE FUNCTION insert_row() RETURNS TRIGGER AS $BODY$ DECLARE partition_env TEXT; partition_date TIMESTAMP; partition_name TEXT; sql TEXT; BEGIN -- construct partition name partition_env := lower(NEW.tenant_id); partition_date := date_trunc('month', NEW.created_at AT TIME ZONE 'UTC'); partition_name := format('%s_%s_%s', TG_TABLE_NAME, partition_env, to_char(partition_date, 'YYYY_MM')); -- create partition, if necessary IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname = partition_name) THEN PERFORM create_new_partition(TG_TABLE_NAME, NEW.tenant_id, partition_date, partition_name); END IF; select format('INSERT INTO %s values ($1.*)', partition_name) into sql; -- Propagate insert EXECUTE sql USING NEW; RETURN NEW; -- RETURN NULL; if no ORM END; $BODY$ LANGUAGE plpgsql; 

рдкрд╣рд▓реА рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ TG_TABLE_NAME рдХрд╛ рдЙрдкрдпреЛрдЧред рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдЯреНрд░рд┐рдЧрд░ рд╣реИ, PostgreSQL рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдХреБрдЫ рд╡реИрд░рд┐рдПрдмрд▓ рднрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреВрд░реА рд╕реВрдЪреА рдпрд╣рд╛рдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ ред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рд╡рд╛рд░реА рд╣реЛрдЧреАред рд╣рдо рдХрдИ microservices рдореЗрдВ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ PERFORM рдЙрдкрдпреЛрдЧреА рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╡реЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

USING NEW рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХреНрд╡реЗрд░реА рдореЗрдВ рд╣рдо рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереАред

$1.* рд╕рднреА рдиреНрдпреВрд▓рд╛рдЗрди рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж NEW.* рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ NEW.* ред NEW.ID, NEW.TENANT_ID, тАж

рдирд┐рдореНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЬрд┐рд╕реЗ рд╣рдо PERFORM рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рдирдпрд╛ рд╡рд┐рднрд╛рдЬрди рдмрдирд╛рдПрдЧреА, рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рд░рд╛рдпреЗрджрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдЕрд╡рдзрд┐ рдПрдХ рдмрд╛рд░ рд╣реЛрдЧрд╛ред

 CREATE OR REPLACE FUNCTION create_new_partition(parent_table_name text, env text, partition_date timestamp, partition_name text) RETURNS VOID AS $BODY$ DECLARE sql text; BEGIN -- Notifying RAISE NOTICE 'A new % partition will be created: %', parent_table_name, partition_name; select format('CREATE TABLE IF NOT EXISTS %s (CHECK ( tenant_id = ''%s'' AND created_at AT TIME ZONE ''UTC'' > ''%s'' AND created_at AT TIME ZONE ''UTC'' <= ''%s'')) INHERITS (%I)', partition_name, env, partition_date, partition_date + interval '1 month', parent_table_name) into sql; -- New table, inherited from a master one EXECUTE sql; PERFORM index_partition(partition_name); END; $BODY$ LANGUAGE plpgsql; 

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рдорд╛рди рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП INHERITS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

RAISE NOTICE рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЕрдм PsSl рд╕реЗ INSERT рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рднрд╛рдЬрди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╣рдореЗрдВ рдПрдХ рдирдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдУрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ INHERITS рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:

рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрдирд╛рдПрдБ:
ALTER TABLE INHERITS CREATE TABLE LIKE рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ ALTER TABLE INHERITS

рдпрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрдирд╛рдПрдБ:

 CREATE OR REPLACE FUNCTION index_partition(partition_name text) RETURNS VOID AS $BODY$ BEGIN -- Ensure we have all the necessary indices in this partition; EXECUTE 'CREATE INDEX IF NOT EXISTS ' || partition_name || '_tenant_timezone_idx ON ' || partition_name || ' (tenant_id, timezone(''UTC''::text, created_at))'; -- More indexes here... END; $BODY$ LANGUAGE plpgsql; 

рдмрд╛рд▓ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд╛рдЬрди рдХреЗ рдмрд╛рдж рднреА, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд▓рд╛рдЦреЛрдВ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреАред рдорд╛рддрд╛-рдкрд┐рддрд╛ рдкрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣рдореЗрд╢рд╛ рдЦрд╛рд▓реА рд░рд╣реЗрдВрдЧреЗред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рддрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдПрдХ рдирдИ рд▓рд╛рдЗрди рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА:

 CREATE TRIGGER before_insert_row_trigger BEFORE INSERT ON rides FOR EACH ROW EXECUTE PROCEDURE insert_row(); 

рдПрдХ рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рднрд╛рдЬрди рдЙрди рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛ рдХрднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдпрд╛рддреНрд░рд╛ рдХрднреА рднреА рдХрд┐рд░рд╛рдпреЗрджрд╛рд░_ рдирд╣реАрдВ рдмрджрд▓рддреА рдФрд░ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рддреЛ PostreSQL рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╣рдордиреЗ рдЙрд╕рдХреЗ рдмрд╛рдж CHECK рд╕реЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╕рднреА рдбреЗрдЯрд╛ рд╡реИрдз рд╣реИред

рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ (рд╕реНрдкрд╖реНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдореНрдпреВрдЯ рди рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд┐рднрд╛рдЬрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ):

UPDATE рдмрдЬрд╛рдп UPDATE рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрддрд░ рдкрд░ DELETE+INSERT рдХрд░рддреЗ рд╣реИрдВ
рд╣рдо UPDATE рдкрд░ рдПрдХ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реА рд╡рд┐рднрд╛рдЬрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛

рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдПрдХ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ рдХрд┐ рдХреИрд╕реЗ рддрд╛рд░реАрдЦреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрджрд┐ рд╣рдо рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ AT TIME ZONE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдХрд╛рд░реНрдп рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рднреВрд▓ рдЧрдпрд╛ред рдирддреАрдЬрддрди, рдЖрдзрд╛рд░ рд▓реЛрдб рд╕реЗ рдлрд┐рд░ рд╕реЗ рдорд░ рдЪреБрдХрд╛ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдкрд╣рд▓реВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╡рд┐рднрд╛рдЬрди рд╡рд┐рднрд┐рдиреНрди рдУрдЖрд░рдПрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рд░реВрдмреА рдореЗрдВ рдПрдХреНрдЯрд┐рд╡рд░реЙрд░реНрдб рд╣реЛ рдпрд╛ рдЧреЛ рдореЗрдВ рдЬреАрдУрдЖрд░рдПрдоред

PostgreSQL рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдЗрд╕ рддрдереНрдп рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рд╣рдореЗрд╢рд╛ рдЦрд╛рд▓реА рд░рд╣реЗрдЧреАред рдпрджрд┐ рдЖрдк ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ RETURN NEW рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ; RETURN NULL рдкрд░ ;; рддрдм рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐ рдмрд╕ рдирд╣реАрдВ рдЬреЛрдбрд╝реА рдЬрд╛рдПрдЧреА, рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ ORMs INSERT рдХреЗ рд╕рд╛рде RETURNING рдХреНрд▓реЙрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо NULL рдХреЛ рдЕрдкрдиреЗ рдЯреНрд░рд┐рдЧрд░ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ ORM рдШрдмрд░рд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдкрдВрдХреНрддрд┐ рдХреЛ рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд╣реАрдВ рдЬрд╣рд╛рдВ ORM рд▓рдЧ рд░рд╣реА рд╣реИред

рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:

  • ORSERT рдХреЗ рд▓рд┐рдП ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
  • рдкреИрдЪ ORM (рдЬрд┐рд╕реЗ рдХрднреА-рдХрднреА ActiveRecord рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ)
  • рдПрдХ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдкреИрд░реЗрдВрдЯ рд╕реЗ рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред

рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдо рддреАрди рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рднреА, рдпрд╣ рдХрднреА-рдХрднреА рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:

 CREATE OR REPLACE FUNCTION delete_parent_row() RETURNS TRIGGER AS $BODY$ DECLARE BEGIN delete from only rides where id = NEW.ID; RETURN null; END; $BODY$ LANGUAGE plpgsql; 

 CREATE TRIGGER after_insert_row_trigger AFTER INSERT ON rides FOR EACH ROW EXECUTE PROCEDURE delete_parent_row(); 

рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рд╡рд╣ рд╣реИ рд╣рдорд╛рд░реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдгред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ:

 DO $script$ DECLARE year_start_epoch bigint := extract(epoch from '20170101'::timestamptz at time zone 'UTC'); delta bigint := extract(epoch from '20171231 23:59:59'::timestamptz at time zone 'UTC') - year_start_epoch; tenant varchar; tenants varchar[] := array['tenant_a', 'tenant_b', 'tenant_c', 'tenant_d']; BEGIN FOREACH tenant IN ARRAY tenants LOOP FOR i IN 1..100000 LOOP insert into rides (tenant_id, created_at, ride_id) values (tenant, to_timestamp(random() * delta + year_start_epoch) at time zone 'UTC', i); END LOOP; END LOOP; END $script$; 

рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:

 explain select * from rides where tenant_id = 'tenant_a' and created_at AT TIME ZONE 'UTC' > '20171102' and created_at AT TIME ZONE 'UTC' <= '20171103'; 

рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реБрдЖ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

  Append (cost=0.00..4803.76 rows=4 width=196) -> Seq Scan on rides (cost=0.00..4795.46 rows=3 width=196) Filter: (((created_at)::timestamp without time zone > '2017-11-02 00:00:00'::timestamp without time zone) AND ((created_at)::timestamp without time zone <= '2017-11-03 00:00:00'::timestamp without time zone) AND ((tenant_id)::text = 'tenant_a'::text)) -> Index Scan using rides_tenant_a_2017_11_tenant_timezone_idx on rides_tenant_a_2017_11 (cost=0.28..8.30 rows=1 width=196) Index Cond: (((tenant_id)::text = 'tenant_a'::text) AND ((created_at)::timestamp without time zone > '2017-11-02 00:00:00'::timestamp without time zone) AND ((created_at)::timestamp without time zone <= '2017-11-03 00:00:00'::timestamp without time zone)) (5 rows) 

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рд░рд╛рдпреЗрджрд╛рд░ рдХреЗ рдкрд╛рд╕ рд╕реИрдХрдбрд╝реЛрдВ рд╣рдЬрд╛рд░реЛрдВ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рдбреЗрдЯрд╛ рд╕реНрд▓рд╛рдЗрд╕ рд╕реЗ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рд╕рдлрд▓рддрд╛!

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ рдЬреЛ рдЕрднреА рддрдХ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рдереЗ рдХрд┐ рд╡рд┐рднрд╛рдЬрди рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рд╖рдп рдЕрдм рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЯреНрд░рд┐рдХреНрд╕ рд╕реАрдЦреЗред

рдпреБрдкреАрдбреА:
рдЬреИрд╕рд╛ рдХрд┐ bigtrot рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдЧрд░ CONSTRAINT_EXCLUSION рд╕реЗрдЯрд┐рдВрдЧ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдпрд╣ рд╕рдм рд╕рдбрд╝рдХ рдХрд╛ рдЬрд╛рджреВ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред

рдЖрдк рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 show CONSTRAINT_EXCLUSION 


рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рддреАрди рдореВрд▓реНрдп рд╣реИрдВ: рдСрди, рдСрдл рдФрд░ рдкрд╛рд░реНрдЯреАрд╢рди

рдпрджрд┐ рдЖрдк рдЕрдЪрд╛рдирдХ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдбреЗрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рднреА рд╡рд┐рднрд╛рдЬрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╡рд┐рднрд╛рдЬрди рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рд╣реИред

Source: https://habr.com/ru/post/hi422753/


All Articles