PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ман ба шумо тавсия медиҳам, ки стенограммаи гузориши аввали соли 2016 Владимир Ситниковро хонед "PostgreSQL ва JDBC тамоми шарбатро фишурда мекунанд"

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Нимирӯзи ба хайр Номи ман Владимир Ситников аст. Ман 10 сол боз дар NetCracker кор мекунам. Ва ман бештар ба маҳсулнокӣ машғулам. Ҳама чизи марбут ба Java, ҳама чизест, ки ба SQL алоқаманд аст, он чизест, ки ман дӯст медорам.

Ва имрӯз ман дар бораи он чизе, ки мо дар ширкат ҳангоми истифодаи PostgreSQL ҳамчун сервери пойгоҳи додаҳо оғоз кардем, сӯҳбат хоҳам кард. Ва мо асосан бо Java кор мекунем. Аммо он чизе, ки ман имрӯз ба шумо мегӯям, танҳо дар бораи Java нест. Чи тавре ки амалия нишон дод, ин дар дигар забонхо низ чой дорад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Мо сӯҳбат мекунем:

  • дар бораи интихоби маълумот.
  • Дар бораи сарфаи маълумот.
  • Ва инчунин дар бораи иҷрои.
  • Ва дар бораи ракехои зериобй, ки дар он чо дафн карда шудаанд.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Биёед бо як саволи оддӣ оғоз кунем. Мо дар асоси калиди ибтидоӣ аз ҷадвал як сатр интихоб мекунем.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Пойгоҳи додаҳо дар ҳамон ҳост ҷойгир аст. Ва хамаи ин кишт 20 миллисонияро мегирад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ин 20 миллисония хеле зиёданд. Агар шумо 100 чунин дархост дошта бошед, пас шумо дар як сония вақтро барои ҳаракат дар ин дархостҳо сарф мекунед, яъне мо вақтро беҳуда сарф мекунем.

Мо ин корро дӯст намедорем ва бубинем, ки база барои ин ба мо чӣ пешниҳод мекунад. Пойгоҳи додаҳо ба мо ду вариантро барои иҷрои дархостҳо пешкаш мекунад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Варианти аввал дархости оддӣ аст. Ин чӣ хуб аст? Далели он, ки мо онро гирифта мефиристем, на дигар.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

https://github.com/pgjdbc/pgjdbc/pull/478

Пойгоҳи додаҳо инчунин дархости пешрафта дорад, ки мушкилтар, вале функсионалии бештар аст. Шумо метавонед дархостро барои таҳлил, иҷро, ҳатмии тағирёбанда ва ғайра фиристед.

Дархости хеле васеъ ин чизест, ки мо онро дар гузориши ҷорӣ фаро намегирем. Мо, шояд, чизеро аз базаи маълумот мехоҳем ва рӯйхати хоҳишҳо вуҷуд дорад, ки дар ягон шакл ташаккул ёфтааст, яъне ин ҳамон чизест, ки мо мехоҳем, аммо ҳоло ва дар соли оянда имконнопазир аст. Ҳамин тавр, мо онро сабт кардем ва мо одамони асосиро такон медиҳем.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ва он чизе ки мо карда метавонем, ин дархости оддӣ ва дархости васеъ аст.

Дар бораи ҳар як равиш чӣ махсус аст?

Дархости оддӣ барои иҷрои якдафъаина хуб аст. Як бор анҷом дод ва фаромӯш кард. Ва мушкилот дар он аст, ки он формати дуии маълумотро дастгирӣ намекунад, яъне он барои баъзе системаҳои баландсифат мувофиқ нест.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Дархости васеъ - ба шумо имкон медиҳад, ки вақти таҳлилро сарфа кунед. Ин аст он чизе ки мо кардем ва ба истифода шурӯъ кардем. Ин дар ҳақиқат ба мо кӯмак кард. Дар таҳлил на танҳо сарфа карда мешавад. Дар интиқоли маълумот сарфа карда мешавад. Интиқоли маълумот дар формати дуӣ хеле самараноктар аст.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Биёед ба амалия гузарем. Ин аст он чизе ки як барномаи маъмулӣ ба назар мерасад. Он метавонад Java ва ғайра бошад.

