Ман ба шумо тавсия медиҳам, ки стенограммаи гузориши аввали соли 2016 Владимир Ситниковро хонед "PostgreSQL ва JDBC тамоми шарбатро фишурда мекунанд"
Нимирӯзи ба хайр Номи ман Владимир Ситников аст. Ман 10 сол боз дар NetCracker кор мекунам. Ва ман бештар ба маҳсулнокӣ машғулам. Ҳама чизи марбут ба Java, ҳама чизест, ки ба SQL алоқаманд аст, он чизест, ки ман дӯст медорам.
Ва имрӯз ман дар бораи он чизе, ки мо дар ширкат ҳангоми истифодаи PostgreSQL ҳамчун сервери пойгоҳи додаҳо оғоз кардем, сӯҳбат хоҳам кард. Ва мо асосан бо Java кор мекунем. Аммо он чизе, ки ман имрӯз ба шумо мегӯям, танҳо дар бораи Java нест. Чи тавре ки амалия нишон дод, ин дар дигар забонхо низ чой дорад.
Мо сӯҳбат мекунем:
- дар бораи интихоби маълумот.
- Дар бораи сарфаи маълумот.
- Ва инчунин дар бораи иҷрои.
- Ва дар бораи ракехои зериобй, ки дар он чо дафн карда шудаанд.
Биёед бо як саволи оддӣ оғоз кунем. Мо дар асоси калиди ибтидоӣ аз ҷадвал як сатр интихоб мекунем.
Пойгоҳи додаҳо дар ҳамон ҳост ҷойгир аст. Ва хамаи ин кишт 20 миллисонияро мегирад.
Ин 20 миллисония хеле зиёданд. Агар шумо 100 чунин дархост дошта бошед, пас шумо дар як сония вақтро барои ҳаракат дар ин дархостҳо сарф мекунед, яъне мо вақтро беҳуда сарф мекунем.
Мо ин корро дӯст намедорем ва бубинем, ки база барои ин ба мо чӣ пешниҳод мекунад. Пойгоҳи додаҳо ба мо ду вариантро барои иҷрои дархостҳо пешкаш мекунад.
Варианти аввал дархости оддӣ аст. Ин чӣ хуб аст? Далели он, ки мо онро гирифта мефиристем, на дигар.
Пойгоҳи додаҳо инчунин дархости пешрафта дорад, ки мушкилтар, вале функсионалии бештар аст. Шумо метавонед дархостро барои таҳлил, иҷро, ҳатмии тағирёбанда ва ғайра фиристед.
Дархости хеле васеъ ин чизест, ки мо онро дар гузориши ҷорӣ фаро намегирем. Мо, шояд, чизеро аз базаи маълумот мехоҳем ва рӯйхати хоҳишҳо вуҷуд дорад, ки дар ягон шакл ташаккул ёфтааст, яъне ин ҳамон чизест, ки мо мехоҳем, аммо ҳоло ва дар соли оянда имконнопазир аст. Ҳамин тавр, мо онро сабт кардем ва мо одамони асосиро такон медиҳем.
Ва он чизе ки мо карда метавонем, ин дархости оддӣ ва дархости васеъ аст.
Дар бораи ҳар як равиш чӣ махсус аст?
Дархости оддӣ барои иҷрои якдафъаина хуб аст. Як бор анҷом дод ва фаромӯш кард. Ва мушкилот дар он аст, ки он формати дуии маълумотро дастгирӣ намекунад, яъне он барои баъзе системаҳои баландсифат мувофиқ нест.
Дархости васеъ - ба шумо имкон медиҳад, ки вақти таҳлилро сарфа кунед. Ин аст он чизе ки мо кардем ва ба истифода шурӯъ кардем. Ин дар ҳақиқат ба мо кӯмак кард. Дар таҳлил на танҳо сарфа карда мешавад. Дар интиқоли маълумот сарфа карда мешавад. Интиқоли маълумот дар формати дуӣ хеле самараноктар аст.
Биёед ба амалия гузарем. Ин аст он чизе ки як барномаи маъмулӣ ба назар мерасад. Он метавонад Java ва ғайра бошад.
Мо изҳорот эҷод кардем. Фармонро иҷро кард. Наздик сохта шудааст. Дар куҷо хатост? Мушкил чист? Масъалае нест. Ин аст он чизе ки дар ҳама китобҳо гуфта шудааст. Ин тавр бояд навишта шавад. Агар шумо хоҳед, ки иҷрои ҳадди аксар, ин тавр нависед.
Аммо амалия нишон дод, ки ин кор на-меояд. Чаро? Зеро мо усули «наздик» дорем. Ва вақте ки мо ин корро мекунем, аз нуқтаи назари пойгоҳи додаҳо маълум мешавад, ки он ба сигоркаш монанд аст, ки бо пойгоҳи додаҳо кор мекунад. Мо гуфтем, ки "ТАҲСИЛ КАРДАНИ DEALLOCATE".
Чаро ин ҳама эҷоди изофӣ ва борфарории изҳорот? Ба ҳеҷ кас лозим нест. Аммо он чизе, ки одатан дар PreparedStatements рӯй медиҳад, ин аст, ки вақте мо онҳоро мепӯшем, онҳо ҳама чизро дар пойгоҳи додаҳо мепӯшанд. Ин чизе нест, ки мо мехоҳем.
Мо мехохем, ки мисли одамони солим бо база кор кунем. Як бор баёнотро гирифта омода кардем, баъд борҳо иҷро кардем. Дар асл, борҳо - ин як маротиба дар тамоми ҳаёти барномаҳо - онҳо таҳлил карда шудаанд. Ва мо як ID изҳоротро дар REST-ҳои гуногун истифода мебарем. Ин максади мост.
Чӣ тавр мо ба ин ноил шуда метавонем?
Ин хеле содда аст - пӯшидани изҳорот лозим нест. Мо онро чунин менависем: "тайёр кардан" "иҷро кардан".
Агар мо чунин чизеро оғоз кунем, пас маълум аст, ки чизе дар ҷое пур мешавад. Агар он равшан набошад, шумо метавонед онро санҷед. Биёед як меъёреро нависед, ки ин усули оддиро истифода мебарад. Эҷоди изҳорот. Мо онро дар баъзе версияи драйвер оғоз мекунем ва мефаҳмем, ки он бо гум шудани тамоми хотирае, ки дар он дошт, хеле зуд вайрон мешавад.
Маълум аст, ки ин гуна хатохо ба осонй ислох карда мешаванд. Ман дар бораи онҳо сухан намегӯям. Аммо ман мегӯям, ки версияи нав хеле зудтар кор мекунад. Усул беақл аст, аммо ба ҳар ҳол.
Чӣ тавр дуруст кор кардан мумкин аст? Барои ин мо бояд чӣ кор кунем?
Дар асл, барномаҳо ҳамеша изҳоротро мепӯшанд. Дар ҳама китобҳо мегӯянд, ки онро пӯшед, вагарна хотира мечакад.
Ва PostgreSQL намедонад, ки чӣ гуна дархостҳоро кэш кунад. Зарур аст, ки ҳар як сессия ин кэшро барои худ эҷод кунад.
Ва мо намехоҳем, ки вақтро барои таҳлил сарф кунем.
Ва чун маъмул, мо ду интихоб дорем.
Варианти аввал ин аст, ки мо онро мегирем ва мегӯем, ки биёед ҳама чизро дар PgSQL печонем. Дар он ҷо кэш мавҷуд аст. Он ҳама чизро захира мекунад. Он бузург хоҳад шуд. Мо инро дидем. Мо 100500 дархост дорем. Кор намекунад. Мо розӣ нестем, ки дархостҳоро ба расмиёти дастӣ табдил диҳем. Не не.
Варианти дуюм дорем — онро гирифта худамон буред. Мо манбаъҳоро кушоем ва буриданро оғоз мекунем. Мо дидем ва дидем. Маълум шуд, ки ин кор чандон душвор нест.
Ин дар моҳи августи соли 2015 пайдо шуд. Ҳоло версияи муосиртар вуҷуд дорад. Ва ҳама чиз бузург аст. Он чунон хуб кор мекунад, ки мо дар барнома чизеро тағир намедиҳем. Ва мо ҳатто фикр карданро дар самти PgSQL қатъ кардем, яъне ин барои мо кофӣ буд, то тамоми хароҷоти изофӣ қариб ба сифр кам карда шавад.
Мувофиқи он, изҳоротҳои аз ҷониби сервер омодашуда дар иҷрои 5-ум фаъол карда мешаванд, то хотираи беҳударо дар пойгоҳи додаҳо дар ҳар як дархости якдафъаина пешгирӣ кунанд.
Шумо метавонед пурсед - рақамҳо дар куҷоянд? Шумо чӣ мегиред? Ва дар ин ҷо ман рақамҳо намедиҳам, зеро ҳар як дархост худашро дорад.
Дархостҳои мо чунон буданд, ки мо барои таҳлили дархостҳои OLTP тақрибан 20 миллисония сарф кардем. Барои иҷро 0,5 миллисония, барои таҳлил 20 миллисония вуҷуд дошт. Дархост – 10 киб матн, 170 сатри нақша. Ин дархости OLTP аст. Он 1, 5, 10 сатр, баъзан бештар талаб мекунад.
Аммо мо намехостем, ки 20 миллисонияро тамоман барбод диҳем. Мо онро ба 0 кам кардем. Ҳама чиз хуб аст.
Шумо аз ин ҷо чӣ гирифта метавонед? Агар шумо Java дошта бошед, пас шумо версияи муосири ронандаро мегиред ва шод мешавед.
Агар шумо бо забони дигар гап занед, пас фикр кунед - шояд ба шумо низ ин лозим аст? Зеро аз нуқтаи назари забони ниҳоӣ, масалан, агар PL 8 ё шумо LibPQ дошта бошед, пас барои шумо маълум нест, ки шумо вақтро на барои иҷроиш, на барои таҳлил сарф мекунед ва ин қобили тафтиш аст. Чӣ хел? Ҳама чиз ройгон аст.
Ба чуз он ки хатохо ва баъзе хусусиятхо мавчуданд. Ва мо ҳоло дар бораи онҳо сӯҳбат хоҳем кард. Аксарияти он дар бораи археологияи саноатӣ, дар бораи он чизе, ки мо ёфтем, он чизеро, ки мо дучор омадем, хоҳад буд.
Агар дархост ба таври динамикӣ тавлид карда шавад. Он рӯй медиҳад. Касе сатрҳоро ба ҳам мечаспад, ки дар натиҷа дархости SQL пайдо мешавад.
Чаро ӯ бад аст? Ин бад аст, зеро ҳар дафъае, ки мо бо сатри дигар хотима меёбем.
Ва hashCode ин сатри гуногунро дубора хондан лозим аст. Ин дар ҳақиқат як вазифаи CPU аст - ёфтани матни дархости дароз дар ҳатто як хэш мавҷуд он қадар осон нест. Аз ин рӯ, хулоса оддӣ аст - дархостҳо тавлид накунед. Онҳоро дар як тағирёбанда нигоҳ доред. Ва шодӣ кунед.
Мушкилоти навбатӣ. Намудҳои маълумот муҳиманд. ORMҳо ҳастанд, ки мегӯянд, ки муҳим нест, ки чӣ гуна NULL вуҷуд дорад, бигзор навъе бошад. Агар Int, пас мо setInt мегӯем. Ва агар NULL бошад, бигзор он ҳамеша VARCHAR бошад. Ва дар ниҳоят чӣ фарқияте дорад, ки NULL вуҷуд дорад? Худи база ҳама чизро мефаҳмад. Ва ин тасвир кор намекунад.
Дар амал бошад, база тамоман парвое надорад. Агар шумо бори аввал гуфтед, ки ин рақам аст ва бори дуюм гуфтед, ки он VARCHAR аст, пас истифодаи такрории изҳороти аз ҷониби сервер омодашуда ғайриимкон аст. Ва дар ин ҳолат мо бояд изҳороти худро дубора эҷод кунем.
Агар шумо ҳамон як дархостро иҷро карда истода бошед, боварӣ ҳосил кунед, ки намудҳои маълумот дар сутуни шумо ошуфта нашудаанд. Шумо бояд аз NULL эҳтиёт шавед. Ин хатои маъмулест, ки мо пас аз оғози истифодаи PreparedStatements доштем
Хуб, фурӯзон. Шояд ронандаро бурданд. Ва хосилнокии мехнат паст шуд. Корҳо бад шуданд.
Ин чӣ гуна рӯй медиҳад? Оё ин хато ё хусусият аст? Мутаассифона, фаҳмидан мумкин набуд, ки ин хато аст ё хусусият. Аммо як сенарияи хеле содда барои дубора тавлид кардани ин мушкилот вуҷуд дорад. Вай тамоман гайричашмдошт моро камин гирифт. Ва он аз интихоби айнан аз як ҷадвал иборат аст. Мо, албатта, чунин дархостхо бештар буд. Чун қоида, онҳо ду ё се ҷадвалро дар бар мегиранд, аммо чунин сенарияи бозикунӣ вуҷуд дорад. Аз базаи худ ягон версияро гиред ва онро бозӣ кунед.
Гап дар сари он аст, ки мо ду сутун дорем, ки хар кадоми онхо индексация карда шудаанд. Дар як сутуни NULL як миллион сатр мавҷуд аст. Ва сутуни дуюм хамагй 20 сатр дорад. Вақте ки мо бидуни тағирёбандаҳои маҳдуд иҷро мекунем, ҳама чиз хуб кор мекунад.
Агар мо ба иҷроиш бо тағирёбандаҳои басташуда шурӯъ кунем, яъне "?" ё "$1" барои дархости мо, мо чӣ ба даст меорем?
Иҷрои якум тавре ки интизор мерафт. Дуюм каме тезтар аст. Чизе кэш карда шуд. Сеюм, чорум, панҷум. Сипас таркиш - ва чизе монанди ин. Ва бадтарин чиз он аст, ки ин дар шашуми қатл рӯй медиҳад. Кй медонист, ки барои фахмидани он ки накшаи хакикии ичро чй гуна аст?
Кӣ гунаҳкор аст? Чӣ гап шуд? Дар базаи маълумот оптимизатсия мавҷуд аст. Ва ба назар чунин мерасад, ки он барои парвандаи умумӣ оптимизатсия шудааст. Ва, мутаносибан, аз як лаҳза сар карда, вай ба нақшаи умумӣ мегузарад, ки мутаассифона, метавонад фарқ кунад. Мумкин аст, ки якхела бошад ё дигар бошад. Ва як навъ арзиши остона вуҷуд дорад, ки ба ин рафтор оварда мерасонад.
Шумо дар ин бора чӣ кор карда метавонед? Дар ин ҷо, албатта, чизеро тахмин кардан душвортар аст. Як ҳалли оддӣ вуҷуд дорад, ки мо онро истифода мебарем. Ин +0, OFFSET 0 аст. Албатта шумо чунин ҳаллиҳоро медонед. Мо танҳо онро мегирем ва ба дархост "+0" илова мекунем ва ҳама чиз хуб аст. Ман ба шумо баъдтар нишон медиҳам.
Ва варианти дигар вуҷуд дорад - ба нақшаҳо бодиққат нигаред. Таҳиягар бояд на танҳо дархост нависад, балки 6 маротиба "таҳлилро шарҳ диҳед" гӯяд. Агар он 5 бошад, он кор намекунад.
Ва варианти сеюм вуҷуд дорад - ба pgsql-хакерҳо нома нависед. Ман навиштам, аммо ҳанӯз маълум нест, ки ин хато аст ё хусусият.
Ҳангоме ки мо фикр мекунем, ки ин хато ё хусусият аст, биёед онро ислоҳ кунем. Биёед дархости худро қабул кунем ва "+0" илова кунем. Ҳама чиз хуб аст. Ду рамз ва шумо ҳатто набояд дар бораи он фикр кунед, ки он чӣ гуна аст ё он чӣ аст. Хеле содда. Мо танҳо ба пойгоҳи додаҳо истифодаи индексро дар ин сутун манъ кардем. Мо дар сутуни "+0" индекс надорем ва ин аст, базаи маълумот индексро истифода намебарад, ҳама чиз хуб аст.
Ин қоидаи 6 шарҳ аст. Ҳоло дар версияҳои ҷорӣ шумо бояд онро 6 маротиба иҷро кунед, агар шумо тағирёбандаҳои ҳатмӣ дошта бошед. Агар шумо тағирёбандаҳои маҳдуд надошта бошед, мо ин корро мекунем. Ва дар охир маҳз ҳамин дархост ноком мешавад. Ин як чизи душвор нест.
Чунин ба назар мерасад, ки чӣ қадар имконпазир аст? Хато дар ин ҷо, хато дар он ҷо. Дар асл, хато дар ҳама ҷо аст.
Биёед муфассалтар дида бароем. Масалан, мо ду схема дорем. Нақшаи А бо ҷадвали S ва диаграммаи Б бо ҷадвали S. Дархост – аз ҷадвал маълумот интихоб кунед. Дар ин ҳолат мо чӣ хоҳем дошт? Мо хато хоҳем кард. Мо ҳама чизҳои дар боло зикршударо дорем. Қоида ин аст - хато дар ҳама ҷо аст, мо ҳама чизҳои дар боло зикршударо дорем.
Акнун савол ин аст: "Чаро?" Чунин ба назар мерасад, ки ҳуҷҷатҳое мавҷуданд, ки агар мо схема дошта бошем, пас тағирёбандаи "search_path" мавҷуд аст, ки ба мо мегӯяд, ки ҷадвалро дар куҷо ҷустуҷӯ кунем. Чунин ба назар мерасад, ки як тағирёбанда вуҷуд дорад.
Мушкил чист? Мушкилот дар он аст, ки изҳоротҳои аз ҷониби сервер омодашуда гумон намекунанд, ки search_path аз ҷониби касе метавонад тағир дода шавад. Ин арзиш барои базаи маълумот доимӣ боқӣ мемонад. Ва баъзе қисматҳо метавонанд маънои нав нагиранд.
Албатта, ин аз версияе, ки шумо озмоиш мекунед, вобаста аст. Вобаста аз он, ки ҷадвалҳои шумо то чӣ андоза ҷиддӣ фарқ мекунанд. Ва версияи 9.1 танҳо дархостҳои кӯҳнаро иҷро мекунад. Версияҳои нав метавонанд хатогиро пайдо кунанд ва ба шумо мегӯянд, ки шумо хатогӣ доред.
Онро чӣ гуна бояд табобат кард? Як дорухат оддӣ вуҷуд дорад - ин корро накунед. Ҳангоми кор кардани барнома, тағир додани search_path лозим нест. Агар шумо тағир диҳед, беҳтар аст, ки пайвасти нав эҷод кунед.
Шумо метавонед муҳокима кунед, яъне кушоед, муҳокима кунед, илова кунед. Шояд мо метавонем таҳиягарони пойгоҳи додаҳоро бовар кунонем, ки вақте касе арзишро тағир медиҳад, базаи маълумот бояд ба муштарӣ дар ин бора хабар диҳад: “Инак, арзиши шумо дар ин ҷо нав карда шудааст. Шояд шумо бояд изҳоротҳоро аз нав танзим кунед ва онҳоро дубора эҷод кунед?" Ҳоло базаи маълумот пинҳонӣ рафтор мекунад ва ба ҳеҷ ваҷҳ хабар намедиҳад, ки изҳорот дар ҷое тағир ёфтааст.
Ва ман бори дигар таъкид мекунам - ин чизест, ки барои Java хос нест. Мо ҳамон чизро дар PL/pgSQL як ба як мебинем. Аммо он дар он ҷо такрор карда мешавад.
Биёед кӯшиш кунем, ки маълумоти бештарро интихоб кунем. Мо интихоб мекунем ва интихоб мекунем. Мо ҷадвали дорои як миллион сатр дорем. Ҳар як сатр як килобайт аст. Тақрибан як гигабайт маълумот. Ва мо дар мошини Java хотираи кории 128 мегабайт дорем.
Мо, тавре ки дар ҳама китобҳо тавсия дода мешавад, коркарди ҷараёнро истифода мебарем. Яъне, мо resultSet-ро мекушоем ва маълумотро аз он ҷо оҳиста-оҳиста мехонем. Оё он кор мекунад? Оё он аз хотира меафтад? Каме мехонед? Биёед ба пойгоҳи додаҳо эътимод кунем, биёед ба Postgres эътимод кунем. Мо бовар намекунем. Оё мо OutOFMemory меафтем? OutOfMemory -ро кӣ аз сар гузаронидааст? Пас аз ин ба кӣ муяссар шуд, ки онро ислоҳ кунад? Ба касе муяссар шуд, ки онро дуруст кунад.
Агар шумо як миллион сатр дошта бошед, шумо наметавонед танҳо интихоб кунед. OFFSET/LIMIT лозим аст. Кӣ барои ин интихоб аст? Ва кӣ тарафдори бозӣ бо autoCommit аст?
Дар ин ҷо, чун маъмул, варианти ғайричашмдошт дуруст мебарояд. Ва агар шумо ногаҳон худкорро хомӯш кунед, он кӯмак хоҳад кард. Барои чӣ ин? Илм дар ин бора намедонад.
Аммо бо нобаёнӣ, ҳама муштариёне, ки ба пойгоҳи додаҳои Postgres пайваст мешаванд, тамоми маълумотро мегиранд. PgJDBC дар ин маврид истисно нест; он ҳама сатрҳоро интихоб мекунад.
Дар мавзӯи FetchSize як вариант вуҷуд дорад, яъне шумо метавонед дар сатҳи изҳороти алоҳида бигӯед, ки дар ин ҷо лутфан маълумотро то 10, 50 интихоб кунед. Аммо ин кор то он даме, ки шумо худкорро хомӯш кунед, кор намекунад. Хомӯш кардани autoCommit - он ба кор шурӯъ мекунад.
Аммо гузаштан аз рамз ва танзими setFetchSize дар ҳама ҷо нороҳат аст. Аз ин рӯ, мо танзимеро сохтем, ки арзиши пешфарзро барои тамоми пайвастшавӣ мегӯяд.
Он чизе ки мо гуфтем. Параметр танзим карда шудааст. Ва мо чӣ гирифтем? Агар мо миқдори камро интихоб кунем, агар, масалан, дар як вақт 10 сатрро интихоб кунем, пас мо хароҷоти изофии хеле калон дорем. Аз ин рӯ, ин арзиш бояд тақрибан сад муқаррар карда шавад.
Идеалӣ, албатта, шумо ҳоло ҳам бояд чӣ гуна маҳдуд кардани онро бо байтҳо омӯзед, аммо дорухат чунин аст: defaultRowFetchSize-ро ба зиёда аз сад таъин кунед ва хушбахт бошед.
Биёед ба ворид кардани маълумот гузарем. Ворид кардан осонтар аст, вариантҳои гуногун мавҷуданд. Масалан, INSERT, VALUES. Ин як варианти хуб аст. Шумо метавонед "INSERT SELECT" бигӯед. Дар амал хамин хел аст. Дар иҷроиш фарқият вуҷуд надорад.
Китобҳо мегӯянд, ки шумо бояд изҳороти Batch-ро иҷро кунед, китобҳо мегӯянд, ки шумо метавонед фармонҳои мураккабтарро бо якчанд қавс иҷро кунед. Ва Postgres як хусусияти олиҷаноб дорад - шумо метавонед COPY -ро иҷро кунед, яъне онро зудтар иҷро кунед.
Агар шумо онро чен кунед, шумо метавонед боз якчанд кашфиёти ҷолиб кунед. Мо мехоҳем, ки ин чӣ гуна кор кунад? Мо мехоҳем, ки фармонҳои нолозимро таҳлил накунем ва иҷро накунем.
Дар амал, TCP ба мо имкон намедиҳад, ки ин корро кунем. Агар муштарӣ бо фиристодани дархост банд бошад, пас базаи маълумот ҳангоми кӯшиши фиристодани посух ба мо дархостҳоро намехонад. Натиҷаи ниҳоӣ ин аст, ки муштарӣ мунтазири пойгоҳи додаҳо барои хондани дархост аст ва пойгоҳи додаҳо интизоранд, ки муштарӣ посухро бихонад.
Ва аз ин рӯ, муштарӣ маҷбур мешавад, ки давра ба давра бастаи ҳамоҳангсозиро фиристад. Муносибатҳои иловагии шабакавӣ, беҳудаи вақт.
Ва ҳар қадаре ки мо онҳоро илова кунем, ҳамон қадар бадтар мешавад. Ронанда хеле пессимист аст ва онҳоро зуд-зуд, тақрибан дар ҳар 200 сатр, вобаста ба андозаи хатҳо ва ғайра илова мекунад.
Чунин мешавад, ки шумо танҳо як сатрро ислоҳ мекунед ва ҳама чиз 10 маротиба суръат мегирад. Он рӯй медиҳад. Чаро? Чун маъмул, як доимии монанди ин аллакай дар ҷое истифода шудааст. Ва арзиши "128" маънои онро дошт, ки ба ҷамъоварӣ истифода набаред.
Ин хуб аст, ки ин ба нусхаи расмӣ дохил карда нашудааст. Пеш аз оғози нашр кашф карда шуд. Ҳамаи маъноҳое, ки ман медиҳам, бар версияҳои муосир асос ёфтаанд.
Биёед кӯшиш кунем. Мо InsertBatch-ро оддӣ чен мекунем. Мо InsertBatch-ро чанд маротиба чен мекунем, яъне ҳамон чизест, аммо арзишҳои зиёде мавҷуданд. Ҳаракати ҷолиб. На ҳама метавонанд ин корро кунанд, аммо ин як иқдоми оддӣ аст, нисбат ба COPY хеле осонтар аст.
Шумо метавонед COPY кунед.
Ва шумо метавонед инро дар сохторҳо иҷро кунед. Навъи пешфарзи корбарро эълон кунед, массивро гузаронед ва мустақиман ба ҷадвал INSERT кунед.
Агар шумо истинодро кушоед: pgjdbc/ubenchmsrk/InsertBatch.java, пас ин код дар GitHub аст. Шумо метавонед бубинед, ки кадом дархостҳо дар он ҷо тавлид мешаванд. Фарқ надорад.
оғоз кардем. Ва аввалин чизе, ки мо фаҳмидем, ин буд, ки истифода набурдани партия ғайриимкон аст. Ҳама вариантҳои бастабандӣ сифр мебошанд, яъне вақти иҷро дар муқоиса бо иҷрои якдафъаина амалан сифр аст.
Мо маълумотро ворид мекунем. Ин як ҷадвали хеле оддӣ аст. Се сутун. Ва мо дар ин ҷо чӣ мебинем? Мо мебинем, ки ҳар сеи ин вариантҳо тақрибан муқоисашавандаанд. Ва COPY, албатта, беҳтар аст.
Ин вақтест, ки мо қисмҳоро мегузорем. Вақте ки мо гуфтем, ки як арзиши VALUES, ду арзиши VALUES, се арзиши VALUES ё 10-тои онҳоро бо вергул ҷудо карда нишон додем. Ин ҳоло танҳо уфуқӣ аст. 1, 2, 4, 128. Дидан мумкин аст, ки «Вставкаи партия», ки бо ранги кабуд кашида шудааст, уро хеле бехтар хис мекунад. Яъне, вақте ки шумо як-якро ворид мекунед ё ҳатто вақте ки шумо дар як вақт чорро мегузоред, он ду маротиба хубтар мешавад, танҳо аз сабаби он ки мо каме бештар ба VALUES банд кардем. Камтар амалиётҳои EXECUTE.
Истифодаи COPY дар ҳаҷмҳои хурд хеле умедбахш аст. Ман ҳатто дар дуи аввал тасвир накардаам. Онҳо ба осмон мераванд, яъне ин рақамҳои сабз барои COPY.
COPY бояд вақте истифода шавад, ки шумо ҳадди аққал сад сатри маълумот дошта бошед. Маблаги кушодани ин алока калон аст. Ва, рости гап, ман дар ин самт кофта нашудаам. Ман партияро оптимизатсия кардам, аммо на Нусха.
Мо минбаъд чӣ кор мекунем? Мо кӯшиш кардем. Мо мефаҳмем, ки мо бояд ё сохторҳоро истифода барем ё як bacth оқилона, ки якчанд маъноро дар бар мегирад.
Аз гузориши имрӯза чиро бояд гирифт?
- PreparedStatement ҳама чизи мост. Ин ба хосилнокии мехнат бисьёр медихад. Он дар равғани атрафшон флопи калон ба вуҷуд меорад.
- Ва ба шумо лозим аст, ки 6 маротиба ТАҲҲИЛ ДИҲЕД.
- Ва ба мо лозим аст, ки OFFSET 0 ва ҳиллаҳои монанди +0 -ро ҳал кунем, то фоизи боқимондаи дархостҳои мушкили худро ислоҳ кунем.
Манбаъ: will.com