ʻO ka hoʻonui ʻana i nā nīnau waihona me ka hoʻohana ʻana i ka laʻana o kahi lawelawe B2B no nā mea kūkulu hale

Pehea e hoʻonui ai i 10 mau manawa i ka helu o nā nīnau i ka waihona me ka ʻole o ka neʻe ʻana i kahi kikowaena ʻoi aku ka maikaʻi a mālama i ka hana ʻōnaehana? E haʻi aku wau iā ʻoe pehea mākou i hana ai me ka emi ʻana o ka hana o kā mākou waihona, pehea mākou i hoʻopaʻa pono ai i nā nīnau SQL e lawelawe i nā mea hoʻohana e like me ka hiki a ʻaʻole e hoʻonui i ke kumukūʻai o nā kumuwaiwai helu.

Hana wau i kahi lawelawe no ka hoʻokele ʻana i nā kaʻina hana ʻoihana i nā ʻoihana kūkulu. Ma kahi o 3 tausani mau hui e hana pū me mākou. ʻOi aku ma mua o 10 tausani poʻe e hana pū me kā mākou ʻōnaehana i kēlā me kēia lā no 4-10 mau hola. Hoʻoponopono ia i nā pilikia like ʻole o ka hoʻolālā, hoʻolaha, ʻōlelo aʻo, hōʻoia ... Hoʻohana mākou i ka PostgreSQL 9.6. Loaʻa iā mākou ma kahi o 300 mau papa ma ka waihona a hiki i 200 miliona mau nīnau (10 tausani mau mea like ʻole) loaʻa i kēlā me kēia lā. Ma ka awelika, loaʻa iā mākou he 3-4 tausani mau noi i kēlā me kēia kekona, i nā manawa ikaika loa ma mua o 10 tausani mau noi i kekona. ʻO ka hapa nui o nā nīnau he OLAP. ʻOi aku ka liʻiliʻi o nā mea hoʻohui, hoʻololi a me ka holoi ʻana, ʻo ia hoʻi he māmā ka ukana OLTP. Hāʻawi wau i kēia mau helu āpau i hiki iā ʻoe ke loiloi i ka nui o kā mākou papahana a hoʻomaopopo i ka pono o kā mākou ʻike e hiki ai iā ʻoe.

Kiʻi hoʻokahi. Mele mele

I ka wā i hoʻomaka ai mākou i ka hoʻomohala ʻana, ʻaʻole mākou i noʻonoʻo e pili ana i ke ʻano o ka ukana e hāʻule i ka waihona a me ka mea a mākou e hana ai inā pau ke kikowaena i ka huki ʻana. I ka hoʻolālā ʻana i ka waihona, ua hahai mākou i nā ʻōlelo aʻoaʻo maʻamau a hoʻāʻo ʻaʻole e pana iā mākou iho i ka wāwae, akā ua hele ma mua o ka ʻōlelo aʻoaʻo maʻamau e like me "mai hoʻohana i ke kumu. Nā Waiwai Hiʻona ʻaʻole mākou i komo i loko. Hoʻolālā mākou e pili ana i nā loina o ka normalization, e pale ana i ka redundancy data a ʻaʻole mālama i ka wikiwiki i kekahi mau nīnau. I ka hiki ʻana mai o nā mea hoʻohana mua, ua loaʻa iā mākou kahi pilikia hana. E like me ka mea maʻamau, ʻaʻole mākaukau loa mākou no kēia. Ua maʻalahi nā pilikia mua. Ma keʻano he kūlana, ua hoʻoholoʻia nā mea a pau ma ka hoʻohuiʻana i kahi index hou. Akā ua hiki mai ka manawa i pau ai ka hana ʻana o nā ʻāpana maʻalahi. I ka ʻike ʻana he nele mākou i ka ʻike a ke ulu nei ka paʻakikī iā mākou e hoʻomaopopo i ke kumu o nā pilikia, ua hoʻolimalima mākou i nā loea i kōkua iā mākou e hoʻonohonoho pono i ka server, hoʻopili i ka nānā ʻana, a hōʻike iā mākou i kahi e nānā ai. helu helu.

Kiʻi ʻelua. Heluhelu

No laila, loaʻa iā mākou ma kahi o 10 tausani mau nīnau like ʻole i hoʻokō ʻia ma kā mākou waihona i kēlā me kēia lā. ʻO kēia mau 10 tausani, aia nā monsters i hoʻokō ʻia 2-3 miliona mau manawa me ka manawa hoʻokō awelika o 0.1-0.3 ms, a aia nā nīnau me ka manawa hoʻokō awelika o 30 kekona i kapa ʻia ʻo 100 mau manawa i ka lā.

