рдПрдХ SQL рдЕрдиреБрд╕рдиреНрдзрд╛рди рдХреЛ рдХрдерд╛

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

рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕

рдо рдХреЗ рдХреБрд░рд╛ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫреБ рднрдиреЗрд░ рд╕реНрдкрд╖реНрдЯ рдкрд╛рд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ VWO рдХреЛ рдмрд╛рд░реЗрдорд╛ рдереЛрд░реИ рдмрддрд╛рдЙрдиреЗрдЫреБред рдпреЛ рдПрдХ рдкреНрд▓реЗрдЯрдлрд░реНрдо рд╣реЛ рдЬрд╕рдХреЛ рд╕рд╛рде рддрдкрд╛рдИрдВ рдЖрдлреНрдиреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯрд╣рд░реВрдорд╛ рд╡рд┐рднрд┐рдиреНрди рд▓рдХреНрд╖рд┐рдд рдЕрднрд┐рдпрд╛рдирд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: A/B рдкреНрд░рдпреЛрдЧрд╣рд░реВ рд╕рдЮреНрдЪрд╛рд▓рди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЖрдЧрдиреНрддреБрдХрд╣рд░реВ рд░ рд░реВрдкрд╛рдиреНрддрд░рдгрд╣рд░реВ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдмрд┐рдХреНрд░реА рдлрдиреЗрд▓рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН, рддрд╛рдк рдирдХреНрд╕рд╛рд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рднреНрд░рдордг рд░реЗрдХрд░реНрдбрд┐рдЩрд╣рд░реВ рдкреНрд▓реЗ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рддрд░ рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рдмрд╛рд░реЗрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХреБрд░рд╛ рд░рд┐рдкреЛрд░реНрдЯрд┐рдЩ рд╣реЛред рдорд╛рдерд┐рдХрд╛ рд╕рдмреИ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдЖрдкрд╕рдорд╛ рдЬреЛрдбрд┐рдПрдХрд╛ рдЫрдиреНред рд░ рдХрд░реНрдкреЛрд░реЗрдЯ рдХреНрд▓рд╛рдЗрдиреНрдЯрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐, рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдареВрд▓реЛ рдорд╛рддреНрд░рд╛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд▓реЗрдЯрдлрд░реНрдо рдмрд┐рдирд╛ рдмреЗрдХрд╛рд░ рд╣реБрдиреЗрдЫ рдЬрд╕рд▓реЗ рдпрд╕рд▓рд╛рдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд░реВрдкрдорд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрджрдЫред

рдкреНрд▓реЗрдЯрдлрд░реНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рддрдкрд╛рдИрдВ рдареВрд▓реЛ рдбреЗрдЯрд╛ рд╕реЗрдЯрдорд╛ рдЕрдирд┐рдпрдорд┐рдд рдХреНрд╡реЗрд░реА рдмрдирд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрд╣рд╛рдБ рдПрдЙрдЯрд╛ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реЛ:

рдкреГрд╖реНрда "abc.com" рдорд╛ рд╕рдмреИ рдХреНрд▓рд┐рдХрд╣рд░реВ рджреЗрдЦрд╛рдЙрдиреБрд╣реЛрд╕реН <date d1> TO <date d2> Chrome рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд╡рд╛ (рдпреБрд░реЛрдкрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рд░ iPhone рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ) рдХреЛ рд▓рд╛рдЧрд┐ред

рдмреБрд▓рд┐рдпрди рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реНред рддрд┐рдиреАрд╣рд░реВ рдирдореВрдирд╛рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдордирдорд╛рдирд╛ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдирд╣рд░реВ рдЧрд░реНрди рдХреНрд╡реЗрд░реА рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрд▓рд╛рдИ рдЙрдкрд▓рдмреНрдз рдЫрдиреНред

рдврд┐рд▓реЛ рдЕрдиреБрд░реЛрдз

рдкреНрд░рд╢реНрдирдорд╛ рдЧреНрд░рд╛рд╣рдХрд▓реЗ рдХреЗрд╣рд┐ рдЧрд░реНрди рдХреЛрд╢рд┐рд╕ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдерд┐рдпреЛ рдЬреБрди рд╕рд╣рдЬ рд░реВрдкрдорд╛ рдЫрд┐рдЯреЛ рдХрд╛рдо рдЧрд░реНрдиреБрдкрд░реНрдЫ:

"/jobs" рднрдПрдХреЛ URL рдХреЛ рд╕рд╛рде рдХреБрдиреИ рдкрдирд┐ рдкреГрд╖реНрда рднреНрд░рдордг рдЧрд░реНрдиреЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рд╕рддреНрд░ рд░реЗрдХрд░реНрдбрд╣рд░реВ рджреЗрдЦрд╛рдЙрдиреБрд╣реЛрд╕реНред

рдпреЛ рд╕рд╛рдЗрдЯрдорд╛ рдПрдХ рдЯрди рдЯреНрд░рд╛рдлрд┐рдХ рдерд┐рдпреЛ рд░ рд╣рд╛рдореАрд▓реЗ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдПрдХ рд▓рд╛рдЦ рднрдиреНрджрд╛ рдмрдвреА рдЕрджреНрд╡рд┐рддреАрдп URL рд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рд░рд╣реЗрдХрд╛ рдерд┐рдпреМрдВред рд░ рддрд┐рдиреАрд╣рд░реВ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╡реНрдпрд╛рдкрд╛рд░ рдореЛрдбреЗрд▓рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдПрдХрджрдо рд╕рд░рд▓ URL рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЪрд╛рд╣рдиреНрдереЗред

рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рдЫрд╛рдирдмрд┐рди

рдбреЗрдЯрд╛рдмреЗрд╕рдорд╛ рдХреЗ рднрдЗрд░рд╣реЗрдХреЛ рдЫ рднрдиреЗрд░ рд╣реЗрд░реМрдВред рддрд▓ рдореВрд▓ рдврд┐рд▓реЛ SQL рдХреНрд╡реЗрд░реА рдЫ:

SELECT 
    count(*) 
FROM 
    acc_{account_id}.urls as recordings_urls, 
    acc_{account_id}.recording_data as recording_data, 
    acc_{account_id}.sessions as sessions 
WHERE 
    recording_data.usp_id = sessions.usp_id 
    AND sessions.referrer_id = recordings_urls.id 
    AND  (  urls &&  array(select id from acc_{account_id}.urls where url  ILIKE  '%enterprise_customer.com/jobs%')::text[]   ) 
    AND r_time > to_timestamp(1542585600) 
    AND r_time < to_timestamp(1545177599) 
    AND recording_data.duration >=5 
    AND recording_data.num_of_pages > 0 ;

рд░ рдпрд╣рд╛рдБ рд╕рдордпрд╣рд░реВ рдЫрдиреН:

рдпреЛрдЬрдирд╛рдмрджреНрдз рд╕рдордп: 1.480 ms рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдордп: 1431924.650 ms

рдХреНрд╡реЗрд░реА 150 рд╣рдЬрд╛рд░ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рдХреНрд░рд▓ рдЧрд░рд┐рдпреЛред рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рдХрд╛рд░рд▓реЗ рдХреЗрд╣реА рд░реЛрдЪрдХ рд╡рд┐рд╡рд░рдгрд╣рд░реВ рджреЗрдЦрд╛рдП, рддрд░ рдХреБрдиреИ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдзрд╛рд╣рд░реВ рдЫреИрдирдиреНред

рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ рдердк рдЕрдзреНрдпрдпрди рдЧрд░реМрдВред рддрдкрд╛рдИрдВрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЙрд╣рд╛рдБрд▓реЗ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ JOIN рддреАрди рдЯреЗрдмрд▓:

  1. рд╕рддреНрд░: рд╕рддреНрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди: рдмреНрд░рд╛рдЙрдЬрд░, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдиреНрдЯ, рджреЗрд╢, рд░ рдпрддрд┐ред
  2. рд░реЗрдХрд░реНрдбрд┐рдЩ_рдбреЗрдЯрд╛: рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХрд╛ URL рд╣рд░реВ, рдкреГрд╖реНрдард╣рд░реВ, рднреНрд░рдордгрд╣рд░реВрдХреЛ рдЕрд╡рдзрд┐
  3. рдпреБрдЖрд░рдПрд▓рд╣рд░реВ: рдзреЗрд░реИ рдареВрд▓рд╛ URL рд╣рд░реВ рдирдХреНрдХрд▓ рдЧрд░реНрдирдмрд╛рдЯ рдмрдЪреНрди, рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдЫреМрдВред

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

рд╕реБрд░рд╛рдЧ рдЦреЛрдЬреНрджреИ

рдирдЬрд┐рдХрдмрд╛рдЯ рдирд┐рд░реАрдХреНрд╖рдг рдЧрд░реНрджрд╛, рд╣рд╛рдореА рджреЗрдЦреНрдЫреМрдВ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрд░реЛрдзрдорд╛ рдХреЗрд╣рд┐ рдЧрд▓рдд рдЫред рдпреЛ рд░реЗрдЦрд╛рд▓рд╛рдИ рдирдЬрд┐рдХрдмрд╛рдЯ рд╣реЗрд░реНрди рд▓рд╛рдпрдХ рдЫ:

urls && array(
	select id from acc_{account_id}.urls 
	where url  ILIKE  '%enterprise_customer.com/jobs%'
)::text[]

рдкрд╣рд┐рд▓реЛ рд╕реЛрдЪ рд╕рд╛рдпрдж рдХрд╛рд░рдг рдерд┐рдпреЛ ILIKE рдпреА рд╕рдмреИ рд▓рд╛рдореЛ URL рдорд╛ (рд╣рд╛рдореАрд╕рдБрдЧ 1,4 рдорд┐рд▓рд┐рдпрди рднрдиреНрджрд╛ рдмрдвреА рдЫ рдЕрджреНрд╡рд┐рддреАрдп рдпрд╕ рдЦрд╛рддрд╛рдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдЩреНрдХрд▓рди рдЧрд░рд┐рдПрдХрд╛ URL рд╣рд░реВ) рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрдирдорд╛ рдЕрд╕рд░ рдкрд░реНрди рд╕рдХреНрдЫред

рддрд░ рд╣реЛрдЗрди, рддреНрдпреЛ рдмрд┐рдиреНрджреБ рд╣реЛрдЗрди!

SELECT id FROM urls WHERE url ILIKE '%enterprise_customer.com/jobs%';
  id
--------
 ...
(198661 rows)

Time: 5231.765 ms

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЦреЛрдЬ рдЕрдиреБрд░реЛрдз рдЖрдлреИрдорд╛ рдорд╛рддреНрд░ 5 рд╕реЗрдХреЗрдиреНрдб рд▓рд╛рдЧреНрдЫред рд▓рд╛рдЦреМрдВ рдЕрджреНрд╡рд┐рддреАрдп URL рдорд╛ рдврд╛рдБрдЪрд╛ рдЦреЛрдЬреНрдиреБ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЗрдиред

рд╕реВрдЪреАрдорд╛ рдЕрд░реНрдХреЛ рд╕рдВрджрд┐рдЧреНрдз рдзреЗрд░реИ рдЫрдиреН JOINред рд╕рд╛рдпрдж рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рдпреЛрдЧрд▓реЗ рдордиреНрджреАрдХреЛ рдХрд╛рд░рдг рдмрдирд╛рдпреЛ? рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ JOINрдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИрднрдиреНрджрд╛ рд╕реНрдкрд╖реНрдЯ рдЙрдореНрдореЗрджреНрд╡рд╛рд░рд╣рд░реВ рд╣реБрдиреН, рддрд░ рдорд▓рд╛рдИ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд▓рд╛рдЧреЗрди рдХрд┐ рд╣рд╛рдореНрд░реЛ рдХреЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рдерд┐рдпреЛред

analytics_db=# SELECT
    count(*)
FROM
    acc_{account_id}.urls as recordings_urls,
    acc_{account_id}.recording_data_0 as recording_data,
    acc_{account_id}.sessions_0 as sessions
WHERE
    recording_data.usp_id = sessions.usp_id
    AND sessions.referrer_id = recordings_urls.id
    AND r_time > to_timestamp(1542585600)
    AND r_time < to_timestamp(1545177599)
    AND recording_data.duration >=5
    AND recording_data.num_of_pages > 0 ;
 count
-------
  8086
(1 row)

Time: 147.851 ms

рд░ рдпреЛ рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛ рдкрдирд┐ рдерд┐рдПрдиред JOINрдПрдХрджрдо рдЫрд┐рдЯреЛ рднрдПрдХреЛ рдЫред

рд╕рдВрджрд┐рдЧреНрдзрд╣рд░реВрдХреЛ рдШреЗрд░рд╛рд▓рд╛рдИ рд╕рдВрдХреБрдЪрд┐рдд рдЧрд░реНрджреИ

рдо рдХреБрдиреИ рдкрдирд┐ рд╕рдореНрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рд╕реБрдзрд╛рд░рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдХреНрд╡реЗрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рддрдпрд╛рд░ рдерд┐рдПрдБред рдореЗрд░реЛ рдЯреЛрд▓реА рд░ рдореИрд▓реЗ 2 рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░рд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реЗ:

  • рд╕рдмрдХреНрд╡реЗрд░реА URL рдХреЛ рд▓рд╛рдЧрд┐ EXISTS рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН: рд╣рд╛рдореА рдлреЗрд░рд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдереНрдпреМрдВ рдХрд┐ URL рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмрдХреНрд╡реЗрд░реАрдорд╛ рдХреБрдиреИ рд╕рдорд╕реНрдпрд╛ рднрдПред рдпреЛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдПрдХ рддрд░рд┐рдХрд╛ рдорд╛рддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╣реЛ EXISTS. EXISTS рдЧрд░реНрди рд╕рдХреНрдЫрдиреН рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрдирдорд╛ рдзреЗрд░реИ рд╕реБрдзрд╛рд░ рд╣реБрдиреНрдЫ рдХрд┐рдирдХрд┐ рдпреЛ рд╕рд░реНрддрд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреЗ рдПрдХ рдорд╛рддреНрд░ рд╕реНрдЯреНрд░рд┐рдЩ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдиреЗ рдмрд┐рддреНрддрд┐рдХреИ рдпреЛ рддреБрд░реБрдиреНрддреИ рд╕рдорд╛рдкреНрдд рд╣реБрдиреНрдЫред

SELECT
	count(*) 
FROM 
    acc_{account_id}.urls as recordings_urls,
    acc_{account_id}.recording_data as recording_data,
    acc_{account_id}.sessions as sessions
WHERE
    recording_data.usp_id = sessions.usp_id
    AND  (  1 = 1  )
    AND sessions.referrer_id = recordings_urls.id
    AND  (exists(select id from acc_{account_id}.urls where url  ILIKE '%enterprise_customer.com/jobs%'))
    AND r_time > to_timestamp(1547585600)
    AND r_time < to_timestamp(1549177599)
    AND recording_data.duration >=5
    AND recording_data.num_of_pages > 0 ;
 count
 32519
(1 row)
Time: 1636.637 ms

рдЦреИрд░, рд╣реЛред рд░реНтАНрдпрд╛рдк рдЧрд░реНрджрд╛ рд╕рдмрдХреНрд╡реЗрд░реА EXISTS, рд╕рдмреИ рдХреБрд░рд╛ рд╕реБрдкрд░ рдЫрд┐рдЯреЛ рдмрдирд╛рдЙрдБрдЫред рдЕрд░реНрдХреЛ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рд╢реНрди рдХрд┐рди рд╕рдВрдЧ рдЕрдиреБрд░реЛрдз рдЫ JOIN-ami рд░ subquery рдЖрдлреИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдкрдорд╛ рдЫрд┐рдЯреЛ рдЫрдиреН, рддрд░ рд╕рдБрдЧреИ рдзреЗрд░реИ рдврд┐рд▓реЛ рдЫрдиреН?

  • рд╕рдмрдХреНрд╡реЗрд░реА CTE рдорд╛ рд╕рд╛рд░реНрджреИ : рдпрджрд┐ рдХреНрд╡реЗрд░реА рдЖрдлреИрдорд╛ рдЫрд┐рдЯреЛ рдЫ рднрдиреЗ, рд╣рд╛рдореА рдХреЗрд╡рд▓ рдЫрд┐рдЯреЛ рдкрд░рд┐рдгрд╛рдо рдЧрдгрдирд╛ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ рд░ рддреНрдпрд╕рдкрдЫрд┐ рдореБрдЦреНрдп рдХреНрд╡реЗрд░реАрдорд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред

WITH matching_urls AS (
    select id::text from acc_{account_id}.urls where url  ILIKE  '%enterprise_customer.com/jobs%'
)

SELECT 
    count(*) FROM acc_{account_id}.urls as recordings_urls, 
    acc_{account_id}.recording_data as recording_data, 
    acc_{account_id}.sessions as sessions,
    matching_urls
WHERE 
    recording_data.usp_id = sessions.usp_id 
    AND  (  1 = 1  )  
    AND sessions.referrer_id = recordings_urls.id
    AND (urls && array(SELECT id from matching_urls)::text[])
    AND r_time > to_timestamp(1542585600) 
    AND r_time < to_timestamp(1545107599)
    AND recording_data.duration >=5 
    AND recording_data.num_of_pages > 0;

рддрд░ рдпреЛ рдЕрдЭреИ рдзреЗрд░реИ рд╕реБрд╕реНрдд рдерд┐рдпреЛред

рджреЛрд╖реА рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреЗ

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

рд╣реЗрд░реНрджреИ рдХрд╛рдЧрдЬрд╛рдд, рд╣рд╛рдореА рддреНрдпреЛ рджреЗрдЦреНрдЫреМрдВ && рддрдкрд╛рдИрдВрд▓реЗ рджреБрдИ рдПрд░реЗрд╣рд░реВ рдмреАрдЪ рд╕рд╛рдЭрд╛ рддрддреНрд╡рд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдБрджрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

рдореВрд▓ рдЕрдиреБрд░реЛрдзрдорд╛ рдпреЛ рдЫ:

AND  (  urls &&  array(select id from acc_{account_id}.urls where url  ILIKE  '%enterprise_customer.com/jobs%')::text[]   )

рдЬрд╕рдХреЛ рдорддрд▓рдм рд╣рд╛рдореА рд╣рд╛рдореНрд░рд╛ URL рд╣рд░реВрдорд╛ рдврд╛рдБрдЪрд╛ рдЦреЛрдЬреА рдЧрд░реНрдЫреМрдВ, рддреНрдпрд╕рдкрдЫрд┐ рд╕рд╛рдЭрд╛ рдкреЛрд╖реНрдЯрд╣рд░реВ рднрдПрдХрд╛ рд╕рдмреИ URL рд╣рд░реВрдХрд╛ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдлреЗрд▓рд╛ рдкрд╛рд░реНрдЫреМрдВред рдпреЛ рдЕрд▓рд┐ рднреНрд░рдордкреВрд░реНрдг рдЫ рдХрд┐рдирднрдиреЗ рдпрд╣рд╛рдБ "urls" рд▓реЗ рд╕рдмреИ URL рд╣рд░реВ рднрдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛рд▓рд╛рдИ рдЬрдирд╛рдЙрдБрджреИрди, рддрд░ рддрд╛рд▓рд┐рдХрд╛рдХреЛ "urls" рд╕реНрддрдореНрднрд▓рд╛рдИ рдЬрдирд╛рдЙрдБрдЫред recording_data.

рдмрд╛рд░реЗ рдЖрд╢рдВрдХрд╛ рдмрдвреНрджреИ рдЧрдПрдХреЛ рдЫ &&, рдореИрд▓реЗ рдЙрддреНрдкрдиреНрди рдЧрд░рд┐рдПрдХреЛ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдЙрдиреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдЦреЛрдЬреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВ EXPLAIN ANALYZE (рдорд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдПрдЙрдЯрд╛ рдпреЛрдЬрдирд╛ рдмрдЪрдд рднрдПрдХреЛ рдерд┐рдпреЛ, рддрд░ рдо рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдХреНрд╡реЗрд░реА рдкреНрд▓рд╛рдирд░рд╣рд░реВрдХреЛ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдмреБрдЭреНрди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБ рднрдиреНрджрд╛ SQL рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдзреЗрд░реИ рд╕рд╣рдЬ рдЫреБ)ред

Filter: ((urls && ($0)::text[]) AND (r_time > '2018-12-17 12:17:23+00'::timestamp with time zone) AND (r_time < '2018-12-18 23:59:59+00'::timestamp with time zone) AND (duration >= '5'::double precision) AND (num_of_pages > 0))
                           Rows Removed by Filter: 52710

рдмрд╛рдЯ рдорд╛рддреНрд░ рдлрд┐рд▓реНрдЯрд░ рдХреЛ рдзреЗрд░реИ рд▓рд╛рдЗрдирд╣рд░реБ рдерд┐рдП &&ред рдЬрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рдЕрдкрд░реЗрд╢рди рдорд╣рдБрдЧреЛ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рдзреЗрд░реИ рдкрдЯрдХ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

рдореИрд▓реЗ рдЕрд╡рд╕реНрдерд╛рд▓рд╛рдИ рдЕрд▓рдЧ рдЧрд░реЗрд░ рдпреЛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реЗрдВ

SELECT 1
FROM 
    acc_{account_id}.urls as recordings_urls, 
    acc_{account_id}.recording_data_30 as recording_data_30, 
    acc_{account_id}.sessions_30 as sessions_30 
WHERE 
	urls &&  array(select id from acc_{account_id}.urls where url  ILIKE  '%enterprise_customer.com/jobs%')::text[]

рдпреЛ рдкреНрд░рд╢реНрди рдврд┐рд▓реЛ рдерд┐рдпреЛред рдХрд┐рдирдХрд┐ рддреНрдпреЛ JOIN-s рдЫрд┐рдЯреЛ рдЫрдиреН рд░ рд╕рдмрдХреНрд╡реЗрд░реАрд╣рд░реВ рдЫрд┐рдЯреЛ рдЫрдиреН, рдПрдХ рдорд╛рддреНрд░ рдЪреАрдЬ рдмрд╛рдБрдХреА рдерд┐рдпреЛ && рдЕрдкрд░реЗрдЯрд░ред

