æšå¹Žã® XNUMX æã«ãVWO ãµããŒã ããŒã ããèå³æ·±ããã° ã¬ããŒããåãåããŸããã 倧äŒæ¥é¡§å®¢åãã®åæã¬ããŒãã® XNUMX ã€ã§ã¯ãèªã¿èŸŒã¿æéãæ³å€ã«é·ããšæãããŸããã ãããŠãããã¯ç§ã®è²¬ä»»åéã§ãããããç§ã¯ããã«åé¡ã®è§£æ±ºã«éäžããŸããã
èæ¯
ç§ãäœã«ã€ããŠè©±ããŠããã®ããæ確ã«ããããã«ãVWO ã«ã€ããŠå°ã説æããŸãã ããã¯ãWeb ãµã€ãäžã§ã¿ãŒã²ãããçµã£ãããŸããŸãªãã£ã³ããŒã³ãéå§ã§ãããã©ãããã©ãŒã ã§ããA/B å®éšã®å®æœã蚪åè ãšã³ã³ããŒãžã§ã³ã®è¿œè·¡ã販売ç®æšå°éããã»ã¹ã®åæãããŒã ãããã®è¡šç€ºã蚪åèšé²ã®åçãªã©ãè¡ããŸãã
ãããããã®ãã©ãããã©ãŒã ã§æãéèŠãªããšã¯ã¬ããŒãã§ãã äžèšã®æ©èœã¯ãã¹ãŠçžäºã«æ¥ç¶ãããŠããŸãã ãŸããäŒæ¥é¡§å®¢ã«ãšã£ãŠãèšå€§ãªéã®æ å ±ã¯ããããåæ圢åŒã§è¡šç€ºãã匷åãªãã©ãããã©ãŒã ããªããã°ãŸã£ãã圹ã«ç«ã¡ãŸããã
ãã©ãããã©ãŒã ã䜿çšãããšã倧èŠæš¡ãªããŒã¿ ã»ããã«å¯ŸããŠã©ã³ãã ãªã¯ãšãªãäœæã§ããŸãã ç°¡åãªäŸã次ã«ç€ºããŸãã
Chrome ã䜿çšãããŠãŒã¶ãŒããŸã㯠(ãšãŒãããã«å± äœããiPhone ã䜿çšãããŠãŒã¶ãŒ) ã®ã<æ¥ä» d1> ãã <æ¥ä» d2> ãŸã§ã®ããŒãžãabc.comãã®ãã¹ãŠã®ã¯ãªãã¯ã衚瀺ããŸãã
ããŒã«æŒç®åã«æ³šæããŠãã ããã ã¯ã©ã€ã¢ã³ãã¯ã¯ãšãª ã€ã³ã¿ãŒãã§ã€ã¹ã§ãããã䜿çšããŠãä»»æã®è€éãªã¯ãšãªãäœæããŠãµã³ãã«ãååŸã§ããŸãã
ãªã¯ãšã¹ããé ã
åé¡ã®ã¯ã©ã€ã¢ã³ãã¯ãçŽæçã«ããã«æ©èœããã¯ãã®äœããè¡ãããšããŠããŸããã
ã/jobsããå«ã URL ãæã€ããŒãžã«ã¢ã¯ã»ã¹ãããŠãŒã¶ãŒã®ãã¹ãŠã®ã»ãã·ã§ã³ ã¬ã³ãŒãã衚瀺ããŸã
ãã®ãµã€ãã«ã¯å€§éã®ãã©ãã£ãã¯ãããããã®ãµã€ãã ã㧠XNUMX äžãè¶ ããäžæã® 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 ããªç§ å®è¡æé: 1431924.650 ããªç§
ã¯ãšãªã¯ 150 äžè¡ãã¯ããŒã«ããŸããã ã¯ãšãª ãã©ã³ããŒã¯ããã€ãã®èå³æ·±ã詳现ã瀺ããŸããããæãããªããã«ããã¯ã¯ãããŸããã§ããã
ãªã¯ãšã¹ããããã«è©³ãã調ã¹ãŠã¿ãŸãããã ã芧ã®ãšããã圌ã¯ããããŸã JOIN
XNUMX ã€ã®ããŒãã«:
- ã»ãã·ã§ã³: ãã©ãŠã¶ããŠãŒã¶ãŒ ãšãŒãžã§ã³ããåœãªã©ã®ã»ãã·ã§ã³æ å ±ã衚瀺ããŸãã
- é²é³ããŒã¿: èšé²ããã URLãããŒãžã蚪åæé
- URLã¯: éåžžã«å€§ã㪠URL ã®éè€ãé¿ãããããURL ã¯å¥ã®ããŒãã«ã«ä¿åãããŸãã
ãŸãããã¹ãŠã®ããŒãã«ããã§ã«ããŒãã£ã·ã§ã³åãããŠããããšã«æ³šæããŠãã ããã account_id
ã ããããããšã§ãXNUMX ã€ã®ç¹ã«å€§èŠæš¡ãªã¢ã«ãŠã³ããä»ã®ã¢ã«ãŠã³ãã«åé¡ãåŒãèµ·ããç¶æ³ãæé€ãããŸãã
æããããæ¢ããŠããŸã
詳ãã調ã¹ããšãç¹å®ã®ãªã¯ãšã¹ãã«äœãåé¡ãããããšãããããŸãã ãã®è¡ã詳ããèŠãŠã¿ã䟡å€ããããŸãã
urls && array(
select id from acc_{account_id}.urls
where url ILIKE '%enterprise_customer.com/jobs%'
)::text[]
æåã«èããã®ã¯ããããã次ã®ãããªçç±ããã§ãã ILIKE
ããããã¹ãŠã®é·ã URL (1,4 äžä»¥äžã® URL ããããŸã) ç¬ç¹ã® ãã®ã¢ã«ãŠã³ãçšã«åéããã URL) ã®ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
ãããããããããããéèŠã§ã¯ãããŸãã!
SELECT id FROM urls WHERE url ILIKE '%enterprise_customer.com/jobs%';
id
--------
...
(198661 rows)
Time: 5231.765 ms
ãã³ãã¬ãŒãæ€çŽ¢ãªã¯ãšã¹ãèªäœã«ã¯ 5 ç§ããããããŸããã XNUMX äžä»¶ã®äžæã® 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 ã®ãµãã¯ãšãªã«åé¡ããªãããããäžåºŠç¢ºèªããããšæããŸããã ãããå®çŸãã XNUMX ã€ã®æ¹æ³ã¯ãåã«æ¬¡ã®ããã«ããããšã§ãã
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
ããã©ãŒãã³ã¹ãåäžããã ã &&
ããã¯ãäœéã¯ãšãªã®ãã¹ãŠã®ããŒãžã§ã³ã«ããã£ãŠæ®ã£ãŠããå¯äžã®å
±éå åã§ããã
èŠãŠ &&
XNUMX ã€ã®é
åéã§å
±éã®èŠçŽ ãèŠã€ããå¿
èŠãããå Žåã«äœ¿çšãããŸãã
å ã®ãªã¯ãšã¹ãã§ã¯æ¬¡ã®ããã«ãªããŸãã
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 ããŒãã«å
šäœãåžžã«æ€çŽ¢ããå¿
èŠããããåžžã«äº€å·®éšåãèŠã€ããå¿
èŠããããŸãã ãããã¯åãªã ID ãåç
§ããŠãããããURL ã¬ã³ãŒãã§çŽæ¥æ€çŽ¢ããããšã¯ã§ããŸããã 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
é
åã«æ¡ä»¶ãçŽæ¥é©çšã§ããããã«ãã 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(*)
å€æ°ã®ç°ãªãããŒã¿ã»ããã«å¯Ÿããäœéã¯ãšãªãšé«éã¯ãšãªã®äž¡æ¹ã§ã 次ã«ãããŒã¿ã®å°ããªãµãã»ããã«ã€ããŠããã¹ãŠã®çµæãæ£ããããšãæåã§æ€èšŒããŸããã
ãã¹ãŠã®ãã¹ãã§äžè²«ããŠè¯å®çãªçµæãåŸãããŸããã ãã¹ãŠãä¿®æ£ããŸããïŒ
åŠãã æèš
ãã®è©±ããã¯ã次ã®ãããªå€ãã®æèšãåŸãããŸãã
- ã¯ãšãª ãã©ã³ã¯ãã¹ãŠãç©èªãããã§ã¯ãããŸããããæããããæäŸããããšã¯ã§ããŸãã
- äž»ãªå®¹çè ãçç¯äººãšã¯éããªã
- é ãã¯ãšãªãå解ããŠããã«ããã¯ãç¹å®ã§ãã
- ãã¹ãŠã®æé©åãæ¬è³ªçã«éå çã§ããããã§ã¯ãããŸãã
- 䜿çš
EXIST
å¯èœã§ããã°ãçç£æ§ã®åçãªåäžã«ã€ãªããå¯èœæ§ããããŸã
åºå
ã¯ãšãªæéã¯çŽ 24 åãã 2 ç§ã«ãªããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸããã ãã®èšäºã¯å€§ã çã«æ²èŒãããŸããããç§ãã¡ãè¡ã£ããã¹ãŠã®å®éšã¯ 1,5 æ¥ã§è¡ãããæé©åãšãã¹ãã«ã¯ 2 ïœ XNUMX æéããã£ããšæšå®ãããŠããŸãã
SQL ã¯ãæããããšããªããã°çŽ æŽãããèšèªã§ãããåŠç¿ããŠäœ¿çšããããã«åªããŠãã ããã SQL ã¯ãšãªãã©ã®ããã«å®è¡ãããããããŒã¿ããŒã¹ãã¯ãšãª ãã©ã³ãçæããæ¹æ³ãã€ã³ããã¯ã¹ãã©ã®ããã«æ©èœãããããããŠåçŽã«æ±ãããŒã¿ã®ãµã€ãºãããç解ããããšã§ãã¯ãšãªã®æé©åãæåãããããšãã§ããŸãã ãã ããããŸããŸãªã¢ãããŒããè©Šãç¶ããããã«ããã¯ãèŠã€ããŠåé¡ããã£ãããšè§£æ±ºããããšãåæ§ã«éèŠã§ãã
ãã®ãããªçµæãéæããæãåªããç¹ã¯ãç®ã«èŠããé床ã®åäžã§ãã以åã¯èªã¿èŸŒãŸããªãã£ãã¬ããŒãããã»ãŒç¬æã«èªã¿èŸŒãŸããããã«ãªããŸããã
ç¹ã«æè¬ããŸã ç§ã®åå¿ãã¡ ã¢ãã£ãã£ã€ã»ãã·ã¥ã©ã®åœä»€ã§, ã¢ãã£ãã£ã€ ã¬ãŠã« О
åºæïŒ habr.com