ʻAʻole hiki ke hoʻonui i nā nīnau he 10 tausani, no laila ua hoʻoholo mākou e noʻonoʻo i kahi e kuhikuhi ai i kā mākou mau hana i mea e hoʻomaikaʻi pono ai i ka hana o ka waihona. Ma hope o kekahi mau hoʻololi, hoʻomaka mākou e puʻunaue i nā noi i nā ʻano.

Nā noi TOP

ʻO kēia nā nīnau koʻikoʻi loa e lawe i ka manawa nui (ka nui o ka manawa). ʻO kēia nā nīnau i kapa pinepine ʻia a i ʻole nā ​​nīnau e lōʻihi loa ka hoʻokō ʻana (ua hoʻokō ʻia nā nīnau lōʻihi a pinepine ʻia i nā hoʻomaka mua o ka hakakā no ka wikiwiki). ʻO ka hopena, hoʻohana ka server i ka manawa nui loa i kā lākou hoʻokō. Eia kekahi, he mea nui e hoʻokaʻawale i nā noi kiʻekiʻe e ka manawa o ka hoʻokō a hoʻokaʻawale ʻia e ka manawa IO. ʻOkoʻa iki nā ala no ka hoʻonui ʻana i ia mau nīnau.

ʻO ka hana maʻamau o nā hui āpau e hana me nā noi TOP. He liʻiliʻi o lākou; ʻo ka hoʻonui ʻana i hoʻokahi nīnau hiki ke hoʻokuʻu i 5-10% o nā kumuwaiwai. Eia nō naʻe, i ka wā e oʻo ai ka papahana, ʻo ka hoʻonui ʻana i nā nīnau TOP e lilo i hana maʻalahi ʻole. Ua hana mua ʻia nā ʻano maʻalahi a pau, a ʻo ka noi "kaumaha" loa e lawe "wale nō" 3-5% o nā kumuwaiwai. Inā ʻoi aku ka liʻiliʻi o nā nīnau TOP ma mua o 30-40% o ka manawa, a laila ua hoʻāʻo paha ʻoe e hana wikiwiki a hiki i ka manawa e neʻe ai i ka hoʻonui ʻana i nā nīnau mai ka hui aʻe.
Ke waiho nei ka pane i ka nīnau o ka nui o nā nīnau kiʻekiʻe e pono e hoʻokomo i kēia hui. Lawe pinepine au i ka 10, akā ʻaʻole ʻoi aku ma mua o 20. Ke hoʻāʻo nei au e hōʻoia i ka ʻokoʻa o ka manawa o ka mua a me ka hope i ka hui TOP ma mua o 10 mau manawa. ʻO ia hoʻi, inā hāʻule nui ka manawa hoʻokō nīnau mai ka wahi 1 a i ka 10, a laila lawe wau iā TOP-10, inā ʻoi aku ka mālie o ka hāʻule, a laila hoʻonui au i ka nui o ka hui i 15 a i ʻole 20.
ʻO ka hoʻonui ʻana i nā nīnau waihona me ka hoʻohana ʻana i ka laʻana o kahi lawelawe B2B no nā mea kūkulu hale

poe mahiai waena

ʻO kēia nā noi āpau e hiki koke mai ma hope o TOP, koe wale nō ka 5-10% hope loa. ʻO ka maʻamau, i ka hoʻonui ʻana i kēia mau nīnau e waiho i ka manawa e hoʻonui nui ai i ka hana o ka server. Hiki i kēia mau noi ke kaumaha a hiki i 80%. Akā inā ʻoi aku ka nui o kā lākou ʻāpana i ka 50%, a laila ua hiki i ka manawa e nānā pono iā lākou.

huelo

E like me ka mea i ʻōlelo ʻia, hiki mai kēia mau nīnau i ka hopena a lawe i ka 5-10% o ka manawa. Hiki iā ʻoe ke poina iā lākou inā ʻaʻole ʻoe e hoʻohana i nā hāmeʻa hoʻopaʻa noiʻi maʻamau, a laila hiki ke maʻalahi ka hoʻonui ʻana iā lākou.

Pehea e loiloi ai i kēlā me kēia hui?

Ke hoʻohana nei au i kahi nīnau SQL e kōkua ana i ka hana ʻana i kēlā loiloi no PostgreSQL (Ua maopopo iaʻu e hiki ke kākau ʻia kahi nīnau like no nā DBMS ʻē aʻe)

Nīnau SQL e koho i ka nui o nā pūʻulu TOP-MEDIUM-TAIL

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

ʻO ka hopena o ka nīnau he ʻekolu kolamu, aia kēlā me kēia me ka pākēneka o ka manawa e hana ai i nā nīnau mai kēia pūʻulu. Aia i loko o ka noi ʻelua mau helu (i koʻu hihia ʻo 20 a me 800) e hoʻokaʻawale i nā noi mai kahi hui mai kekahi.