рдпреЛ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдореБрдЦ рдХрд╛рд░реНрдп рд╣реЛред рд╣рд╛рдореАрд▓реЗ рд╕рдзреИрдВ рдврд╛рдБрдЪрд╛ рдЦреЛрдЬреНрдирдХреЛ рд▓рд╛рдЧрд┐ URL рдХреЛ рд╕рдореНрдкреВрд░реНрдг рдЕрдиреНрддрд░реНрдирд┐рд╣рд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдЦреЛрдЬреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рд╣рд╛рдореАрд▓реЗ рд╕рдзреИрдВ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрдирд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╣рд╛рдореА рд╕реАрдзреИ URL рд░реЗрдХрд░реНрдбрд╣рд░реВ рдЦреЛрдЬреНрди рд╕рдХреНрджреИрдиреМрдВ, рдХрд┐рдирднрдиреЗ рдпреА рдХреЗрд╡рд▓ ID рд╣рд░реВ рд╣реБрдиреН urls.

рд╕рдорд╛рдзрд╛рдирдХреЛ рдмрд╛рдЯреЛрдорд╛

&& рдврд┐рд▓реЛ рдХрд┐рдирднрдиреЗ рджреБрд╡реИ рд╕реЗрдЯ рд╡рд┐рд╢рд╛рд▓ рдЫрдиреНред рдореИрд▓реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реЗрдорд╛ рдЕрдкрд░реЗрд╢рди рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫрд┐рдЯреЛ рд╣реБрдиреЗрдЫ urls рдорд╛ { "http://google.com/", "http://wingify.com/" }.

рдореИрд▓реЗ рдкреНрд░рдпреЛрдЧ рдирдЧрд░реА Postgres рдорд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╕реЗрдЯ рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рдЦреЛрдЬреНрди рдерд╛рд▓реЗ &&рддрд░ рдзреЗрд░реИ рд╕рдлрд▓рддрд╛ рдмрд┐рдирд╛ред

рдЕрдиреНрддрдорд╛, рд╣рд╛рдореАрд▓реЗ рдПрдХреНрд▓реИ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ: рдорд▓рд╛рдИ рд╕рдмреИ рджрд┐рдиреБрд╣реЛрд╕реН urls рд░реЗрдЦрд╛рд╣рд░реВ рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ URL рдврд╛рдБрдЪрд╛рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫред рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд░реНрддрд╣рд░реВ рдмрд┐рдирд╛ рдпреЛ рд╣реБрдиреЗрдЫ - 

SELECT urls.url
FROM 
	acc_{account_id}.urls as urls,
	(SELECT unnest(recording_data.urls) AS id) AS unrolled_urls
WHERE
	urls.id = unrolled_urls.id AND
	urls.url  ILIKE  '%jobs%'

рдпрд╕рдХреЛ рд╕рдЯреНрдЯрд╛ JOIN рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рдореИрд▓реЗ рднрд░реНрдЦрд░ рд╕рдмрдХреНрд╡реЗрд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдВ рд░ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реЗрдВ recording_data.urls array рддрд╛рдХрд┐ рддрдкрд╛рдЗрдБ рд╕рд┐рдзреИ рд╕рд░реНрдд рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ WHERE.

рдпрд╣рд╛рдБ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХреБрд░рд╛ рдпреЛ рд╣реЛ && рджрд┐рдЗрдПрдХреЛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдорд╛ рдорд┐рд▓реНрджреЛ URL рд╕рдорд╛рд╡реЗрд╢ рдЫ рдХрд┐ рдЫреИрди рднрдиреА рдЬрд╛рдБрдЪ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЕрд▓рд┐рдХрддрд┐ squint рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпреЛ рдЕрдкрд░реЗрд╢рди рдПрд░реНрд░реЗ (рд╡рд╛ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ) рдХреЛ рддрддреНрд╡рд╣рд░реВ рдорд╛рд░реНрдлрдд рд╕рд░реЗрдХреЛ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рд╢рд░реНрдд (рдорд┐рд▓рд╛рди) рднреЗрдЯреНрджрд╛ рд░реЛрдХрд┐рдиреНрдЫред рдХреЗ рддрдкрд╛рдИрд▓рд╛рдИ рдХреЗрд╣рд┐ рдкрдирд┐ рд╕рдореНрдЭрд╛рдЙрдБрджреИрди? рд╣реЛ, EXISTS.

рдкрдЫрд┐рдмрд╛рдЯ recording_data.urls рд╕рдмрдХреНрд╡реЗрд░реА рд╕рдиреНрджрд░реНрдн рдмрд╛рд╣рд┐рд░рдмрд╛рдЯ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЬрдм рдпреЛ рд╣реБрдиреНрдЫ рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рдкреБрд░рд╛рдиреЛ рд╕рд╛рдереАрдорд╛ рдлрд░реНрдХрди рд╕рдХреНрдЫреМрдВ EXISTS рд░ рдпрд╕рдХреЛ рд╕рд╛рде рд╕рдмрдХреНрд╡реЗрд░реА рдмреЗрд░реНрдиреБрд╣реЛрд╕реНред

рд╕рдмреИ рдХреБрд░рд╛ рд╕рдБрдЧреИ рд░рд╛рдЦреЗрд░, рд╣рд╛рдореА рдЕрдиреНрддрд┐рдо рдЕрдиреБрдХреВрд▓рд┐рдд рдХреНрд╡реЗрд░реА рдкрд╛рдЙрдБрдЫреМрдВ:

SELECT 
    count(*) 
FROM 
    acc_{account_id}.urls as recordings_urls, 
    acc_{account_id}.recording_data as recording_data, 
    acc_{account_id}.sessions as sessions 
WHERE 
    recording_data.usp_id = sessions.usp_id 
    AND  (  1 = 1  )  
    AND sessions.referrer_id = recordings_urls.id 
    AND r_time > to_timestamp(1542585600) 
    AND r_time < to_timestamp(1545177599) 
    AND recording_data.duration >=5 
    AND recording_data.num_of_pages > 0
    AND EXISTS(
        SELECT urls.url
        FROM 
            acc_{account_id}.urls as urls,
            (SELECT unnest(urls) AS rec_url_id FROM acc_{account_id}.recording_data) 
            AS unrolled_urls
        WHERE
            urls.id = unrolled_urls.rec_url_id AND
            urls.url  ILIKE  '%enterprise_customer.com/jobs%'
    );

рд░ рдЕрдиреНрддрд┐рдо рдиреЗрддреГрддреНрд╡ рд╕рдордп Time: 1898.717 ms рдордирд╛рдЙрдиреЗ рд╕рдордп?!?

рдпрддрд┐ рдЫрд┐рдЯреЛ рдЫреИрди! рдкрд╣рд┐рд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рд╢реБрджреНрдзрддрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдорд▓рд╛рдИ рдЕрд╕рд╛рдзреНрдпреИ рд╢рдВрдХрд╛ рд▓рд╛рдЧреНрдпреЛ EXISTS рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рди рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ рддрд░реНрдХрд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдкреВрд░рд╛ рдЧрд░реНрди рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджрдЫред рд╣рд╛рдореАрд▓реЗ рдЕрдиреБрд░реЛрдзрдорд╛ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдердкреЗрдХрд╛ рдЫреИрдиреМрдВ рднрдиреНрдиреЗ рдХреБрд░рд╛рдорд╛ рд╣рд╛рдореА рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рд╛ рдЪрд▓рд╛рдЙрди рдерд┐рдпреЛ count(*) рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рд╕реЗрдЯрд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рд▓рд╛рдЧрд┐ рджреБрд╡реИ рдврд┐рд▓реЛ рд░ рдЫрд┐рдЯреЛ рдкреНрд░рд╢реНрдирд╣рд░реВрдорд╛ред рддреНрдпрд╕рдкрдЫрд┐, рдбрд╛рдЯрд╛рдХреЛ рд╕рд╛рдиреЛ рдЙрдкрд╕рдореВрд╣рдХреЛ рд▓рд╛рдЧрд┐, рдореИрд▓реЗ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реЗрдВ рдХрд┐ рд╕рдмреИ рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рд╕рд╣реА рдерд┐рдПред

рд╕рдмреИ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрд▓реЗ рд▓рдЧрд╛рддрд╛рд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рджрд┐рдПред рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рдареАрдХ рдЧрд░реНрдпреМрдВ!

рд╕рд┐рдХреЗрдХрд╛ рдкрд╛рдард╣рд░реВ

рдпрд╕ рдХрдерд╛рдмрд╛рдЯ рдзреЗрд░реИ рдкрд╛рда рд╕рд┐рдХреНрди рд╕рдХрд┐рдиреНрдЫ:

  1. рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рд╣рд░реВрд▓реЗ рд╕рдореНрдкреВрд░реНрдг рдХрдерд╛ рдмрддрд╛рдЙрдБрджреИрди, рддрд░ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╕реБрд░рд╛рдЧ рдкреНрд░рджрд╛рди рдЧрд░реНрди рд╕рдХреНрдЫрдиреН
  2. рдореБрдЦреНрдп рд╕рдВрджрд┐рдЧреНрдзрд╣рд░реВ рд╕рдзреИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдкрд░рд╛рдзреАрд╣рд░реВ рдЫреИрдирдиреН
  3. рдврд┐рд▓реЛ рдкреНрд░рд╢реНрдирд╣рд░реВрд▓рд╛рдИ рдмрд╛рдзрд╛рд╣рд░реВрд▓рд╛рдИ рдЕрд▓рдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рддреЛрдбреНрди рд╕рдХрд┐рдиреНрдЫ
  4. рд╕рдмреИ рдЕрдиреБрдХреВрд▓рди рдкреНрд░рдХреГрддрд┐рдорд╛ рдШрдЯрд╛рдЙрдиреЗ рд╣реЛрдЗрдирдиреН
  5. рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН EXISTрдЬрд╣рд╛рдБ рд╕рдореНрднрд╡ рдЫ, рдЙрддреНрдкрд╛рджрдХрддрд╛рдорд╛ рдирд╛рдЯрдХреАрдп рд╡реГрджреНрдзрд┐ рд╣реБрди рд╕рдХреНрдЫ

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рд╣рд╛рдореАрд▓реЗ рдХреНрд╡реЗрд░реА рд╕рдордп ~24 рдорд┐рдиреЗрдЯрдмрд╛рдЯ 2 рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдЧрдпреМрдВ - рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рд╡реГрджреНрдзрд┐! рдпрджреНрдпрдкрд┐ рдпреЛ рд▓реЗрдЦ рдареВрд▓реЛ рдмрд╛рд╣рд┐рд░ рдЖрдпреЛ, рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рдкреНрд░рдпреЛрдЧрд╣рд░реВ рдПрдХ рджрд┐рдирдорд╛ рдЧрд░реЗрдХрд╛ рдерд┐рдпреМрдВ, рд░ рдпреЛ рдЕрдиреБрдорд╛рди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рдХрд┐ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдЕрдиреБрдХреВрд▓рди рд░ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ 1,5 рд░ 2 рдШрдгреНрдЯрд╛рдХреЛ рдмреАрдЪрдорд╛ рд▓рд┐рдиреБрднрдпреЛред

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

рдпрд╕ рдкреНрд░рдХрд╛рд░рдХрд╛ рдирддрд┐рдЬрд╛рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдмрд╛рд░реЗрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рдкрдХреНрд╖ рднрдиреЗрдХреЛ рдзреНрдпрд╛рди рджрд┐рди рд╕рдХрд┐рдиреЗ, рджреЗрдЦрд┐рдиреЗ рдЧрддрд┐рдорд╛ рд╕реБрдзрд╛рд░ рд╣реЛ - рдЬрд╣рд╛рдБ рдкрд╣рд┐рд▓реЗ рд▓реЛрдб рдирд╣реБрдиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдЕрд╣рд┐рд▓реЗ рд▓рдЧрднрдЧ рддреБрд░реБрдиреНрддреИ рд▓реЛрдб рд╣реБрдиреНрдЫред

рд▓рд╛рдИ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж рдореЗрд░рд╛ рд╕рд╛рдереАрд╣рд░реБ рдЖрджрд┐рддреНрдп рдорд┐рд╢реНрд░рдХреЛ рдЖрджреЗрд╢рдорд╛рдЖрджрд┐рддреНрдп рдЧреМрд░реБ ╨╕ рд╡рд░реБрдг рдорд▓реНрд╣реЛрддреНрд░рд╛ рдордВрдердирдХрд╛ рд▓рд╛рдЧрд┐ рд░ рджрд┐рдирдХрд░ рдкрдгреНрдбрд┐рд░ рд╣рд╛рдореАрд▓реЗ рдЕрдиреНрддрддрдГ рдпрд╕рд▓рд╛рдИ рдЕрд▓рд╡рд┐рджрд╛ рднрдиреНрдиреБ рдЕрдШрд┐ рд╣рд╛рдореНрд░реЛ рдЕрдиреНрддрд┐рдо рдЕрдиреБрд░реЛрдзрдорд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдирдХреЛ рд▓рд╛рдЧрд┐!

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди