рдПрдХрд╛ рдПрд╕рдХреНрдпреВрдПрд▓ рддрдкрд╛рд╕рдгреАрдЪреА рдХрдерд╛

рдЧреЗрд▓реНрдпрд╛ рдбрд┐рд╕реЗрдВрдмрд░рдордзреНрдпреЗ рдорд▓рд╛ VWO рд╕рдорд░реНрдерди рдХрд╛рд░реНрдпрд╕рдВрдШрд╛рдХрдбреВрди рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдмрдЧ рдЕрд╣рд╡рд╛рд▓ рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓рд╛. рдореЛрдареНрдпрд╛ рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдХреНрд▓рд╛рдпрдВрдЯрд╕рд╛рдареА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрд╣рд╡рд╛рд▓рд╛рдВрдкреИрдХреА рдПрдХ рд▓реЛрдбрд┐рдВрдЧ рд╡реЗрд│ рдирд┐рд╖реЗрдзрд╛рд░реНрд╣ рд╡рд╛рдЯрд▓рд╛. рдЖрдгрд┐ рд╣реЗ рдорд╛рдЭреНрдпрд╛ рдЬрдмрд╛рдмрджрд╛рд░реАрдЪреЗ рдХреНрд╖реЗрддреНрд░ рдЕрд╕рд▓реНрдпрд╛рдиреЗ рдореА рд▓рдЧреЗрдЪ рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХреЗрд▓реЗ.

prehistory

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

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

рдкреНрд▓реЕрдЯрдлреЙрд░реНрдордЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди, рддреБрдореНрд╣реА рдореЛрдареНрдпрд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯрд╡рд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд╡реЗрд░реА рдХрд░реВ рд╢рдХрддрд╛. рдпреЗрдереЗ рдПрдХ рд╕рд╛рдзреЗ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ:

<date d1> рдкрд╛рд╕реВрди <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: рдЕрддреНрдпрдВрдд рдореЛрдареНрдпрд╛ 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 рдЖрдгрд┐ рд╕рдмрдХреНрд╡реЗрд░реА рд╕реНрд╡рддрдГрдЪ рд╡реЗрдЧрд╡рд╛рди рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рдПрдХрддреНрд░ рдЦреВрдк рд╣рд│реВ рдЖрд╣реЗрдд?

  • рд╕рдмрдХреНрд╡реЗрд░реА 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 рд░реЗрдХреЙрд░реНрдбрджреНрд╡рд╛рд░реЗ рд╢реЛрдзреВ рд╢рдХрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рд╣реЗ рдлрдХреНрдд рдЖрдпрдбреА рдЖрд╣реЗрдд urls.

рд╕рдорд╛рдзрд╛рдирд╛рдЪреНрдпрд╛ рд╡рд╛рдЯреЗрд╡рд░

&& рд╕рдВрде рдХрд╛рд░рдг рджреЛрдиреНрд╣реА рд╕рдВрдЪ рдореЛрдареЗ рдЖрд╣реЗрдд. рдореА рдмрджрд▓рд▓реНрдпрд╛рд╕ рдСрдкрд░реЗрд╢рди рддреБрд▓рдиреЗрдиреЗ рдЬрд▓рдж рд╣реЛрдИрд▓ urls рд╡рд░ { "http://google.com/", "http://wingify.com/" }.

рдореА рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕рдордзреНрдпреЗ рди рд╡рд╛рдкрд░рддрд╛ рд╕реЗрдЯ рдЗрдВрдЯрд░рд╕реЗрдХреНрд╢рди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рд╢реЛрдзреВ рд▓рд╛рдЧрд▓реЛ &&, рдкрд░рдВрддреБ рдлрд╛рд░рд╕реЗ рдпрд╢ рди рдорд┐рд│рд╛рд▓реЗ.

рд╕рд░рддреЗрд╢реЗрд╡рдЯреА, рдЖрдореНрд╣реА рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛: рдорд▓рд╛ рд╕рд░реНрд╡рдХрд╛рд╣реА рджреНрдпрд╛ 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 рдЕтАНреЕрд░реЗ рдЬреЗрдгреЗрдХрд░реВрди рддреБрдореНрд╣реА рдереЗрдЯ рдордзреНрдпреЗ рдЕрдЯ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддрд╛ WHERE.

рдпреЗрдереЗ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреА рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ && рджрд┐рд▓реЗрд▓реНрдпрд╛ рдПрдВрдЯреНрд░реАрдордзреНрдпреЗ рдЬреБрд│рдгрд╛рд░реА URL рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ. рддреБрдореНрд╣реА рдереЛрдбреЗрд╕реЗ рддрд┐рд░рдХрд╕ рдкрд╛рд╣рд┐рд▓реНрдпрд╛рд╕, рд╣реЗ рдСрдкрд░реЗрд╢рди рдЕреЕрд░реЗрдЪреНрдпрд╛ (рдХрд┐рдВрд╡рд╛ рдЯреЗрдмрд▓рдЪреНрдпрд╛ рдкрдВрдХреНрддреА) рдШрдЯрдХрд╛рдВрдордзреВрди рдлрд┐рд░рддреЗ рдЖрдгрд┐ рдЕрдЯ (рд╕рд╛рдордирд╛) рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдерд╛рдВрдмрддреЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╢рд╛рдЪреАрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрдд рдирд╛рд╣реА рдХрд╛? рд╣реЛрдп, 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