ʻO kēia ke ʻano o ka hoʻohālikelike ʻana o nā ʻāpana o nā noi i ka manawa i hoʻomaka ai ka hana loiloi a i kēia manawa.

ʻO ka hoʻonui ʻana i nā nīnau waihona me ka hoʻohana ʻana i ka laʻana o kahi lawelawe B2B no nā mea kūkulu hale

Hōʻike ke kiʻikuhi i ka emi ʻana o ka māhele o nā noi TOP, akā ua hoʻonui ʻia ka "poʻe mahiʻai waena".
I ka wā mua, ua komo nā noi TOP i nā hewa. I ka wā lōʻihi, ua nalowale nā ​​​​maʻi kamaliʻi, ua emi ka māhele o nā noi TOP, a ʻoi aku ka nui o nā hoʻoikaika e hoʻoikaika i nā noi paʻakikī.

No ka loaʻa ʻana o ke kikokikona o nā noi, hoʻohana mākou i kēia noi

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

Eia ka papa inoa o nā ʻenehana maʻamau i kōkua iā mākou e wikiwiki i nā nīnau TOP:

  • Hoʻolālā hou i ka ʻōnaehana, no ka laʻana, hana hou i ka loiloi hoʻolaha me ka hoʻohana ʻana i kahi mea kūʻai leka ma mua o nā nīnau manawa i ka waihona.
  • Hoʻohui a hoʻololi paha i nā kuhikuhi
  • Ke kākau hou ʻana i nā nīnau ORM i SQL maʻemaʻe
  • Ke kākau hou ʻana i ka loiloi hoʻoili ʻikepili palaualelo
  • Hoʻopiʻi ma o ka denormalization ʻikepili. No ka laʻana, loaʻa iā mākou kahi pilina papaʻaina Delivery -> Invoice -> Noi -> Noi. ʻO ia hoʻi, pili kēlā me kēia hāʻawi ʻana i kahi noi ma o nā papa ʻē aʻe. I ʻole e hoʻopili i nā papa ʻaina a pau i kēlā me kēia noi, ua kope mākou i ka loulou i ka noi ma ka papa Hoʻouna.
  • Hoʻopili i nā papa static me nā puke kuhikuhi a ʻaʻole hiki ke hoʻololi i nā papa ma ka hoʻomanaʻo papahana.

I kekahi manawa ua hoʻololi hou ʻia nā loli, akā hāʻawi lākou i ka 5-10% o ka ukana ʻōnaehana a ua ʻāpono ʻia. I ka hala ʻana o ka manawa, ua liʻiliʻi a liʻiliʻi ka pauku, a ua koi ʻia ka hoʻolālā hou ʻana a me ka koʻikoʻi.

A laila ua huli mākou i ko mākou manaʻo i ka hui ʻelua o nā noi - ka hui o nā mahiʻai waena. Nui nā nīnau hou aʻe i loko a me he mea lā e lōʻihi ka manawa e nānā ai i ka hui holoʻokoʻa. Eia nō naʻe, ʻo ka hapa nui o nā nīnau he mea maʻalahi loa ka hoʻoponopono ʻana, a ua hana hou ʻia nā pilikia he nui i nā manawa he nui i nā ʻano like ʻole. Eia nā hiʻohiʻona o kekahi mau loiloi maʻamau a mākou i hoʻopili ai i ka nui o nā nīnau like a ʻo kēlā me kēia hui o nā nīnau i hoʻopaʻa ʻia i wehe i ka waihona e 3-5%.

  • Ma kahi o ka nānā ʻana i ka loaʻa ʻana o nā moʻolelo me ka hoʻohana ʻana i ka COUNT a me ka nānā ʻana i ka papaʻaina piha, ua hoʻomaka ʻo EXISTS e hoʻohana
  • Hoʻopau iā DISTINCT (ʻaʻohe mea ʻai maʻamau, akā i kekahi manawa hiki iā ʻoe ke hoʻopau iā ia ma ka wikiwiki ʻana i ka noi ma 10-100 mau manawa).

    No ka laʻana, ma kahi o kahi nīnau e koho i nā mea hoʻokele a pau mai kahi papaʻaina nui o ka lawe ʻana (DELIVERY)

    SELECT DISTINCT P.ID, P.FIRST_NAME, P.LAST_NAME
    FROM DELIVERY D JOIN PERSON P ON D.DRIVER_ID = P.ID
    

    i nīnau ma kahi pākaukau liʻiliʻi 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)
    

    Me he mea lā ua hoʻohana mākou i kahi subquery i hoʻopili ʻia, akā hāʻawi ia i ka wikiwiki ma mua o 10 mau manawa.

  • I nā manawa he nui, ua haʻalele loa ʻia ʻo COUNT a
    pani ʻia e ka helu ʻana i ka waiwai pili
  • ma kahi o
    UPPER(s) LIKE JOHN%’ 
    

    hoʻohana

    s ILIKE “John%”
    

Ua wikiwiki ʻia kēlā me kēia noi kikoʻī e 3-1000 mau manawa. ʻOiai ʻo ka hana hoʻohiwahiwa, i ka wā mua, ua manaʻo mākou ʻaʻohe kumu o ka hoʻonui ʻana i kahi nīnau e hoʻopau ai i 10 ms, ʻo ia kekahi o nā nīnau koʻikoʻi 3 haneli, a lawe i ka hapahaneri o ka pākēneka o ka manawa hoʻouka ʻikepili holoʻokoʻa. Akā ma ka hoʻohana ʻana i ka meaʻai hoʻokahi i kahi hui o nā nīnau o ke ʻano like, ua lanakila mākou i kekahi mau pakeneka. I mea e pau ʻole ai ka manawa no ka nānā lima ʻana i nā haneli nīnau a pau, ua kākau mākou i kekahi mau palapala maʻalahi i hoʻohana i nā ʻōlelo maʻamau e ʻimi i nā nīnau o ke ʻano like. ʻO ka hopena, ʻo ka ʻimi ʻakomi ʻana i nā hui o nā nīnau i ʻae iā mākou e hoʻomaikaʻi hou i kā mākou hana me ka hoʻoikaika haʻahaʻa.

ʻO ka hopena, ua hana mākou ma ka ʻenehana like ʻole no ʻekolu makahiki i kēia manawa. ʻO ka awelika o kēlā me kēia lā e pili ana i 30%, ma nā kiʻekiʻe a hiki i 70%. ʻO ka nui o nā noi, a me ka helu o nā mea hoʻohana, ua hoʻonui ʻia ma kahi o 10 mau manawa. A mahalo kēia mau mea i ka nānā mau ʻana i kēia mau pūʻulu o nā noi TOP-MEDIUM. Ke ʻike koke ʻia kahi noi hou i ka pūʻulu TOP, e nānā koke mākou iā ia a hoʻāʻo e wikiwiki. Nānā mākou i ka pūʻulu MEDIUM i hoʻokahi pule me ka hoʻohana ʻana i nā palapala noiʻi noiʻi. Inā ʻike mākou i nā nīnau hou a mākou i ʻike ai pehea e hoʻonui ai, hoʻololi koke mākou iā lākou. I kekahi manawa, ʻike mākou i nā ʻano hana loiloi hou e hiki ke hoʻopili ʻia i kekahi mau nīnau i ka manawa hoʻokahi.

Wahi a kā mākou mau wānana, e kū ka server o kēia manawa i ka hoʻonui ʻana i ka helu o nā mea hoʻohana e kekahi 3-5 mau manawa. ʻOiaʻiʻo, loaʻa iā mākou hoʻokahi ace hou i ko mākou lima - ʻaʻole mākou i hoʻololi i nā nīnau SELECT i ke aniani, e like me ka mea i ʻōlelo ʻia. Akā ʻaʻole mākou e hana i kēia me ka noʻonoʻo, no ka mea, makemake mākou e hoʻopau mua i nā hiki o ka "smart" optimization ma mua o ka hoʻohuli ʻana i ka "heavy artillery".
ʻO ka nānā koʻikoʻi i ka hana i hana ʻia e manaʻo ʻia e hoʻohana i ka scaling vertical. E kūʻai i kahi kikowaena ʻoi aku ka ikaika ma mua o ka hoʻopau ʻana i ka manawa o nā loea. ʻAʻole paha ke kumu kūʻai nui o ke kikowaena, ʻoiai ʻaʻole mākou i pau i nā palena o ka hoʻonui ʻia ʻana. Eia naʻe, hoʻonui wale ka nui o nā noi i 10 mau manawa. I loko o nā makahiki he nui, ua hoʻonui ka hana o ka ʻōnaehana a i kēia manawa ua nui nā ʻano noi. Mahalo i ka cache, hana ʻia ka hana i loaʻa i nā noi liʻiliʻi, a me nā noi ʻoi aku ka maikaʻi. ʻO ia ke ʻano hiki iā ʻoe ke hoʻonui palekana me kahi 5 ʻē aʻe e kiʻi i ka coefficient wikiwiki maoli. No laila, e like me nā koho conservative, hiki iā mākou ke ʻōlelo he 50 mau manawa a ʻoi aku ka wikiwiki. ʻO ka hoʻoluliluli ʻana i kahi kikowaena he 50 mau manawa hou aku. ʻOi aku ka noʻonoʻo ʻana i ka wā e hoʻokō ʻia ai ka optimization e hana i nā manawa āpau, a hiki mai ka bila no ke kikowaena hoʻolimalima i kēlā me kēia mahina.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka