ืกื™ืคื•ืจื” ืฉืœ ื—ืงื™ืจืช SQL ืื—ืช

ื‘ื“ืฆืžื‘ืจ ื”ืื—ืจื•ืŸ ืงื™ื‘ืœืชื™ ื“ื•ื— ื‘ืื’ ืžืขื ื™ื™ืŸ ืžืฆื•ื•ืช ื”ืชืžื™ื›ื” ืฉืœ VWO. ื–ืžืŸ ื”ื˜ืขื™ื ื” ืฉืœ ืื—ื“ ืžื”ื“ื•ื—ื•ืช ื”ืื ืœื™ื˜ื™ื™ื ืขื‘ื•ืจ ืœืงื•ื— ืืจื’ื•ื ื™ ื’ื“ื•ืœ ื ืจืื” ื›ื‘ื“. ื•ืžื›ื™ื•ื•ืŸ ืฉื–ื” ืชื—ื•ื ื”ืื—ืจื™ื•ืช ืฉืœื™, ื”ืชืžืงื“ืชื™ ืžื™ื“ ื‘ืคืชืจื•ืŸ ื”ื‘ืขื™ื”.

ืคืจื”ื™ืกื˜ื•ืจื™ื”

ื›ื“ื™ ืœื”ื‘ื”ื™ืจ ืขืœ ืžื” ืื ื™ ืžื“ื‘ืจ, ืืกืคืจ ืœื›ื ืงืฆืช ืขืœ VWO. ื–ื•ื”ื™ ืคืœื˜ืคื•ืจืžื” ืฉื‘ืืžืฆืขื•ืชื” ืชื•ื›ืœื• ืœื”ืฉื™ืง ืงืžืคื™ื™ื ื™ื ืžืžื•ืงื“ื™ื ืฉื•ื ื™ื ื‘ืืชืจื™ ื”ืื™ื ื˜ืจื ื˜ ืฉืœื›ื: ืœืขืจื•ืš ื ื™ืกื•ื™ื™ A/B, ืœืขืงื•ื‘ ืื—ืจ ืžื‘ืงืจื™ื ื•ื”ืžืจื•ืช, ืœื ืชื— ืืช ืžืฉืคืš ื”ืžื›ื™ืจื•ืช, ืœื”ืฆื™ื’ ืžืคื•ืช ื—ื•ื ื•ืœื”ืคืขื™ืœ ื”ืงืœื˜ื•ืช ื‘ื™ืงื•ืจื™ื.

ืื‘ืœ ื”ื“ื‘ืจ ื”ื—ืฉื•ื‘ ื‘ื™ื•ืชืจ ื‘ืคืœื˜ืคื•ืจืžื” ื”ื•ื ื”ื“ื™ื•ื•ื—. ื›ืœ ื”ืคื•ื ืงืฆื™ื•ืช ืœืขื™ืœ ืงืฉื•ืจื•ืช ื–ื• ื‘ื–ื•. ื•ืขื‘ื•ืจ ืœืงื•ื—ื•ืช ืืจื’ื•ื ื™ื™ื, ื›ืžื•ืช ืขืฆื•ืžื” ืฉืœ ืžื™ื“ืข ืชื”ื™ื” ืคืฉื•ื˜ ื—ืกืจืช ืชื•ืขืœืช ืœืœื ืคืœื˜ืคื•ืจืžื” ื—ื–ืงื” ืฉืžืฆื™ื’ื” ืื•ืชื• ื‘ืฆื•ืจื” ืื ืœื™ื˜ื™ืช.

ื‘ืืžืฆืขื•ืช ื”ืคืœื˜ืคื•ืจืžื”, ืืชื” ื™ื›ื•ืœ ืœื‘ืฆืข ืฉืื™ืœืชื” ืืงืจืื™ืช ืขืœ ืžืขืจืš ื ืชื•ื ื™ื ื’ื“ื•ืœ. ื”ื ื” ื“ื•ื’ืžื” ืคืฉื•ื˜ื”:

ื”ืฆื’ ืืช ื›ืœ ื”ืงืœื™ืงื™ื ื‘ื“ืฃ "abc.com" ืž-<date d1> ืขื“ <date d2> ืขื‘ื•ืจ ืื ืฉื™ื ืฉื”ืฉืชืžืฉื• ื‘-Chrome OR (ืžืžื•ืงื ื‘ืื™ืจื•ืคื” ื•ื”ืฉืชืžืฉื• ื‘ืื™ื™ืคื•ืŸ)

