Агар он дарк кунад, ки ягон дархост аз маҳдудияте, ки шумо ба он гуфта будед, дарозтар иҷро мешавад, ин мекунад «тасвири» нақшаи ин дархост ва онҳоро якҷоя дар журнал менависад.
Ҳоло ҳама чиз хуб ба назар мерасад, мо ба назди чӯб меравем ва дар онҷо мебинем... [матнӣ поймол]. Аммо мо дар ин бора чизе гуфта наметавонем, ба истиснои он, ки ин нақшаи олӣ аст, зеро барои иҷрои он 11ms вақт лозим буд.
Ба назар чунин мерасад, ки ҳама чиз хуб аст - аммо ҳеҷ чиз маълум нест, ки воқеан чӣ рух додааст. Ба ғайр аз вақти умумӣ, мо воқеан чизе намебинем. Зеро ба чунин «барра»-и матни оддӣ нигоҳ кардан умуман аёнӣ нест.
Аммо ҳатто агар он аён набошад ҳам, ҳатто агар он нороҳат бошад ҳам, мушкилоти бунёдии бештар вуҷуд доранд:
Аммо мо 1000 таҳиягар дорем ва шумо ин таҷрибаро ба ҳар яки онҳо расонида наметавонед. Ман, шумо, ӯ медонам, аммо касе дар он ҷо дигар намедонад. Шояд ӯ ёд гирад, ё не, аммо ӯ бояд ҳоло кор кунад - ва ӯ ин таҷрибаро аз куҷо пайдо мекард?
Гирифтани ин гуна мушкилот хеле осон аст - мо CTE мекунем ва гӯё дар он чизе мехонем. Дар асл, PostgreSQL "ақл" аст ва дар он ҷо мустақиман чизе намехонад. Пас аз он сабти аввалро мегирем ва ба он саду якумро аз ҳамон CTE мегирем.
Мо ба нақша менигарем ва мефаҳмем - аҷиб аст, мо дар Seq Scan 3 буфер (саҳифаҳои маълумот) "истеъмол" дорем, 1-и дигар дар CTE Scan ва 2-и дигар дар Скании дуюми CTE. Яъне, агар мо ҳама чизро танҳо ҷамъбаст кунем, мо 6 мегирем, аммо аз планшет мо танҳо 3-ро мехонем! CTE Scan чизеро аз ҳеҷ ҷо намехонад, аммо мустақиман бо хотираи раванд кор мекунад. Яъне, дар ин ҷо чизе равшан аст!
Дарвоқеъ, маълум мешавад, ки дар ин ҷо ҳама он 3 саҳифаи маълумоте ҳастанд, ки аз Seq Scan дархост шуда буданд, аввал 1-и Скании 1-умро талаб карданд ва баъд 2-юм ва 2 саҳифаи дигар ба ӯ хонда шуданд. 3 саҳифа маълумот хонда шуданд, на 6.
Ва ин расм моро ба фаҳмиш овард, ки иҷрои нақша дигар дарахт нест, балки танҳо як намуди графики асиклист. Ва мо чунин диаграмма гирифтем, то фаҳмем, ки "аз куҷо аз куҷо пайдо шуд". Яъне, дар ин ҷо мо аз pg_class як CTE таъсис додем ва онро ду маротиба дархост кардем ва вақте ки бори дуюм хостем, тақрибан тамоми вақти мо дар филиал сарф шуд. Маълум аст, ки хондани сабти 2 назар ба хондани сабти 101-ум аз планшет хеле гаронтар аст.
Умуман, як модули стандартӣ мавҷуд аст, ки метавонад оморро ҷамъ кунад, аммо он инчунин бояд дар танзимот фаъол карда шавад - ин модули pg_stat_statements. Аммо ӯ ба мо мувофиқ набуд.
Аввалан, он ба як дархостҳо бо истифода аз схемаҳои гуногун дар як пойгоҳи додаҳо таъин мекунад QueryIds гуногун. Яъне, агар шумо аввал SET search_path = '01'; SELECT * FROM user LIMIT 1;, ва он гоҳ SET search_path = '02'; ва ҳамон дархост, пас омори ин модул сабтҳои гуногун хоҳад дошт ва ман наметавонам омори умумиро махсус дар заминаи ин профили дархост бидуни ба назар гирифтани схемаҳо ҷамъоварӣ кунам.
Шумо одатан маълумотро чӣ гуна менависед? Мо як навъ маҷмӯаи додаҳо дорем, мо онро ба чанд ҷадвал тақсим мекунем ва баъд НУСЯ мекунем - аввал ба якум, баъд ба дуюм, ба сеюм... Ин номувофиқ аст, зеро ба назар чунин мерасад, ки мо як ҷараёни додаҳоро дар се қадам менависем. пай дар пай. Нохушоянд. Оё онро зудтар кардан мумкин аст? Метавонед!
Барои ин кофист, ки ин ҷараёнҳоро дар баробари ҳамдигар ҷудо кунем. Маълум мешавад, ки мо хатоҳо, дархостҳо, шаблонҳо, блокҳо, ... дар риштаҳои алоҳида парвоз мекунем - ва мо ҳамаро дар баробари ин менависем. Барои ин кифоя як канали COPY-ро барои ҳар як ҷадвали ҳадафи инфиродӣ доимо кушода нигоҳ доред.
Яъне, дар коллектор ҳамеша ҷараён дорад, ки дар он ман метавонам маълумоти заруриро нависам. Аммо барои он ки пойгоҳи додаҳо ин маълумотро бубинад ва касе дар интизори навиштани ин маълумот дармонда нашавад, Нусха бояд дар фосилаҳои муайян қатъ карда шавад. Барои мо, давраи самараноктарин тақрибан 100 мс буд - мо онро мепӯшем ва фавран онро боз ба ҳамон ҷадвал боз мекунем. Ва агар мо дар баъзе қуллаҳо як ҷараёнро кофӣ надорем, пас мо то ҳадди муайян ҷамъ мекунем.
Илова бар ин, мо фаҳмидем, ки барои чунин намуди сарборӣ, ҳама гуна ҷамъбаст, вақте ки сабтҳо дар гурӯҳҳо ҷамъ карда мешаванд, бад аст. Бадии классикӣ аст INSERT ... VALUES ва боз 1000 сабт. Зеро дар он лаҳза шумо авҷи навиштан дар васоити ахбори омма доред ва ҳар каси дигаре, ки мехоҳанд ба диск чизе нависад, интизор мешаванд.
Барои бартараф кардани чунин аномалияҳо, танҳо чизеро ҷамъ накунед, умуман буфер накунед. Ва агар буферкунӣ ба диск рух диҳад (хушбахтона, Stream API дар Node.js ба шумо имкон медиҳад, ки бидонед) - ин пайвастшавиро ба таъхир гузоред. Вақте ки шумо чорабинӣ мегиред, ки он боз ройгон аст, ба он аз навбати ҷамъшуда нависед. Ва дар ҳоле ки он банд аст, навбатии ройгонро аз ҳавз гиред ва ба он нависед.
Пеш аз ҷорӣ кардани ин равиш ба сабти маълумот, мо тақрибан 4K амалиёти навиштан доштем ва бо ин роҳ мо сарбориро 4 маротиба кам кардем. Ҳоло онҳо аз ҳисоби базаҳои нави назоратшаванда 6 маротиба афзоиш ёфтанд - то 100 МБ/с. Ва ҳоло мо гузоришҳоро дар тӯли 3 моҳи охир дар ҳаҷми тақрибан 10-15 ТБ нигоҳ медорем ва умедворем, ки танҳо дар се моҳ ҳама гуна таҳиягар метавонад ҳама гуна мушкилотро ҳал кунад.
Мо мушкилотро мефаҳмем
Аммо танҳо ҷамъоварии ҳамаи ин маълумот хуб, муфид, мувофиқ аст, аммо кофӣ нест - онро фаҳмидан лозим аст. Зеро ин миллионҳо нақшаҳои гуногун дар як рӯз мебошанд.
Аммо миллионҳо идоранашавандаанд, мо бояд аввал "хурдтар" кунем. Ва, пеш аз ҳама, шумо бояд тасмим гиред, ки ин чизи "хурдтар" -ро чӣ гуна ташкил мекунед.
Мо се нуктаи асосиро муайян кардем:
ки ин дархостро фиристод
Яъне, он аз кадом барнома "омадааст": веб-интерфейс, пуштибон, системаи пардохт ё чизи дигар.
ки рӯй дод
Дар кадом сервери мушаххас? Зеро агар шумо дар зери як замима якчанд сервер дошта бошед ва баногоҳ яке «беақл» шавад (зеро «диск пӯсида», «хотира ихроҷ шуд», ягон мушкилоти дигар), пас шумо бояд ба сервер махсус муроҷиат кунед.
чи тавр масъала ба ин ё он тарз зухур меёфт
Барои фаҳмидани "кӣ" ба мо дархост фиристодааст, мо асбоби стандартиро истифода мебарем - тағирёбандаи сессия: SET application_name = '{bl-host}:{bl-method}'; — мо номи мизбони мантиқи тиҷорӣ, ки дархост аз он меояд ва номи усул ё барномае, ки онро оғоз кардааст, мефиристем.
Пас аз он мо фаҳмидем, ки ба назар гирифтани таносуби як дархост байни серверҳои гуногун чандон ҷолиб нест. Ин аксар вақт нест, ки шумо вазъияте доред, ки як барнома дар ин ҷо ва он ҷо ба таври баробар печида мешавад. Аммо ҳатто агар он якхела бошад, ба яке аз ин серверҳо нигаред.
Инак, буриш "як сервер - як рӯз" барои хар як тахлил барои мо кифоя шуд.
якчанд маротиба кам кардани шумораи объектхои тахлил
Мо бояд мушкилотро дигар на аз рӯи ҳазорҳо дархост ё нақшаҳо, балки аз рӯи даҳҳо қолабҳо таҳлил кунем.
ҷадвали вақт
Яъне, бо ҷамъбасти "фактҳо" дар як бахши муайян шумо метавонед намуди зоҳирии онҳоро дар давоми рӯз нишон диҳед. Ва дар ин ҷо шумо метавонед дарк кунед, ки агар шумо як намуди намунае дошта бошед, ки масалан, дар як соат як маротиба рӯй медиҳад, аммо он бояд дар як рӯз як маротиба рӯй диҳад, шумо бояд дар бораи он фикр кунед, ки чӣ хато кардааст - кӣ сабаб шуд ва чаро, шояд он бояд дар ин ҷо бошад. набояд. Ин боз як усули ғайрирақамӣ, сирф визуалӣ, таҳлил аст.
Усулҳои боқимонда ба нишондодҳое асос ёфтаанд, ки мо аз нақша мегирем: чанд маротиба чунин намуна рух додааст, вақти умумӣ ва миёна, чӣ қадар маълумот аз диск хонда шудааст ва чӣ қадар аз хотира...
Зеро, масалан, шумо ба саҳифаи таҳлилӣ барои мизбон омадед, бубинед - чизе дар диск аз ҳад зиёд хонда мешавад. Диски сервер аз ӯҳдаи он баромада наметавонад - кӣ аз он мехонад?
Ва шумо метавонед аз рӯи дилхоҳ сутун ҷудо кунед ва қарор кунед, ки худи ҳозир бо чӣ кор хоҳед кард - сарбории протсессор ё диск, ё шумораи умумии дархостҳо ... Мо онро ҷудо кардем, "боло" -ро дида баромадем, ислоҳ кардем ва версияи нави барномаро бароварданд. [дарсҳои видеоӣ]
Ва дарҳол шумо метавонед замимаҳои гуногунро бинед, ки бо як қолаб аз дархости монанди SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processing... Ва шумо ҳайрон мешавед, ки чаро коркард корбарро мехонад, агар ӯ бо ӯ муошират накунад.
Роҳи муқобил ин аст, ки фавран аз барнома бубинед, ки он чӣ кор мекунад. Масалан, фронт ин, ин, ин ва ин аст, ки дар як соат як маротиба (хронология кӯмак мекунад). Ва дарҳол савол ба миён меояд: ба назар чунин менамояд, ки дар як соат як маротиба коре кардан кори пешвоён нест...
Пас аз чанд вақт мо фаҳмидем, ки мо ҷамъоварӣ надорем статистика аз руи гиреххои планй. Мо аз нақшаҳо танҳо он гиреҳҳоро ҷудо кардем, ки бо маълумоти худи ҷадвалҳо коре мекунанд (онҳоро аз рӯи индекс хонед/нависед ё не). Дар асл, нисбат ба расми қаблӣ танҳо як ҷанба илова карда мешавад - ин гиреҳ ба мо чанд рекорд овард?, ва чанд нафар партофта шуданд (Сатрҳо бо филтр хориҷ карда шуданд).
Шумо дар табақ индекси мувофиқ надоред, шумо ба он муроҷиат мекунед, он аз назди индекс парвоз мекунад, ба Seq Scan меафтад ... шумо ҳама сабтҳоро ба ҷуз як филтр кардаед. Чаро ба шумо дар як рӯз 100 миллион сабти филтршуда лозим аст? Оё беҳтар нест, ки индексро ҷамъ кунед?
Ҳамаи нақшаҳоро гиреҳ ба гиреҳ таҳлил карда, мо фаҳмидем, ки дар нақшаҳо баъзе сохторҳои маъмулӣ мавҷуданд, ки эҳтимоли шубҳанок ба назар мерасанд. Ва хуб мебуд, ки ба таҳиякунанда бигӯям: "Дӯст, дар ин ҷо шумо аввал аз рӯи индекс мехонед, баъд ҷудо мекунед ва сипас буридаед" - чун қоида, як сабт мавҷуд аст.
Ҳар касе, ки пурсишҳо навишт, эҳтимол бо чунин намуна дучор шуда бошад: "Ба ман фармоиши охирини Васяро бидеҳ, санаи онро диҳед." Ва агар шумо индекс аз рӯи сана надошта бошед ё дар индекси истифодакардаатон сана мавҷуд набошад, пас шумо маҳз ба ҳамон «тарма» қадам занед.
Аммо мо медонем, ки ин "ракет" аст - пас чаро фавран ба таҳиякунанда нагӯед, ки ӯ бояд чӣ кор кунад. Ҳамин тариқ, ҳангоми кушодани нақша, таҳиягари мо дарҳол тасвири зебоеро бо маслиҳатҳо мебинад, ки онҳо фавран ба ӯ мегӯянд: "Шумо дар ин ҷо ва он ҷо мушкилот доред, аммо онҳо ин тавр ва ин тавр ҳал карда мешаванд."