çç£æ§ã®é«ããµãŒããŒã«ç§»è¡ããã«ããŒã¿ããŒã¹ãžã®ã¯ãšãªæ°ã 10 åã«å¢ãããã·ã¹ãã æ©èœãç¶æããã«ã¯ã©ãããã°ããã§ãããã? ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ã®äœäžã«ã©ã®ããã«å¯ŸåŠããããã§ããã ãå€ãã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããã³ã³ãã¥ãŒãã£ã³ã° ãªãœãŒã¹ã®ã³ã¹ããå¢å ãããªãããã« SQL ã¯ãšãªãã©ã®ããã«æé©åãããã«ã€ããŠèª¬æããŸãã
建èšäŒç€Ÿã®æ¥åããã»ã¹ã管çãããµãŒãã¹ãäœã£ãŠããŸãã çŽ3瀟ãåœç€ŸãšææºããŠããŸãã 10 äžäººä»¥äžãåœç€Ÿã®ã·ã¹ãã ãæ¯æ¥ 4 ïœ 10 æé䜿çšããŠããŸãã èšç»ãéç¥ãèŠåãæ€èšŒãªã©ã®ããŸããŸãªåé¡ã解決ããŸããPostgreSQL 9.6 ã䜿çšããŸãã ããŒã¿ããŒã¹ã«ã¯çŽ 300 ã®ããŒãã«ããããæ¯æ¥æ倧 200 åã®ã¯ãšãª (10 äžã®ç°ãªãã¯ãšãª) ãåä¿¡ãããŸãã å¹³åã㊠3 ç§ããã 4 ïœ 10 件ã®ãªã¯ãšã¹ãããããæãã¢ã¯ãã£ããªæç¹ã§ã¯ XNUMX ç§ããã XNUMX 件以äžã®ãªã¯ãšã¹ãããããŸãã ã»ãšãã©ã®ã¯ãšãªã¯ OLAP ã§ãã è¿œå ãå€æŽãåé€ãã¯ããã«å°ãªããOLTP ã®è² è·ãæ¯èŒç軜ãããšãæå³ããŸãã ããããã¹ãŠã®æ°åãæäŸããã®ã¯ãçãããç§ãã¡ã®ãããžã§ã¯ãã®èŠæš¡ãè©äŸ¡ããç§ãã¡ã®çµéšãã©ãã ã圹ç«ã€ããç解ããŠããã ãããã§ãã
åçXNUMXã åæ ç
éçºãéå§ãããšããããŒã¿ããŒã¹ã«ã©ã®ãããªè² è·ããããã®ãããµãŒããŒããã«ãåæ¢ããå Žåã«ã©ãããã®ãã«ã€ããŠã¯ããŸãèããŠããŸããã§ããã ããŒã¿ããŒã¹ãèšèšãããšããç§ãã¡ã¯äžè¬çãªæšå¥šäºé
ã«åŸããèªåèªèº«ãå·ã€ããªãããåªããŸããããããã¿ãŒã³ã䜿çšããªãã§ãã ããããªã©ã®äžè¬çãªã¢ããã€ã¹ãè¶
ããŸããã
åçXNUMXã çµ±èšç
ãããã£ãŠãããŒã¿ããŒã¹ã§ã¯ 10 æ¥ã«çŽ 10 åã®ç°ãªãã¯ãšãªãå®è¡ãããŸãã ãã® 2 äžä»¶ã®äžã«ã¯ãå¹³åå®è¡æéã 3 ïœ 0.1 ããªç§ã§ 0.3 ïœ 30 äžåå®è¡ãããã¢ã³ã¹ã¿ãŒãããŸãããŸãã100 æ¥ããã XNUMX ååŒã³åºãããå¹³åå®è¡æé XNUMX ç§ã®ã¯ãšãªããããŸãã
10 件ã®ã¯ãšãªãã¹ãŠãæé©åããããšã¯äžå¯èœã ã£ãã®ã§ãããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ãæ£ããåäžãããããã«ã©ãã«åã泚ãã¹ãããå€æããããšã«ããŸããã æ°åã®ç¹°ãè¿ãã®åŸããªã¯ãšã¹ããã¿ã€ãã«åå²ãå§ããŸããã
ããããªã¯ãšã¹ã
ãããã¯ãæãæé (åèšæé) ããããæãéãã¯ãšãªã§ãã ãããã¯ãéåžžã«é »ç¹ã«åŒã³åºãããã¯ãšãªããŸãã¯å®è¡ã«éåžžã«é·ãæéããããã¯ãšãªã§ã (é·ãé »ç¹ã«åŒã³åºãããã¯ãšãªã¯ãé床ãè¿œæ±ããæåã®å埩ã§æé©åãããŸãã)ã ãã®çµæããµãŒããŒã¯ãã®å®è¡ã«æãå€ãã®æéãè²»ãããŸãã ããã«ãäžäœã®ãªã¯ãšã¹ããåèšå®è¡æéããšã«åããããIO æéããšã«åãããããããšãéèŠã§ãã ãã®ãããªã¯ãšãªãæé©åããæ¹æ³ã¯è¥å¹²ç°ãªããŸãã
ãã¹ãŠã®äŒæ¥ã®éåžžã®æ
£è¡ã¯ãTOP ãªã¯ãšã¹ãã«å¯ŸåŠããããšã§ãã ãããã¯ã»ãšãã©ãããŸãããã¯ãšãªã 5 ã€æé©åããã ãã§ãããªãœãŒã¹ã® 10 ïœ 3% ã解æŸã§ããŸãã ãã ãããããžã§ã¯ããæçããã«ã€ããŠãTOP ã¯ãšãªã®æé©åã¯ãŸããŸãç°¡åãªã¿ã¹ã¯ã§ã¯ãªããªããŸãã ç°¡åãªæ¹æ³ã¯ãã¹ãŠãã§ã«è§£æ±ºãããŠãããæããéãããªã¯ãšã¹ãã§ããªãœãŒã¹ã®ããããã 5 ïœ 30% ããããããŸããã TOP ã¯ãšãªã«ãããæéãåèšã§ 40 ïœ XNUMX% æªæºã§ããå Žåã¯ãããããè¿
éã«åäœãããããã®åªåããã§ã«è¡ã£ãŠããå¯èœæ§ãé«ãã次ã®ã°ã«ãŒãã®ã¯ãšãªã®æé©åã«é²ãææãæ¥ãŠããŸãã
ãã®ã°ã«ãŒãã«äžäœã¯ãšãªãããã€å«ããã¹ãããšããçåã«çããå¿
èŠããããŸãã ç§ã¯éåžžãå°ãªããšã 10 åãæ倧 20 åãèšé²ããŸããTOP ã°ã«ãŒãã®æåãšæåŸã®ã¿ã€ã ã®å·®ã 10 å以å
ã«ãªãããã«åªããŸãã ã€ãŸããã¯ãšãªå®è¡æéã 1 äœãã 10 äœãŸã§æ¥æ¿ã«äœäžããå Žå㯠TOP-10 ãæ¡çšããäœäžãããç·©ãããªå Žåã¯ã°ã«ãŒã ãµã€ãºã 15 ãŸã㯠20 ã«å¢ãããŸãã
äžèŸ²æ°
æåŸã® 5 ïœ 10% ãé€ããŠããããã¯ãã¹ãŠ TOP ã®çŽåŸã«æ¥ããªã¯ãšã¹ãã§ãã éåžžããããã®ã¯ãšãªãæé©åãããšããµãŒããŒã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã ãããã®ãªã¯ãšã¹ãã®éã¿ã¯æ倧 80% ã«éããå ŽåããããŸãã ããããããšããã®ã·ã§ã¢ã 50% ãè¶ ããŠãããšããŠããããæ éã«æ€èšããææãæ¥ãŠããŸãã
ãã£ãœ
åè¿°ããããã«ããããã®ã¯ãšãªã¯æåŸã«çºçããæéã® 5 ïœ 10% ããããŸãã èªåã¯ãšãªåæããŒã«ã䜿çšããªãå Žåã«éããããããå¿ããŠãåé¡ãããŸããããã®å Žåã¯ãæé©åã®ã³ã¹ããäœããªãå¯èœæ§ããããŸãã
åã°ã«ãŒããã©ã®ããã«è©äŸ¡ããã?
ç§ã¯ãPostgreSQL ã«å¯ŸããŠãã®ãããªè©äŸ¡ãè¡ãã®ã«åœ¹ç«ã€ SQL ã¯ãšãªã䜿çšããŠããŸã (ä»ã®å€ãã® DBMS ã«å¯ŸããŠãåæ§ã®ã¯ãšãªãäœæã§ãããšæããŸã)ã
TOP-MEDIUM-TAIL ã°ã«ãŒãã®ãµã€ãºãèŠç©ããããã® SQL ã¯ãšãª
SELECT sum(time_top) AS sum_top, sum(time_medium) AS sum_medium, sum(time_tail) AS sum_tail
FROM
(
SELECT CASE WHEN rn <= 20 THEN tt_percent ELSE 0 END AS time_top,
CASE WHEN rn > 20 AND rn <= 800 THEN tt_percent ELSE 0 END AS time_medium,
CASE WHEN rn > 800 THEN tt_percent ELSE 0 END AS time_tail
FROM (
SELECT total_time / (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query,
ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn
FROM pg_stat_statements
ORDER BY total_time DESC
) AS t
)
AS ts
ã¯ãšãªã®çµæ㯠20 ã€ã®åã§ãååã«ã¯ãã®ã°ã«ãŒãããã®ã¯ãšãªã®åŠçã«ãããæéã®å²åãå«ãŸããŸãã ãªã¯ãšã¹ãå ã«ã¯ãããã°ã«ãŒãããã®ãªã¯ãšã¹ããå¥ã®ã°ã«ãŒãããåºå¥ãã 800 ã€ã®çªå· (ç§ã®å Žå㯠XNUMX ãš XNUMX) ããããŸãã
ããã¯ãæé©åäœæ¥ãéå§ãããæç¹ãšçŸåšã®ãªã¯ãšã¹ãã®ã·ã§ã¢ã倧ãŸãã«æ¯èŒãããã®ã§ãã
ãã®å³ã¯ãTOP ãªã¯ãšã¹ãã®ã·ã§ã¢ãæ¥æ¿ã«æžå°ããŠããäžæ¹ã§ããäžç£éçŽããå¢å ããŠããããšã瀺ããŠããŸãã
åœåãTOP ã®èŠæ±ã«ã¯æãããªå€±æãå«ãŸããŠããŸããã æéãçµã€ã«ã€ããŠãå°å
çŸæ£ã¯ãªããªããTOP ãªã¯ãšã¹ãã®å²åã¯æžå°ããå°é£ãªãªã¯ãšã¹ããã¹ããŒãã¢ããããããã«ãŸããŸãåªåããå¿
èŠããããŸããã
ãªã¯ãšã¹ãã®ããã¹ããååŸããã«ã¯ã次ã®ãªã¯ãšã¹ãã䜿çšããŸã
SELECT * FROM (
SELECT ROW_NUMBER () OVER (ORDER BY total_time DESC) AS rn, total_time / (SELECT sum(total_time) FROM pg_stat_statements) * 100 AS tt_percent, query
FROM pg_stat_statements
ORDER BY total_time DESC
) AS T
WHERE
rn <= 20 -- TOP
-- rn > 20 AND rn <= 800 -- MEDIUM
-- rn > 800 -- TAIL
以äžã¯ãTOP ã¯ãšãªã®é«éåã«åœ¹ç«ã€æãäžè¬çã«äœ¿çšããããã¯ããã¯ã®ãªã¹ãã§ãã
- ã·ã¹ãã ã®åèšèšãããšãã°ãããŒã¿ããŒã¹ãžã®å®æçãªã¯ãšãªã®ä»£ããã«ã¡ãã»ãŒãž ãããŒã«ãŒã䜿çšããŠéç¥ããžãã¯ãåäœæããŸãã
- ã€ã³ããã¯ã¹ã®è¿œå ãŸãã¯å€æŽ
- ORM ã¯ãšãªãçŽç²ãª SQL ã«æžãçŽã
- é 延ããŒã¿èªã¿èŸŒã¿ããžãã¯ã®æžãæã
- ããŒã¿ã®éæ£èŠåã«ãããã£ãã·ã¥ã ããšãã°ãçŽå -> è«æ±æž -> èŠæ± -> ç³è«ãšããããŒãã«æ¥ç¶ããããŸãã ã€ãŸããåé ä¿¡ã¯ä»ã®ããŒãã«ãéããŠã¢ããªã±ãŒã·ã§ã³ã«é¢é£ä»ããããŸãã åãªã¯ãšã¹ãã®ãã¹ãŠã®ããŒãã«ããªã³ã¯ããªãããã«ããããã«ãé ä¿¡ããŒãã«å ã®ãªã¯ãšã¹ããžã®ãªã³ã¯ãè€è£œããŸããã
- åèæžç±ã䜿çšããŠéçããŒãã«ããã£ãã·ã¥ããããã°ã©ã ã¡ã¢ãªå ã®ããŒãã«ãã»ãšãã©å€æŽããªãã
å Žåã«ãã£ãŠã¯ãå€æŽã«ãã£ãŠå°è±¡çãªåèšèšãè¡ãããããšããããŸããããã·ã¹ãã è² è·ã® 5 ïœ 10% ãçºçããæ£åœåãããŸããã æéãçµã€ã«ã€ããŠãææ°è£ 眮ã¯ãŸããŸãå°ãããªãããŸããŸãæ¬æ Œçãªåèšèšãå¿ èŠã«ãªããŸããã
次ã«ãç§ãã¡ã¯ 3 çªç®ã®ã°ã«ãŒãã®èŠæ±ãã€ãŸãäžèŸ²æ°ã®ã°ã«ãŒãã«æ³šç®ããŸããã ããã«å€ãã®ã¯ãšãªãå«ãŸããŠãããã°ã«ãŒãå šäœãåæããã«ã¯ããªãã®æéããããããã«èŠããŸããã ãã ããã»ãšãã©ã®ã¯ãšãªã¯æé©åãéåžžã«ç°¡åã§ããããšãå€æããå€ãã®åé¡ãããŸããŸãªããªãšãŒã·ã§ã³ã§äœååãç¹°ââãè¿ãããŸããã ããã§ã¯ãæ°åã®åæ§ã®ã¯ãšãªã«é©çšããå žåçãªæé©åã®äŸã瀺ããŸããæé©åãããã¯ãšãªã®åã°ã«ãŒãã¯ãããŒã¿ããŒã¹ã 5 ïœ XNUMX% ã¢ã³ããŒãããŸããã
- COUNT ãšå šããŒãã« ã¹ãã£ã³ã䜿çšããŠã¬ã³ãŒãã®ååšããã§ãã¯ãã代ããã«ãEXISTS ã䜿çšããå§ããŸããã
- DISTINCT ãåé€ããŸãã (äžè¬çãªã¬ã·ãã¯ãããŸãããããªã¯ãšã¹ãã 10 ïœ 100 åé«éåããããšã§ç°¡åã«åé€ã§ããå ŽåããããŸã)ã
ããšãã°ãé éã«é¢ãã倧ããªããŒãã« (DELIVERY) ãããã¹ãŠã®ãã©ã€ããŒãéžæããã¯ãšãªã®ä»£ããã«
SELECT DISTINCT P.ID, P.FIRST_NAME, P.LAST_NAME FROM DELIVERY D JOIN PERSON P ON D.DRIVER_ID = P.ID
æ¯èŒçå°ããªããŒãã« PERSON ã«å¯ŸããŠã¯ãšãªãå®è¡ããŸãã
SELECT P.ID, P.FIRST_NAME, P.LAST_NAME FROM PERSON WHERE EXISTS(SELECT D.ID FROM DELIVERY WHERE D.DRIVER_ID = P.ID)
çžé¢ãµãã¯ãšãªã䜿çšããããã«èŠããŸããã10 å以äžã®é«éåãåŸãããŸãã
- å€ãã®å ŽåãCOUNT ã¯å®å
šã«æŸæ£ããã
è¿äŒŒå€ã®èšç®ã«çœ®ãæãã - 代ããã«
UPPER(s) LIKE JOHN%â
䜿çš
s ILIKE âJohn%â
ããããã®ç¹å®ã®ãªã¯ãšã¹ãã 3 ïœ 1000 åé«éåãããããšããããŸããã çŽ æŽãããããã©ãŒãã³ã¹ã«ãããããããæåã¯ãå®äºãŸã§ã« 10 ããªç§ãããã3 çªç®ã«éãã¯ãšãªã® XNUMX ã€ã§ãããããŒã¿ããŒã¹å šäœã®èªã¿èŸŒã¿æéã® XNUMX åã® XNUMX ãå ããã¯ãšãªãæé©åããããšã«æå³ããªããšæãããŸããã ããããåãã¬ã·ããåãã¿ã€ãã®ã¯ãšãªã®ã°ã«ãŒãã«é©çšããããšã§ãæ°ããŒã»ã³ãã®å©çãåŸãããšãã§ããŸããã äœçŸãã®ã¯ãšãªããã¹ãŠæåã§ç¢ºèªããæéãç¡é§ã«ããªãããã«ãæ£èŠè¡šçŸã䜿çšããŠåãã¿ã€ãã®ã¯ãšãªãæ€çŽ¢ããç°¡åãªã¹ã¯ãªãããããã€ãäœæããŸããã ãã®çµæãã¯ãšãªã®ã°ã«ãŒããèªåçã«æ€çŽ¢ããããšã§ãé©åºŠãªåŽåã§ããã©ãŒãã³ã¹ãããã«åäžãããããšãã§ããŸããã
ãã®çµæãç§ãã¡ã¯ 30 幎éåãããŒããŠã§ã¢ã«åãçµãã§ããŸããã 70 æ¥ã®å¹³åè² è·ã¯çŽ 10%ãããŒã¯æã«ã¯ XNUMX% ã«éããŸãã ãªã¯ãšã¹ãæ°ããŠãŒã¶ãŒæ°ãçŽXNUMXåã«å¢å ããŸããã ããã¯ãã¹ãŠãTOP-MEDIUM ãªã¯ãšã¹ãã®åãã°ã«ãŒããç¶ç¶çã«ç£èŠããŠãããããã§ãã TOPã°ã«ãŒãã«æ°ãããªã¯ãšã¹ããçŸãããšããã«ãããåæããé«éåãè©Šã¿ãŸãã ç§ãã¡ã¯ã¯ãšãªåæã¹ã¯ãªããã䜿çšããŠé±ã« XNUMX å MEDIUM ã°ã«ãŒããã¬ãã¥ãŒããŸãã æé©åæ¹æ³ããã§ã«ããã£ãŠããæ°ããã¯ãšãªã«ééããå Žåã¯ãããã«å€æŽããŸãã å Žåã«ãã£ãŠã¯ãäžåºŠã«è€æ°ã®ã¯ãšãªã«é©çšã§ããæ°ããæé©åæ¹æ³ãèŠã€ããããšããããŸãã
åœç€Ÿã®äºæž¬ã«ããã°ãçŸåšã®ãµãŒããŒã¯ãŠãŒã¶ãŒæ°ãããã« 3 ïœ 5 åå¢å ããŠãèãããããšèããããŸãã 確ãã«ãç§ãã¡ã«ã¯ãã XNUMX ã€åãæããããŸããæšå¥šãããŠããããã«ããŸã SELECT ã¯ãšãªããã©ãŒã«è»¢éããŠããŸããã ããããç§ãã¡ã¯ãããæèçã«è¡ã£ãŠããããã§ã¯ãããŸããããªããªãããéç ²ãããªã³ã«ããåã«ããŸããã¹ããŒãããªæé©åã®å¯èœæ§ãå®å
šã«äœ¿ãå°œããããããã§ãã
è¡ãããäœæ¥ãæ¹å€çã«èŠããšãåçŽã¹ã±ãŒãªã³ã°ã®äœ¿çšãææ¡ãããå ŽåããããŸãã å°é家ã®æéãç¡é§ã«ããã®ã§ã¯ãªãããã匷åãªãµãŒããŒã賌å
¥ããŠãã ããã ç¹ã«åçŽæ¹åã®ã¹ã±ãŒãªã³ã°ã®éçããŸã 䜿ãæãããŠããªãããããµãŒããŒã«ã¯ããã»ã©ã³ã¹ããããããªãå¯èœæ§ããããŸãã ãã ãããªã¯ãšã¹ãã®æ°ã ãã 10 åã«å¢å ããŸããã æ°å¹Žã®éã«ã·ã¹ãã ã®æ©èœãå¢å ãããªã¯ãšã¹ãã®çš®é¡ãå¢ããŸããã ãã£ãã·ã¥ã®ãããã§ãæ¢åã®æ©èœã¯ããå°ãªããªã¯ãšã¹ãã§å®è¡ãããããå¹ççãªãªã¯ãšã¹ããå®è¡ãããŸãã ããã¯ãå®å
šã«ããã« 5 ãæããŠå®éã®å éä¿æ°ãååŸã§ããããšãæå³ããŸãã ãããã£ãŠãæãæ§ããã«èŠç©ãã£ãŠããå é㯠50 å以äžã§ãããšèšããŸãã ãµãŒããŒãåçŽã«ã¹ã€ã³ã°ãããšã50 åã®ã³ã¹ããããããŸãã ç¹ã«ãäžåºŠæé©åãå®è¡ãããšåžžã«åäœããã¬ã³ã¿ã«ãµãŒããŒã®æéãæ¯æè«æ±ãããããšãèæ
®ãããšã
åºæïŒ habr.com