ืฉื™ืžื• ืœื‘ ืœืื•ืคืจื˜ื•ืจื™ื ื‘ื•ืœื™ืื ื™ื™ื. ื”ื ื–ืžื™ื ื™ื ืœืœืงื•ื—ื•ืช ื‘ืžืžืฉืง ื”ืฉืื™ืœืชื•ืช ื›ื“ื™ ืœื‘ืฆืข ืฉืื™ืœืชื•ืช ืžื•ืจื›ื‘ื•ืช ื‘ืื•ืคืŸ ืฉืจื™ืจื•ืชื™ ื›ื“ื™ ืœื”ืฉื™ื’ ื“ื•ื’ืžืื•ืช.

ื‘ืงืฉื” ืื™ื˜ื™ืช

ื”ืœืงื•ื— ื”ืžื“ื•ื‘ืจ ื ื™ืกื” ืœืขืฉื•ืช ืžืฉื”ื• ืฉื‘ืื•ืคืŸ ืื™ื ื˜ื•ืื™ื˜ื™ื‘ื™ ืืžื•ืจ ืœืขื‘ื•ื“ ื‘ืžื”ื™ืจื•ืช:

ื”ืฆื’ ืืช ื›ืœ ืจืฉื•ืžื•ืช ื”ื”ืคืขืœื” ืขื‘ื•ืจ ืžืฉืชืžืฉื™ื ืฉื‘ื™ืงืจื• ื‘ื“ืฃ ื›ืœืฉื”ื• ืขื ื›ืชื•ื‘ืช ืืชืจ ื”ืžื›ื™ืœื” "/jobs"

ืœืืชืจ ื”ื–ื” ื”ื™ื™ืชื” ื”ืžื•ืŸ ืชื ื•ืขื” ื•ืื—ืกื ื• ืœืžืขืœื” ืžืžื™ืœื™ื•ืŸ ื›ืชื•ื‘ื•ืช 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. recording_data: ื›ืชื•ื‘ื•ืช URL ืžื•ืงืœื˜ื•ืช, ื“ืคื™ื, ืžืฉืš ื‘ื™ืงื•ืจื™ื
  3. ื›ืชื•ื‘ื•ืช ืื™ื ื˜ืจื ื˜: ื›ื“ื™ ืœื”ื™ืžื ืข ืžืฉื›ืคื•ืœ ืฉืœ ื›ืชื•ื‘ื•ืช URL ื’ื“ื•ืœื•ืช ื‘ืžื™ื•ื—ื“, ืื ื• ืžืื—ืกื ื™ื ืื•ืชืŸ ื‘ื˜ื‘ืœื” ื ืคืจื“ืช.

ืฉื™ื ืœื‘ ื’ื ืฉื›ืœ ื”ื˜ื‘ืœืื•ืช ืฉืœื ื• ื›ื‘ืจ ืžื—ื•ืœืงื•ืช ืœืคื™ account_id. ื‘ื“ืจืš ื–ื•, ืœื ื ื›ืœืœ ืžืฆื‘ ืฉื‘ื• ื—ืฉื‘ื•ืŸ ืื—ื“ ื’ื“ื•ืœ ื‘ืžื™ื•ื—ื“ ื’ื•ืจื ืœื‘ืขื™ื•ืช ืขื‘ื•ืจ ืื—ืจื™ื.

ืžื—ืคืฉ ืจืžื–ื™ื

ื‘ื‘ื“ื™ืงื” ืžืขืžื™ืงื” ื™ื•ืชืจ, ืื ื• ืจื•ืื™ื ืฉืžืฉื”ื• ืœื ื‘ืกื“ืจ ื‘ื‘ืงืฉื” ืžืกื•ื™ืžืช. ืฉื•ื•ื” ืœื”ืกืชื›ืœ ืžืงืจื•ื‘ ืขืœ ื”ืฉื•ืจื” ื”ื–ื•:

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

ื”ืžื—ืฉื‘ื” ื”ืจืืฉื•ื ื” ื”ื™ื™ืชื” ืฉืื•ืœื™ ื‘ื’ืœืœ ILIKE ื‘ื›ืœ ื›ืชื•ื‘ื•ืช ื”ืืชืจื™ื ื”ืืจื•ื›ื•ืช ื”ืœืœื• (ื™ืฉ ืœื ื• ื™ื•ืชืจ ืž-1,4 ืžื™ืœื™ื•ืŸ ื™ื™ื—ื•ื“ื™ ื›ืชื•ื‘ื•ืช ืืชืจื™ื ืฉื ืืกืคื• ืขื‘ื•ืจ ื—ืฉื‘ื•ืŸ ื–ื”) ืขืœื•ืœื™ื ืœื”ื™ืคื’ืข.

ืื‘ืœ ืœื, ื–ื” ืœื ื”ืขื ื™ื™ืŸ!

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

Time: 5231.765 ms

ื‘ืงืฉืช ื—ื™ืคื•ืฉ ื”ืชื‘ื ื™ืช ืขืฆืžื” ืื•ืจื›ืช 5 ืฉื ื™ื•ืช ื‘ืœื‘ื“. ื—ื™ืคื•ืฉ ืื—ืจ ื“ืคื•ืก ื‘ืžื™ืœื™ื•ืŸ ื›ืชื•ื‘ื•ืช ืืชืจื™ื ื™ื™ื—ื•ื“ื™ื•ืช ื”ื•ื ืœืœื ืกืคืง ืœื ื‘ืขื™ื”.

ื”ื—ืฉื•ื“ ื”ื‘ื ื‘ืจืฉื™ืžื” ื”ื•ื ื›ืžื” 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 ืจืขื™ื•ื ื•ืช ืขื™ืงืจื™ื™ื:

  • ื”ืฉืชืžืฉ ื‘-EXISTS ืขื‘ื•ืจ ื›ืชื•ื‘ืช ื”ืืชืจ ืฉืœ ืฉืื™ืœืชืช ื”ืžืฉื ื”: ืจืฆื™ื ื• ืœื‘ื“ื•ืง ืฉื•ื‘ ืื ื™ืฉ ื‘ืขื™ื•ืช ื›ืœืฉื”ืŸ ืขื ืฉืื™ืœืชืช ื”ืžืฉื ื” ืขื‘ื•ืจ ื›ืชื•ื‘ื•ืช ื”ืืชืจื™ื. ืื—ืช ื”ื“ืจื›ื™ื ืœื”ืฉื™ื’ ื–ืืช ื”ื™ื ืคืฉื•ื˜ ืœื”ืฉืชืžืฉ 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 ืขื ืคื•ืกื˜ื™ื ื ืคื•ืฆื™ื. ื–ื” ืงืฆืช ืžื‘ืœื‘ืœ ื›ื™ "ื›ืชื•ื‘ื•ืช ืืชืจื™ื" ื›ืืŸ ืœื ืžืชื™ื™ื—ืกื•ืช ืœื˜ื‘ืœื” ื”ืžื›ื™ืœื” ืืช ื›ืœ ื›ืชื•ื‘ื•ืช ื”ืืชืจื™ื, ืืœื ืœืขืžื•ื“ืช "ื›ืชื•ื‘ื•ืช ืืชืจื™ื" ื‘ื˜ื‘ืœื” 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-ื™ื ืžื”ื™ืจื™ื ื•ืชืชื™ ืฉืื™ืœืชื•ืช ืžื”ื™ืจื•ืช, ื”ื“ื‘ืจ ื”ื™ื—ื™ื“ ืฉื ื•ืชืจ ื”ื™ื” && ืžึทืคืขึดื™ืœ.

ื–ื• ืจืง ืคืขื•ืœืช ืžืคืชื—. ืื ื—ื ื• ืชืžื™ื“ ืฆืจื™ื›ื™ื ืœื—ืคืฉ ื‘ื›ืœ ื”ื˜ื‘ืœื” ื”ื‘ืกื™ืกื™ืช ืฉืœ ื›ืชื•ื‘ื•ืช ืืชืจื™ื ื›ื“ื™ ืœื—ืคืฉ ื“ืคื•ืก, ื•ืื ื—ื ื• ืชืžื™ื“ ืฆืจื™ื›ื™ื ืœืžืฆื•ื ืฆืžืชื™ื. ืื™ื ื ื• ื™ื›ื•ืœื™ื ืœื—ืคืฉ ื™ืฉื™ืจื•ืช ืœืคื™ ืจืฉื•ืžื•ืช ื›ืชื•ื‘ื•ืช ืืชืจื™ื, ืžื›ื™ื•ื•ืŸ ืฉืืœื• ืจืง ืžื–ื”ื™ื ื”ืžืชื™ื™ื—ืกื™ื ืืœื™ื”ื urls.

ื‘ื“ืจืš ืœืคืชืจื•ืŸ

&& ืื™ื˜ื™ ื›ื™ ืฉื ื™ ื”ืกื˜ื™ื ืขื ืงื™ื™ื. ื”ืคืขื•ืœื” ืชื”ื™ื” ืžื”ื™ืจื” ื™ื—ืกื™ืช ืื ืื—ืœื™ืฃ urls ืขืœ { "http://google.com/", "http://wingify.com/" }.

