Dangasalar uchun yangilang: PostgreSQL 12 qanday ishlashini yaxshilaydi

Dangasalar uchun yangilang: PostgreSQL 12 qanday ishlashini yaxshilaydi

PostgreSQL 12, "Dunyodagi eng yaxshi ochiq manbali relyatsion ma'lumotlar bazasi" ning so'nggi versiyasi bir necha hafta ichida chiqadi (agar hammasi rejaga muvofiq bo'lsa). Bu yiliga bir marta tonna yangi xususiyatlarga ega yangi versiyani chiqarishning odatiy jadvaliga amal qiladi va ochig'ini aytganda, bu juda ta'sirli. Shuning uchun men PostgreSQL hamjamiyatining faol a'zosi bo'ldim.

Menimcha, oldingi nashrlardan farqli o'laroq, PostgreSQL 12 bir yoki ikkita inqilobiy xususiyatni o'z ichiga olmaydi (bo'linish yoki so'rovlar parallelligi kabi). Men bir marta hazillashdimki, PostgreSQL 12 ning asosiy xususiyati kattaroq barqarorlikdir. Sizning biznesingizning muhim ma'lumotlarini boshqarishda sizga kerak bo'lgan narsa shu emasmi?

Ammo PostgreSQL 12 shu bilan tugamaydi: yangi xususiyatlar va yaxshilanishlar bilan ilovalar yanada yaxshi ishlaydi, va siz qilishingiz kerak bo'lgan yagona narsa yangilanishdir!

(Xo'sh, indekslarni qayta tiklashingiz mumkin, ammo bu nashrda biz odatdagidek qo'rqinchli emas.)

PostgreSQL-ni yangilash va keraksiz shov-shuvlarsiz darhol sezilarli yaxshilanishlardan bahramand bo'lish juda yaxshi bo'ladi. Bir necha yil oldin men PostgreSQL 9.4 dan PostgreSQL 10 ga yangilashni ko'rib chiqdim va PostgreSQL 10 da yaxshilangan so'rovlar parallelligi tufayli ilova qanday tezlashganini ko'rdim. Va eng muhimi, mendan deyarli hech narsa talab qilinmadi (shunchaki konfiguratsiya parametrini o'rnating. max_parallel_workers).

Qabul qiling, ilovalar yangilangandan so'ng darhol yaxshiroq ishlaganda qulay. Va biz foydalanuvchilarni xursand qilish uchun juda ko'p harakat qilamiz, chunki PostgreSQL-da ularning soni tobora ko'payib bormoqda.

Xo'sh, qanday qilib PostgreSQL 12 ga oddiy yangilanish sizni xursand qilishi mumkin? Men hozir aytaman.

Indekslashning asosiy yaxshilanishlari

Indekslashsiz ma'lumotlar bazasi uzoqqa bormaydi. Yana qanday qilib tezda ma'lumotni topishingiz mumkin? PostgreSQL-ning asosiy indekslash tizimi deyiladi B-daraxt. Ushbu turdagi indeks saqlash tizimlari uchun optimallashtirilgan.

Biz shunchaki operatordan foydalanamiz CREATE INDEX ON some_table (some_column), va PostgreSQL biz doimiy ravishda qiymatlarni kiritish, yangilash va o'chirishda indeksni yangilab turish uchun juda ko'p ishlarni bajaradi. Hamma narsa o'z-o'zidan ishlaydi, go'yo sehr bilan.

Ammo PostgreSQL indekslarida bitta muammo bor - ular shishiriladi va qo'shimcha disk maydoni egallaydi va ma'lumotlarni olish va yangilash samaradorligini pasaytiradi. "Bloat" deganda men indeks tuzilmasini samarasiz saqlashni nazarda tutyapman. Bu olib tashlaydigan axlat qutilari bilan bog'liq bo'lishi mumkin yoki bo'lmasligi mumkin VAKUM (ma'lumot uchun Piter Gaganga rahmat)Piter Geoghegan)). Indeksning shishishi, ayniqsa indeks faol o'zgarib turadigan ish yuklarida seziladi.

PostgreSQL 12 B-daraxt indekslarining ishlashini sezilarli darajada yaxshilaydi va TPC-C kabi ko'rsatkichlar bilan o'tkazilgan tajribalar shuni ko'rsatdiki, hozirda o'rtacha 40% kamroq joy ishlatiladi. Endi biz nafaqat B-daraxt indekslarini saqlashga (ya'ni, yozish operatsiyalariga), balki ma'lumotlarni qayta tiklashga ham kamroq vaqt sarflaymiz, chunki indekslar ancha kichik.

Jadvallarini faol yangilaydigan ilovalar - odatda OLTP ilovalari (real vaqtda tranzaktsiyalarni qayta ishlash) - diskdan foydalanadi va so'rovlarni ancha samarali qayta ishlaydi. Disk maydoni qanchalik ko'p bo'lsa, infratuzilmani yangilamasdan ma'lumotlar bazasi o'sishi uchun shunchalik ko'p joy kerak bo'ladi.

Ba'zi yangilash strategiyalari ushbu imtiyozlardan foydalanish uchun B-daraxt indekslarini qayta tiklashni talab qiladi (masalan, pg_upgrade indekslarni avtomatik ravishda qayta tiklamaydi). PostgreSQL ning oldingi versiyalarida katta indekslarni jadvallarda qayta tiklash sezilarli uzilishlarga olib keldi, chunki bu orada o'zgarishlarni amalga oshirib bo'lmaydi. Ammo PostgreSQL 12 yana bir ajoyib xususiyatga ega: endi siz buyruq bilan parallel ravishda indekslarni qayta tiklashingiz mumkin. QAYTA INDEKSIYA QILISHto'xtab qolishdan butunlay qochish uchun.

PostgreSQL 12 da indekslash infratuzilmasida boshqa yaxshilanishlar mavjud. Sehrgarlik bo'lgan yana bir narsa - oldindan yozish jurnali, aka WAL (oldindan yozish jurnali). Oldindan yozish jurnali muvaffaqiyatsizlik va replikatsiya holatlarida PostgreSQL-dagi har bir tranzaktsiyani qayd qiladi. Ilovalar uni arxivlash uchun ishlatadi va Vaqtinchalik tiklanish. Albatta, oldindan yozish jurnali diskka yoziladi, bu esa ishlashga ta'sir qilishi mumkin.

PostgreSQL 12 indeksni yaratish jarayonida GiST, GIN va SP-GiST indekslari tomonidan yaratilgan WAL yozuvlarining qo'shimcha xarajatlarini kamaytirdi. Bu bir qancha sezilarli afzalliklarni beradi: WAL yozuvlari diskda kamroq joy egallaydi va ma'lumotlar tezroq qayta o'ynaladi, masalan, ofatni tiklash yoki o'z vaqtida tiklash. Agar siz ilovalaringizda bunday indekslardan foydalansangiz (masalan, PostGIS-ga asoslangan geofazoviy ilovalar GiST indeksidan ko'p foydalanadi), bu sizning tarafingizdan hech qanday harakat qilmasdan tajribani sezilarli darajada yaxshilaydigan yana bir xususiyatdir.

Bo'linish - kattaroq, yaxshiroq, tezroq

PostgreSQL 10 joriy etildi deklarativ bo'linish. PostgreSQL 11 da undan foydalanish ancha osonlashdi. PostgreSQL 12 da siz bo'limlar masshtabini o'zgartirishingiz mumkin.

PostgreSQL 12-da, bo'linish tizimining ishlashi sezilarli darajada yaxshilandi, ayniqsa jadvalda minglab bo'limlar mavjud bo'lsa. Misol uchun, agar so'rov minglab jadvaldagi bir nechta bo'limlarga ta'sir qilsa, u tezroq bajariladi. Ushbu turdagi so'rovlar uchun unumdorlik yaxshilanmaydi. Bundan tashqari, bir nechta bo'limli jadvallarda INSERT operatsiyalari qanchalik tez bajarilishini ko'rasiz.

Foydalanish orqali ma'lumotlarni yozib olish Copy - Aytgancha, bu ajoyib yo'l ommaviy ma'lumotlarni yuklab olish va bu erda bir misol JSON qabul qilish — PostgreSQL 12 da bo‘lingan jadvallar ham samaraliroq bo‘ldi. COPY bilan hamma narsa allaqachon tez edi, lekin PostgreSQL 12 da u mutlaqo uchib ketadi.

Ushbu afzalliklar tufayli PostgreSQL sizga kattaroq ma'lumotlar to'plamlarini saqlash va ularni olishni osonlashtirish imkonini beradi. Va sizning tarafingizdan hech qanday harakat yo'q. Agar dasturda vaqt seriyasi ma'lumotlarini yozish kabi ko'plab bo'limlar bo'lsa, oddiy yangilash uning ish faoliyatini sezilarli darajada yaxshilaydi.

Garchi bu "yangilash va zavqlanish" yaxshilanishi bo'lmasa-da, PostgreSQL 12 sizga qismlarga bo'lingan jadvallarga havola qiluvchi xorijiy kalitlarni yaratishga imkon beradi, bu esa bo'limlarni ishlashdan zavqlantiradi.

WITH so'rovlari ancha yaxshilandi

qachon o'rnatilgan umumiy jadval ifodalari uchun yamoq qo'llanildi (aka CTE, aka WITH so'rovlar), men maqola yozishni kutolmadim PostgreSQL bilan dastur ishlab chiquvchilar qanchalik baxtli edi. Bu dasturni tezlashtiradigan xususiyatlardan biridir. Agar siz CTE dan foydalanmasangiz.

Men tez-tez SQL-ga yangi boshlanuvchilar CTE-dan foydalanishni yaxshi ko'rishlarini ko'raman; agar siz ularni ma'lum bir tarzda yozsangiz, siz haqiqatan ham imperativ dastur yozayotgandek bo'lasiz. Shaxsan men bu so'rovlarni aylanib chiqish uchun qayta yozishni yoqtirardim holda CTE va unumdorlikni oshirish. Endi hammasi boshqacha.

PostgreSQL 12 sizga ma'lum turdagi CTE ni nojo'ya ta'sirlarsiz kiritish imkonini beradi (SELECT), so'rov oxirida faqat bir marta ishlatiladi. Agar men qayta yozgan CTE so'rovlarini kuzatib tursam, ularning aksariyati ushbu toifaga kiradi. Bu ishlab chiquvchilarga aniq kod yozishga yordam beradi, endi u ham tez ishlaydi.

Bundan tashqari, PostgreSQL 12 hech narsa qilmasdan SQL bajarilishini optimallashtiradi. Va endi men bunday so'rovlarni optimallashtirishga hojat qolmasa ham, PostgreSQL so'rovlarni optimallashtirish ustida ishlashda davom etayotgani juda yaxshi.

Just-in-Time (JIT) - endi standart

Qo'llab-quvvatlanadigan PostgreSQL 12 tizimlarida LLVM JIT kompilyatsiyasi sukut bo'yicha yoqilgan. Avvalo, siz qo'llab-quvvatlaysiz JIT ba'zi ichki operatsiyalar uchun, ikkinchidan, tanlangan ro'yxatlardagi ifodali so'rovlar (eng oddiy misol x + y), agregatlar, WHERE bandlari bo'lgan iboralar va boshqalar ishlashni yaxshilash uchun JIT dan foydalanishi mumkin.

PostgreSQL 12 da JIT sukut boʻyicha yoqilganligi sababli, unumdorlik oʻz-oʻzidan yaxshilanadi, lekin soʻrovlar samaradorligini oʻlchash va biror narsani sozlashingiz kerakligini bilish uchun JITni joriy qilgan PostgreSQL 11 da ilovani sinab koʻrishni tavsiya qilaman.

PostgreSQL 12-dagi qolgan yangi xususiyatlar haqida nima deyish mumkin?

PostgreSQL 12 standart SQL/JSON marshrut ifodalari yordamida JSON ma'lumotlarini tekshirish qobiliyatidan tortib parametr bilan ko'p faktorli autentifikatsiyagacha bo'lgan ko'plab ajoyib yangi xususiyatlarga ega. clientcert=verify-full, yaratilgan ustunlar va boshqalar. Alohida post uchun etarli.

PostgreSQL 10 singari, PostgreSQL 12 ham yangilanishdan so'ng darhol umumiy ish faoliyatini yaxshilaydi. Siz, albatta, o'z yo'lingizga ega bo'lishingiz mumkin - yaxshilanishlarni yoqishdan oldin, men PostgreSQL 10 bilan qilganimdek, dasturni ishlab chiqarish tizimida shunga o'xshash sharoitlarda sinab ko'ring. Hatto PostgreSQL 12 men kutganimdan ham barqarorroq bo'lsa ham, sinovdan o'tishda dangasa bo'lmang. ilovalarni ishlab chiqarishga chiqarishdan oldin yaxshilab o'rganing.

Manba: www.habr.com

a Izoh qo'shish