Мо изҳорот эҷод кардем. Фармонро иҷро кард. Наздик сохта шудааст. Дар куҷо хатост? Мушкил чист? Масъалае нест. Ин аст он чизе ки дар ҳама китобҳо гуфта шудааст. Ин тавр бояд навишта шавад. Агар шумо хоҳед, ки иҷрои ҳадди аксар, ин тавр нависед.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Аммо амалия нишон дод, ки ин кор на-меояд. Чаро? Зеро мо усули «наздик» дорем. Ва вақте ки мо ин корро мекунем, аз нуқтаи назари пойгоҳи додаҳо маълум мешавад, ки он ба сигоркаш монанд аст, ки бо пойгоҳи додаҳо кор мекунад. Мо гуфтем, ки "ТАҲСИЛ КАРДАНИ DEALLOCATE".

Чаро ин ҳама эҷоди изофӣ ва борфарории изҳорот? Ба ҳеҷ кас лозим нест. Аммо он чизе, ки одатан дар PreparedStatements рӯй медиҳад, ин аст, ки вақте мо онҳоро мепӯшем, онҳо ҳама чизро дар пойгоҳи додаҳо мепӯшанд. Ин чизе нест, ки мо мехоҳем.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Мо мехохем, ки мисли одамони солим бо база кор кунем. Як бор баёнотро гирифта омода кардем, баъд борҳо иҷро кардем. Дар асл, борҳо - ин як маротиба дар тамоми ҳаёти барномаҳо - онҳо таҳлил карда шудаанд. Ва мо як ID изҳоротро дар REST-ҳои гуногун истифода мебарем. Ин максади мост.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Чӣ тавр мо ба ин ноил шуда метавонем?

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ин хеле содда аст - пӯшидани изҳорот лозим нест. Мо онро чунин менависем: "тайёр кардан" "иҷро кардан".

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Агар мо чунин чизеро оғоз кунем, пас маълум аст, ки чизе дар ҷое пур мешавад. Агар он равшан набошад, шумо метавонед онро санҷед. Биёед як меъёреро нависед, ки ин усули оддиро истифода мебарад. Эҷоди изҳорот. Мо онро дар баъзе версияи драйвер оғоз мекунем ва мефаҳмем, ки он бо гум шудани тамоми хотирае, ки дар он дошт, хеле зуд вайрон мешавад.

Маълум аст, ки ин гуна хатохо ба осонй ислох карда мешаванд. Ман дар бораи онҳо сухан намегӯям. Аммо ман мегӯям, ки версияи нав хеле зудтар кор мекунад. Усул беақл аст, аммо ба ҳар ҳол.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Чӣ тавр дуруст кор кардан мумкин аст? Барои ин мо бояд чӣ кор кунем?

Дар асл, барномаҳо ҳамеша изҳоротро мепӯшанд. Дар ҳама китобҳо мегӯянд, ки онро пӯшед, вагарна хотира мечакад.

Ва PostgreSQL намедонад, ки чӣ гуна дархостҳоро кэш кунад. Зарур аст, ки ҳар як сессия ин кэшро барои худ эҷод кунад.

Ва мо намехоҳем, ки вақтро барои таҳлил сарф кунем.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ва чун маъмул, мо ду интихоб дорем.

Варианти аввал ин аст, ки мо онро мегирем ва мегӯем, ки биёед ҳама чизро дар PgSQL печонем. Дар он ҷо кэш мавҷуд аст. Он ҳама чизро захира мекунад. Он бузург хоҳад шуд. Мо инро дидем. Мо 100500 дархост дорем. Кор намекунад. Мо розӣ нестем, ки дархостҳоро ба расмиёти дастӣ табдил диҳем. Не не.

Варианти дуюм дорем — онро гирифта худамон буред. Мо манбаъҳоро кушоем ва буриданро оғоз мекунем. Мо дидем ва дидем. Маълум шуд, ки ин кор чандон душвор нест.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

https://github.com/pgjdbc/pgjdbc/pull/319

Ин дар моҳи августи соли 2015 пайдо шуд. Ҳоло версияи муосиртар вуҷуд дорад. Ва ҳама чиз бузург аст. Он чунон хуб кор мекунад, ки мо дар барнома чизеро тағир намедиҳем. Ва мо ҳатто фикр карданро дар самти PgSQL қатъ кардем, яъне ин барои мо кофӣ буд, то тамоми хароҷоти изофӣ қариб ба сифр кам карда шавад.

Мувофиқи он, изҳоротҳои аз ҷониби сервер омодашуда дар иҷрои 5-ум фаъол карда мешаванд, то хотираи беҳударо дар пойгоҳи додаҳо дар ҳар як дархости якдафъаина пешгирӣ кунанд.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Шумо метавонед пурсед - рақамҳо дар куҷоянд? Шумо чӣ мегиред? Ва дар ин ҷо ман рақамҳо намедиҳам, зеро ҳар як дархост худашро дорад.

Дархостҳои мо чунон буданд, ки мо барои таҳлили дархостҳои OLTP тақрибан 20 миллисония сарф кардем. Барои иҷро 0,5 миллисония, барои таҳлил 20 миллисония вуҷуд дошт. Дархост – 10 киб матн, 170 сатри нақша. Ин дархости OLTP аст. Он 1, 5, 10 сатр, баъзан бештар талаб мекунад.

Аммо мо намехостем, ки 20 миллисонияро тамоман барбод диҳем. Мо онро ба 0 кам кардем. Ҳама чиз хуб аст.

Шумо аз ин ҷо чӣ гирифта метавонед? Агар шумо Java дошта бошед, пас шумо версияи муосири ронандаро мегиред ва шод мешавед.

Агар шумо бо забони дигар гап занед, пас фикр кунед - шояд ба шумо низ ин лозим аст? Зеро аз нуқтаи назари забони ниҳоӣ, масалан, агар PL 8 ё шумо LibPQ дошта бошед, пас барои шумо маълум нест, ки шумо вақтро на барои иҷроиш, на барои таҳлил сарф мекунед ва ин қобили тафтиш аст. Чӣ хел? Ҳама чиз ройгон аст.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ба чуз он ки хатохо ва баъзе хусусиятхо мавчуданд. Ва мо ҳоло дар бораи онҳо сӯҳбат хоҳем кард. Аксарияти он дар бораи археологияи саноатӣ, дар бораи он чизе, ки мо ёфтем, он чизеро, ки мо дучор омадем, хоҳад буд.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Агар дархост ба таври динамикӣ тавлид карда шавад. Он рӯй медиҳад. Касе сатрҳоро ба ҳам мечаспад, ки дар натиҷа дархости SQL пайдо мешавад.

Чаро ӯ бад аст? Ин бад аст, зеро ҳар дафъае, ки мо бо сатри дигар хотима меёбем.

Ва hashCode ин сатри гуногунро дубора хондан лозим аст. Ин дар ҳақиқат як вазифаи CPU аст - ёфтани матни дархости дароз дар ҳатто як хэш мавҷуд он қадар осон нест. Аз ин рӯ, хулоса оддӣ аст - дархостҳо тавлид накунед. Онҳоро дар як тағирёбанда нигоҳ доред. Ва шодӣ кунед.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Мушкилоти навбатӣ. Намудҳои маълумот муҳиманд. ORMҳо ҳастанд, ки мегӯянд, ки муҳим нест, ки чӣ гуна NULL вуҷуд дорад, бигзор навъе бошад. Агар Int, пас мо setInt мегӯем. Ва агар NULL бошад, бигзор он ҳамеша VARCHAR бошад. Ва дар ниҳоят чӣ фарқияте дорад, ки NULL вуҷуд дорад? Худи база ҳама чизро мефаҳмад. Ва ин тасвир кор намекунад.

Дар амал бошад, база тамоман парвое надорад. Агар шумо бори аввал гуфтед, ки ин рақам аст ва бори дуюм гуфтед, ки он VARCHAR аст, пас истифодаи такрории изҳороти аз ҷониби сервер омодашуда ғайриимкон аст. Ва дар ин ҳолат мо бояд изҳороти худро дубора эҷод кунем.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Агар шумо ҳамон як дархостро иҷро карда истода бошед, боварӣ ҳосил кунед, ки намудҳои маълумот дар сутуни шумо ошуфта нашудаанд. Шумо бояд аз NULL эҳтиёт шавед. Ин хатои маъмулест, ки мо пас аз оғози истифодаи PreparedStatements доштем

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Хуб, фурӯзон. Шояд ронандаро бурданд. Ва хосилнокии мехнат паст шуд. Корҳо бад шуданд.