ื”ืชื—ืœืชื™ ืœื—ืคืฉ ื“ืจืš ืœืขืฉื•ืช ืฆื•ืžืช ืกื˜ ื‘-Postgres ื‘ืœื™ ืœื”ืฉืชืžืฉ &&, ืืš ืœืœื ื”ืฆืœื—ื” ื™ืชืจื”.

ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ, ื”ื—ืœื˜ื ื• ืคืฉื•ื˜ ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื‘ืžื ื•ืชืง: ืชืŸ ืœื™ ื”ื›ืœ urls ืฉื•ืจื•ืช ืฉื›ืชื•ื‘ืช ื”ืืชืจ ืฉืœื”ืŸ ืชื•ืืžืช ืœืชื‘ื ื™ืช. ืœืœื ืชื ืื™ื ื ื•ืกืคื™ื ื–ื” ื™ื”ื™ื” - 

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 ืœืฉืขืชื™ื™ื ืœืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ื•ื‘ื“ื™ืงื•ืช.

SQL ื”ื™ื ืฉืคื” ื ืคืœืื” ืื โ€‹โ€‹ืืชื” ืœื ืžืคื—ื“ ืžืžื ื”, ืืœื ืžื ืกื” ืœืœืžื•ื“ ื•ืœื”ืฉืชืžืฉ ื‘ื”. ืขืœ ื™ื“ื™ ื”ื‘ื ื” ื˜ื•ื‘ื” ืฉืœ ืื•ืคืŸ ื‘ื™ืฆื•ืข ืฉืื™ืœืชื•ืช SQL, ื›ื™ืฆื“ ืžืกื“ ื”ื ืชื•ื ื™ื ืžื™ื™ืฆืจ ืชื•ื›ื ื™ื•ืช ืฉืื™ืœืชื•ืช, ื›ื™ืฆื“ ืคื•ืขืœื™ื ื”ืื™ื ื“ืงืกื™ื ื•ืคืฉื•ื˜ ื’ื•ื“ืœ ื”ื ืชื•ื ื™ื ืฉืืชื” ืžืชืžื•ื“ื“ ืื™ืชื, ืืชื” ื™ื›ื•ืœ ืœื”ืฆืœื™ื— ืžืื•ื“ ื‘ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืฉืื™ืœืชื•ืช. ืขื ื–ืืช, ื—ืฉื•ื‘ ืœื ืคื—ื•ืช ืœื”ืžืฉื™ืš ื•ืœื ืกื•ืช ื’ื™ืฉื•ืช ืฉื•ื ื•ืช ื•ืœืื˜ ืœืื˜ ืœืคืจืง ืืช ื”ื‘ืขื™ื”, ืœืžืฆื•ื ืืช ืฆื•ื•ืืจื™ ื”ื‘ืงื‘ื•ืง.

ื”ื—ืœืง ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ ื‘ื”ืฉื’ืช ืชื•ืฆืื•ืช ื›ืืœื” ื”ื•ื ืฉื™ืคื•ืจ ื”ืžื”ื™ืจื•ืช ื”ื ืจืื” ืœืขื™ืŸ - ื›ืืฉืจ ื“ื•ื— ืฉื‘ืขื‘ืจ ืืคื™ืœื• ืœื ื ื˜ืขืŸ ื›ืขืช ื ื˜ืขืŸ ื›ืžืขื˜ ื‘ืื•ืคืŸ ืžื™ื™ื“ื™.

ืชื•ื“ื” ืžื™ื•ื—ื“ืช ืœ ื”ื—ื‘ืจื™ื ืฉืœื™ ื‘ืคืงื•ื“ืช ืื“ื™ืชื™ื ืžื™ืฉืจืืื“ื™ื˜ื™ื” ื’ืื•ืจื• ะธ ื•ืืจื•ืŸ ืžืœื•ื˜ืจื” ืœืกื™ืขื•ืจ ืžื•ื—ื•ืช ื• ื“ื™ื ืงืจ ืคื ื“ื™ืจ ืขืœ ืžืฆื™ืืช ืฉื’ื™ืื” ื—ืฉื•ื‘ื” ื‘ื‘ืงืฉื” ื”ืื—ืจื•ื ื” ืฉืœื ื• ืœืคื ื™ ืฉื ืคืจื“ื ื• ืžืžื ื” ืกื•ืคื™ืช!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”