рддреЗрдЬрд╝ POSTGRESQL COUNT (*)



рдЕрдХреНрд╕рд░ рдпрд╣ рд╢рд┐рдХрд╛рдпрдд рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ PostgreSQL рдореЗрдВ рдЧрд┐рдирддреА (*) рдмрд╣реБрдд рдзреАрдореА рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡рд┐рдХрд▓реНрдк рддрд▓рд╛рд╢рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓ рд╕рдХреЗред

рдЧрд┐рдирддреА (*) рдЗрддрдиреА рдзреАрдореА рдХреНрдпреЛрдВ рд╣реИ?


рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

SELECT count(*)
FROM /*   */;

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

рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЪреМрдВрдХ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрди рдХреНрд╡реЗрд░реА рдзреАрдореА рд╣реИ:

SELECT count(*) FROM large_table;

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдлрд┐рд░ рд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕рддреНрдп рд╣реИрдВ: PostgreSQL рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ "рдореИрдЬрд┐рдХ рд░реЛ рдХрд╛рдЙрдВрдЯрд░" рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИ (MyISAM MySQL рдХреЗ рд░реВрдк рдореЗрдВ), рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЧрд┐рдирдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдирд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЧрдгрдирд╛ (*) рдЖрдорддреМрд░ рдкрд░ рдЕрдиреБрдХреНрд░рдорд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рдлреА рдорд╣рдВрдЧрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ "*" рдЧрд┐рдирддреА рдореЗрдВ рд╣реИ (*) рдПрдХ рд╕рдорд╕реНрдпрд╛?


SELECT * FROM ... рдореЗрдВ "*" рд╕рднреА рдХреЙрд▓рдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрдИ рд▓реЛрдЧ рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЧрд┐рдирддреА (*) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдХреНрд╖рдо рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЧрд┐рдирддреА (рдЖрдИрдбреА) рдпрд╛ рдЧрд┐рдирддреА (1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд▓реЗрдХрд┐рди рдЧрд┐рдирддреА рдореЗрдВ "*" (*) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рдХрд╛ рд╕реАрдзрд╛ рдорддрд▓рдм рд╣реИ "рд╕реНрдЯреНрд░рд┐рдВрдЧ" рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ "рдПрдХ рдЕрд╢рдХреНрдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде" рд╣реИ)ред рдиреЛрдЯреЗрд╢рди рдХрд╛рдЙрдВрдЯ (1) рдпрд╛ рдХрд╛рдЙрдВрдЯ (рдЖрдИрдбреА) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдЙрдВрдЯ (*) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рддрд░реНрдХ NULL рд╣реИ рдпрд╛ рдирд╣реАрдВ (рдХрд╛рдЙрдВрдЯ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдЧреНрд░реАрдЧреЗрдЯреНрд╕ рдХреА рддрд░рд╣, рддрд░реНрдХ NULL рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ)ред

рддреЛ рдЖрдк "*" рд╕реЗ рдмрдЪрдХрд░ рдХреБрдЫ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕реНрдХреИрди


рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдкреВрд░реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдирд╣реАрдВ, рдПрдХ рдЫреЛрдЯреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рд▓рд▓рдЪрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдмрд╣реБ-рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдкреНрд░рдмрдВрдзрди рд░рдгрдиреАрддрд┐ рдХреЗ рдХрд╛рд░рдг PostgreSQL рдореЗрдВ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдкрдВрдХреНрддрд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг ("рдЯрдкрд▓") рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ ред рд▓реЗрдХрд┐рди рдпрд╣ (рдирд┐рд░рд░реНрдердХ) рдЬрд╛рдирдХрд╛рд░реА рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ ("рд╣реАрдк рдЯрдкрд▓") рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PostgreSQL рдиреЗ рдПрдХ рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ , рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЯреЗрдмрд▓ рдмреНрд▓реЙрдХ рдХреЗ рд╕рднреА рдЯреНрдпреВрдкрд▓реНрд╕ рд╕рднреА рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреНрд▓реЙрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рджреГрд╢реНрдпрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рдХреЛ рдЕрдХреНрд╕рд░ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рдХреЛ "рдЗрдВрдбреЗрдХреНрд╕ рдУрдирд▓реА рд╕реНрдХреИрди" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЧрд┐рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рддреЗрдЬ рд╣реЛрддрд╛ рд╣реИред

рдЕрдм рдпрд╣ VACUUM рд╣реИ рдЬреЛ рджреГрд╢реНрдпрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдЧрд┐рдирддреА (*) рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдСрдЯреЛрд╡реИрдХреНрдпреВрдо рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдзреБрд░реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ PostgreSQL рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдЧрдгрдирд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдПрдХ рдмрдбрд╝рд╛ рдУрд╡рд░рд╣реЗрдб рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдШрдЯрдирд╛ рд╣рд░ рдбреЗрдЯрд╛ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИ рдФрд░ рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╕реМрджрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрд░реЛрдз рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рднреА рд╕рдВрд╕реНрдХрд░рдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдХрд┐рд╕реА рд▓рд╛рдЗрдПрдмреЗрдЯ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

START TRANSACTION;
 
CREATE TABLE mytable_count(c bigint);
 
CREATE FUNCTION mytable_count() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   IF TG_OP = 'INSERT' THEN
      UPDATE mytable_count SET c = c + 1;
 
      RETURN NEW;
   ELSIF TG_OP = 'DELETE' THEN
      UPDATE mytable_count SET c = c - 1;
 
      RETURN OLD;
   ELSE
      UPDATE mytable_count SET c = 0;
 
      RETURN NULL;
   END IF;
END;$$;
 
CREATE CONSTRAINT TRIGGER mytable_count_mod
   AFTER INSERT OR DELETE ON mytable
   DEFERRABLE INITIALLY DEFERRED
   FOR EACH ROW EXECUTE PROCEDURE mytable_count();
 
-- TRUNCATE triggers must be FOR EACH STATEMENT
CREATE TRIGGER mytable_count_trunc AFTER TRUNCATE ON mytable
   FOR EACH STATEMENT EXECUTE PROCEDURE mytable_count();
 
-- initialize the counter table
INSERT INTO mytable_count
   SELECT count(*) FROM mytable;
 
COMMIT;

рд╣рдо рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдорд╡рд░реНрддреА рд▓реЗрдирджреЗрди рдкрд░ рдХреЛрдИ рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд░рд┐рдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг "рдЦреЛ" рди рдЬрд╛рдПред
рдпрд╣ CREATE TRIGGER рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ SHARE ROW EXCLUSIVE рдореЛрдб рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдЬреЛ рд╕рднреА рд╕рдорд╛рдирд╛рдВрддрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╕реЗрд▓реЗрдХреНрдЯ рдХрд╛рдЙрдВрдЯ (*) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рддрдХ рд╕рднреА рд╕рдорд╛рдирд╛рдВрддрд░ рдбреЗрдЯрд╛ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕ рдХрд╛рдЙрдВрдЯрд░ рдЯреЗрдмрд▓ рдХреЛ рдХрдИ рдЕрдкрдбреЗрдЯ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдИ рдЦрддрд░рд╛ рдирд╣реАрдВ рд╣реИрдХреЛрдИ "рдЯреЗрдмрд▓ рдХрд╛ рдлреВрд▓рд╛ рд╣реБрдЖ" рдирд╣реАрдВ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╕рднреА "рд╣реЙрдЯ" рдЕрдкрдбреЗрдЯ (HOT рдЕрдкрдбреЗрдЯ) рд╣реЛрдВрдЧреЗред

рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд┐рдирддреА (*) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


рдХрднреА-рдХрднреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд▓рд╛рд╢ рд╣реИред

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

SELECT reltuples::bigint
FROM pg_catalog.pg_class
WHERE relname = 'mytable';

рдпрд╣ рдорд╛рди рдСрдЯреЛрд╡реИрдХреНрдпреБрдо рдФрд░ рдСрдЯреЛрдПрдирд▓реАрдЬрд╝ рджреЛрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрднреА рднреА 10% рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП autovacuum_analyze_scale_factor рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕реНрд╡рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╡рд╣рд╛рдВ рдЪрд▓реЗред

рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛


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

рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕реЗрд▓реЗрдХреНрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд┐рддрдиреЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред

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

рдирд┐рдореНрди рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдбрд╛рдпрдиреЗрдорд┐рдХ SQL рдФрд░ EXPLAIN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдПрдХ рдЕрдиреБрдорд╛рди рджреЗрддрд╛ рд╣реИ:

CREATE FUNCTION row_estimator(query text) RETURNS bigint
   LANGUAGE plpgsql AS
$$DECLARE
   plan jsonb;
BEGIN
   EXECUTE 'EXPLAIN (FORMAT JSON) ' || query INTO plan;
 
   RETURN (plan->0->'Plan'->>'Plan Rows')::bigint;
END;$$;

рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ SQL рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

All Articles