Ин чӣ гуна рӯй медиҳад? Оё ин хато ё хусусият аст? Мутаассифона, фаҳмидан мумкин набуд, ки ин хато аст ё хусусият. Аммо як сенарияи хеле содда барои дубора тавлид кардани ин мушкилот вуҷуд дорад. Вай тамоман гайричашмдошт моро камин гирифт. Ва он аз интихоби айнан аз як ҷадвал иборат аст. Мо, албатта, чунин дархостхо бештар буд. Чун қоида, онҳо ду ё се ҷадвалро дар бар мегиранд, аммо чунин сенарияи бозикунӣ вуҷуд дорад. Аз базаи худ ягон версияро гиред ва онро бозӣ кунед.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

Гап дар сари он аст, ки мо ду сутун дорем, ки хар кадоми онхо индексация карда шудаанд. Дар як сутуни NULL як миллион сатр мавҷуд аст. Ва сутуни дуюм хамагй 20 сатр дорад. Вақте ки мо бидуни тағирёбандаҳои маҳдуд иҷро мекунем, ҳама чиз хуб кор мекунад.

Агар мо ба иҷроиш бо тағирёбандаҳои басташуда шурӯъ кунем, яъне "?" ё "$1" барои дархости мо, мо чӣ ба даст меорем?

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

Иҷрои якум тавре ки интизор мерафт. Дуюм каме тезтар аст. Чизе кэш карда шуд. Сеюм, чорум, панҷум. Сипас таркиш - ва чизе монанди ин. Ва бадтарин чиз он аст, ки ин дар шашуми қатл рӯй медиҳад. Кй медонист, ки барои фахмидани он ки накшаи хакикии ичро чй гуна аст?

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Кӣ гунаҳкор аст? Чӣ гап шуд? Дар базаи маълумот оптимизатсия мавҷуд аст. Ва ба назар чунин мерасад, ки он барои парвандаи умумӣ оптимизатсия шудааст. Ва, мутаносибан, аз як лаҳза сар карда, вай ба нақшаи умумӣ мегузарад, ки мутаассифона, метавонад фарқ кунад. Мумкин аст, ки якхела бошад ё дигар бошад. Ва як навъ арзиши остона вуҷуд дорад, ки ба ин рафтор оварда мерасонад.

Шумо дар ин бора чӣ кор карда метавонед? Дар ин ҷо, албатта, чизеро тахмин кардан душвортар аст. Як ҳалли оддӣ вуҷуд дорад, ки мо онро истифода мебарем. Ин +0, OFFSET 0 аст. Албатта шумо чунин ҳаллиҳоро медонед. Мо танҳо онро мегирем ва ба дархост "+0" илова мекунем ва ҳама чиз хуб аст. Ман ба шумо баъдтар нишон медиҳам.

Ва варианти дигар вуҷуд дорад - ба нақшаҳо бодиққат нигаред. Таҳиягар бояд на танҳо дархост нависад, балки 6 маротиба "таҳлилро шарҳ диҳед" гӯяд. Агар он 5 бошад, он кор намекунад.

Ва варианти сеюм вуҷуд дорад - ба pgsql-хакерҳо нома нависед. Ман навиштам, аммо ҳанӯз маълум нест, ки ин хато аст ё хусусият.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

Ҳангоме ки мо фикр мекунем, ки ин хато ё хусусият аст, биёед онро ислоҳ кунем. Биёед дархости худро қабул кунем ва "+0" илова кунем. Ҳама чиз хуб аст. Ду рамз ва шумо ҳатто набояд дар бораи он фикр кунед, ки он чӣ гуна аст ё он чӣ аст. Хеле содда. Мо танҳо ба пойгоҳи додаҳо истифодаи индексро дар ин сутун манъ кардем. Мо дар сутуни "+0" индекс надорем ва ин аст, базаи маълумот индексро истифода намебарад, ҳама чиз хуб аст.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ин қоидаи 6 шарҳ аст. Ҳоло дар версияҳои ҷорӣ шумо бояд онро 6 маротиба иҷро кунед, агар шумо тағирёбандаҳои ҳатмӣ дошта бошед. Агар шумо тағирёбандаҳои маҳдуд надошта бошед, мо ин корро мекунем. Ва дар охир маҳз ҳамин дархост ноком мешавад. Ин як чизи душвор нест.

Чунин ба назар мерасад, ки чӣ қадар имконпазир аст? Хато дар ин ҷо, хато дар он ҷо. Дар асл, хато дар ҳама ҷо аст.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Биёед муфассалтар дида бароем. Масалан, мо ду схема дорем. Нақшаи А бо ҷадвали S ва диаграммаи Б бо ҷадвали S. Дархост – аз ҷадвал маълумот интихоб кунед. Дар ин ҳолат мо чӣ хоҳем дошт? Мо хато хоҳем кард. Мо ҳама чизҳои дар боло зикршударо дорем. Қоида ин аст - хато дар ҳама ҷо аст, мо ҳама чизҳои дар боло зикршударо дорем.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Акнун савол ин аст: "Чаро?" Чунин ба назар мерасад, ки ҳуҷҷатҳое мавҷуданд, ки агар мо схема дошта бошем, пас тағирёбандаи "search_path" мавҷуд аст, ки ба мо мегӯяд, ки ҷадвалро дар куҷо ҷустуҷӯ кунем. Чунин ба назар мерасад, ки як тағирёбанда вуҷуд дорад.

Мушкил чист? Мушкилот дар он аст, ки изҳоротҳои аз ҷониби сервер омодашуда гумон намекунанд, ки search_path аз ҷониби касе метавонад тағир дода шавад. Ин арзиш барои базаи маълумот доимӣ боқӣ мемонад. Ва баъзе қисматҳо метавонанд маънои нав нагиранд.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Албатта, ин аз версияе, ки шумо озмоиш мекунед, вобаста аст. Вобаста аз он, ки ҷадвалҳои шумо то чӣ андоза ҷиддӣ фарқ мекунанд. Ва версияи 9.1 танҳо дархостҳои кӯҳнаро иҷро мекунад. Версияҳои нав метавонанд хатогиро пайдо кунанд ва ба шумо мегӯянд, ки шумо хатогӣ доред.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Танзими search_path + изҳороти аз ҷониби сервер омодашуда =
нақшаи кэшшуда набояд намуди натиҷаро тағир диҳад

Онро чӣ гуна бояд табобат кард? Як дорухат оддӣ вуҷуд дорад - ин корро накунед. Ҳангоми кор кардани барнома, тағир додани search_path лозим нест. Агар шумо тағир диҳед, беҳтар аст, ки пайвасти нав эҷод кунед.

Шумо метавонед муҳокима кунед, яъне кушоед, муҳокима кунед, илова кунед. Шояд мо метавонем таҳиягарони пойгоҳи додаҳоро бовар кунонем, ки вақте касе арзишро тағир медиҳад, базаи маълумот бояд ба муштарӣ дар ин бора хабар диҳад: “Инак, арзиши шумо дар ин ҷо нав карда шудааст. Шояд шумо бояд изҳоротҳоро аз нав танзим кунед ва онҳоро дубора эҷод кунед?" Ҳоло базаи маълумот пинҳонӣ рафтор мекунад ва ба ҳеҷ ваҷҳ хабар намедиҳад, ки изҳорот дар ҷое тағир ёфтааст.

Ва ман бори дигар таъкид мекунам - ин чизест, ки барои Java хос нест. Мо ҳамон чизро дар PL/pgSQL як ба як мебинем. Аммо он дар он ҷо такрор карда мешавад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Биёед кӯшиш кунем, ки маълумоти бештарро интихоб кунем. Мо интихоб мекунем ва интихоб мекунем. Мо ҷадвали дорои як миллион сатр дорем. Ҳар як сатр як килобайт аст. Тақрибан як гигабайт маълумот. Ва мо дар мошини Java хотираи кории 128 мегабайт дорем.

Мо, тавре ки дар ҳама китобҳо тавсия дода мешавад, коркарди ҷараёнро истифода мебарем. Яъне, мо resultSet-ро мекушоем ва маълумотро аз он ҷо оҳиста-оҳиста мехонем. Оё он кор мекунад? Оё он аз хотира меафтад? Каме мехонед? Биёед ба пойгоҳи додаҳо эътимод кунем, биёед ба Postgres эътимод кунем. Мо бовар намекунем. Оё мо OutOFMemory меафтем? OutOfMemory -ро кӣ аз сар гузаронидааст? Пас аз ин ба кӣ муяссар шуд, ки онро ислоҳ кунад? Ба касе муяссар шуд, ки онро дуруст кунад.

Агар шумо як миллион сатр дошта бошед, шумо наметавонед танҳо интихоб кунед. OFFSET/LIMIT лозим аст. Кӣ барои ин интихоб аст? Ва кӣ тарафдори бозӣ бо autoCommit аст?

Дар ин ҷо, чун маъмул, варианти ғайричашмдошт дуруст мебарояд. Ва агар шумо ногаҳон худкорро хомӯш кунед, он кӯмак хоҳад кард. Барои чӣ ин? Илм дар ин бора намедонад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Аммо бо нобаёнӣ, ҳама муштариёне, ки ба пойгоҳи додаҳои Postgres пайваст мешаванд, тамоми маълумотро мегиранд. PgJDBC дар ин маврид истисно нест; он ҳама сатрҳоро интихоб мекунад.

Дар мавзӯи FetchSize як вариант вуҷуд дорад, яъне шумо метавонед дар сатҳи изҳороти алоҳида бигӯед, ки дар ин ҷо лутфан маълумотро то 10, 50 интихоб кунед. Аммо ин кор то он даме, ки шумо худкорро хомӯш кунед, кор намекунад. Хомӯш кардани autoCommit - он ба кор шурӯъ мекунад.

Аммо гузаштан аз рамз ва танзими setFetchSize дар ҳама ҷо нороҳат аст. Аз ин рӯ, мо танзимеро сохтем, ки арзиши пешфарзро барои тамоми пайвастшавӣ мегӯяд.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Он чизе ки мо гуфтем. Параметр танзим карда шудааст. Ва мо чӣ гирифтем? Агар мо миқдори камро интихоб кунем, агар, масалан, дар як вақт 10 сатрро интихоб кунем, пас мо хароҷоти изофии хеле калон дорем. Аз ин рӯ, ин арзиш бояд тақрибан сад муқаррар карда шавад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Идеалӣ, албатта, шумо ҳоло ҳам бояд чӣ гуна маҳдуд кардани онро бо байтҳо омӯзед, аммо дорухат чунин аст: defaultRowFetchSize-ро ба зиёда аз сад таъин кунед ва хушбахт бошед.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Биёед ба ворид кардани маълумот гузарем. Ворид кардан осонтар аст, вариантҳои гуногун мавҷуданд. Масалан, INSERT, VALUES. Ин як варианти хуб аст. Шумо метавонед "INSERT SELECT" бигӯед. Дар амал хамин хел аст. Дар иҷроиш фарқият вуҷуд надорад.

Китобҳо мегӯянд, ки шумо бояд изҳороти Batch-ро иҷро кунед, китобҳо мегӯянд, ки шумо метавонед фармонҳои мураккабтарро бо якчанд қавс иҷро кунед. Ва Postgres як хусусияти олиҷаноб дорад - шумо метавонед COPY -ро иҷро кунед, яъне онро зудтар иҷро кунед.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Агар шумо онро чен кунед, шумо метавонед боз якчанд кашфиёти ҷолиб кунед. Мо мехоҳем, ки ин чӣ гуна кор кунад? Мо мехоҳем, ки фармонҳои нолозимро таҳлил накунем ва иҷро накунем.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Дар амал, TCP ба мо имкон намедиҳад, ки ин корро кунем. Агар муштарӣ бо фиристодани дархост банд бошад, пас базаи маълумот ҳангоми кӯшиши фиристодани посух ба мо дархостҳоро намехонад. Натиҷаи ниҳоӣ ин аст, ки муштарӣ мунтазири пойгоҳи додаҳо барои хондани дархост аст ва пойгоҳи додаҳо интизоранд, ки муштарӣ посухро бихонад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ва аз ин рӯ, муштарӣ маҷбур мешавад, ки давра ба давра бастаи ҳамоҳангсозиро фиристад. Муносибатҳои иловагии шабакавӣ, беҳудаи вақт.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир СитниковВа ҳар қадаре ки мо онҳоро илова кунем, ҳамон қадар бадтар мешавад. Ронанда хеле пессимист аст ва онҳоро зуд-зуд, тақрибан дар ҳар 200 сатр, вобаста ба андозаи хатҳо ва ғайра илова мекунад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

https://github.com/pgjdbc/pgjdbc/pull/380

Чунин мешавад, ки шумо танҳо як сатрро ислоҳ мекунед ва ҳама чиз 10 маротиба суръат мегирад. Он рӯй медиҳад. Чаро? Чун маъмул, як доимии монанди ин аллакай дар ҷое истифода шудааст. Ва арзиши "128" маънои онро дошт, ки ба ҷамъоварӣ истифода набаред.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Маҷмӯаи микробенчмаркҳои Java

Ин хуб аст, ки ин ба нусхаи расмӣ дохил карда нашудааст. Пеш аз оғози нашр кашф карда шуд. Ҳамаи маъноҳое, ки ман медиҳам, бар версияҳои муосир асос ёфтаанд.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Биёед кӯшиш кунем. Мо InsertBatch-ро оддӣ чен мекунем. Мо InsertBatch-ро чанд маротиба чен мекунем, яъне ҳамон чизест, аммо арзишҳои зиёде мавҷуданд. Ҳаракати ҷолиб. На ҳама метавонанд ин корро кунанд, аммо ин як иқдоми оддӣ аст, нисбат ба COPY хеле осонтар аст.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Шумо метавонед COPY кунед.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ва шумо метавонед инро дар сохторҳо иҷро кунед. Навъи пешфарзи корбарро эълон кунед, массивро гузаронед ва мустақиман ба ҷадвал INSERT кунед.

Агар шумо истинодро кушоед: pgjdbc/ubenchmsrk/InsertBatch.java, пас ин код дар GitHub аст. Шумо метавонед бубинед, ки кадом дархостҳо дар он ҷо тавлид мешаванд. Фарқ надорад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

оғоз кардем. Ва аввалин чизе, ки мо фаҳмидем, ин буд, ки истифода набурдани партия ғайриимкон аст. Ҳама вариантҳои бастабандӣ сифр мебошанд, яъне вақти иҷро дар муқоиса бо иҷрои якдафъаина амалан сифр аст.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Мо маълумотро ворид мекунем. Ин як ҷадвали хеле оддӣ аст. Се сутун. Ва мо дар ин ҷо чӣ мебинем? Мо мебинем, ки ҳар сеи ин вариантҳо тақрибан муқоисашавандаанд. Ва COPY, албатта, беҳтар аст.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Ин вақтест, ки мо қисмҳоро мегузорем. Вақте ки мо гуфтем, ки як арзиши VALUES, ду арзиши VALUES, се арзиши VALUES ё 10-тои онҳоро бо вергул ҷудо карда нишон додем. Ин ҳоло танҳо уфуқӣ аст. 1, 2, 4, 128. Дидан мумкин аст, ки «Вставкаи партия», ки бо ранги кабуд кашида шудааст, уро хеле бехтар хис мекунад. Яъне, вақте ки шумо як-якро ворид мекунед ё ҳатто вақте ки шумо дар як вақт чорро мегузоред, он ду маротиба хубтар мешавад, танҳо аз сабаби он ки мо каме бештар ба VALUES банд кардем. Камтар амалиётҳои EXECUTE.

Истифодаи COPY дар ҳаҷмҳои хурд хеле умедбахш аст. Ман ҳатто дар дуи аввал тасвир накардаам. Онҳо ба осмон мераванд, яъне ин рақамҳои сабз барои COPY.

COPY бояд вақте истифода шавад, ки шумо ҳадди аққал сад сатри маълумот дошта бошед. Маблаги кушодани ин алока калон аст. Ва, рости гап, ман дар ин самт кофта нашудаам. Ман партияро оптимизатсия кардам, аммо на Нусха.

Мо минбаъд чӣ кор мекунем? Мо кӯшиш кардем. Мо мефаҳмем, ки мо бояд ё сохторҳоро истифода барем ё як bacth оқилона, ки якчанд маъноро дар бар мегирад.

PostgreSQL ва JDBC тамоми шарбатро ғунҷонанд. Владимир Ситников

Аз гузориши имрӯза чиро бояд гирифт?

  • PreparedStatement ҳама чизи мост. Ин ба хосилнокии мехнат бисьёр медихад. Он дар равғани атрафшон флопи калон ба вуҷуд меорад.
  • Ва ба шумо лозим аст, ки 6 маротиба ТАҲҲИЛ ДИҲЕД.
  • Ва ба мо лозим аст, ки OFFSET 0 ва ҳиллаҳои монанди +0 -ро ҳал кунем, то фоизи боқимондаи дархостҳои мушкили худро ислоҳ кунем.

Манбаъ: will.com

Илова Эзоҳ