, dünyada "açıq mənbə kodlu ən yaxşı əlaqəli verilənlər bazası" son versiyası, plan üzrə hər şey yolunda gedərsə, bir neçə həftəyə çıxdı. Bu, hər il bir dəfə olan yeni versiyalar üçün adi bir cədvələ uyğundur və həqiqətən də təsir edicidir. Buna görə də, PostgreSQL icmasının fəal bir üzvü oldum.
Fikrimcə, əvvəlki buraxılışlardan fərqli olaraq, PostgreSQL 12-də bir-iki inqilabi xüsusiyyət (məsələn, bölmələmə və ya sorğuların paralelləşdirilməsi) yoxdur. Bir dəfə zarafat etdim ki, PostgreSQL 12-nin əsas xüsusiyyəti daha böyük stabillikdir. Yaxşı, bir işin kritik məlumatlarını idarə edərkən buna ehtiyacınız yoxdur?
Lakin PostgreSQL 12 bununla kifayətlənmir: yeni imkanlar və təkmilləşdirmələrlə tətbiqlər daha yaxşı işləyəcək, sizin isə sadəcə yüksəltmə etməyiniz tələb olunur!
(Yaxşı, bəlkə indeksləri yenidən qurmaq lazımdır, amma bu yeni versiyada bu alışdığımız kimi dəhşətli deyil.)
Bu, mükəmməl olacaq — PostgreSQL-i yüksəldin və dərhal əlavə çətinlik çəkmədən əhəmiyyətli yaxşılıqlara sahib olun. Bir neçə il əvvəl PostgreSQL 9.4-dən PostgreSQL 10-a keçidi analiz etmişdim və necə görə biləcəyinizi gördüm, çünki PostgreSQL 10-da sorğuların paralelləşdirilməsi yaxşılaşıb. Və ən önəmlisi, bəndləri çox da aydınlaşdırmam tələb olunmur (sadəcə konfiqurasiya parametrini təyin etməli idim) max_parallel_workers).
Razılaşarsınız ki, tətbiqlərin yüksəldildikdən sonra dərhal daha yaxşı çalışması rahatdır. Və biz istifadəçiləri sevindirmək üçün çox çalışırıq, çünki PostgreSQL-in istifadəçiləri getdikcə artır.
Beləliklə, sadə bir PostgreSQL 12-yə yüksəltmə sizi necə xoşbəxt edəcək? İndi izah edəcəyəm.
Serioz indeksləşdirmə yaxşılıqları
İndeks olmadan verilənlər bazası uzağa gedə bilməz. Bəs məlumatı necə sürətlə tapmalıyıq? PostgreSQL-in fundamental indeksləşdirmə sistemi belə adlanır . Bu indeks növü saxlanma sistemlərinə optimallaşdırılıb.
Biz sadəcə operatoru istifadə edirik CREATE INDEX ON some_table (some_column), PostgreSQL isə biz dəyərləri daima daxil etdiyimiz, yenilədiyimiz və silməyimizə baxmayaraq, indeksin etibarlılığını təmin etmək üçün böyük işlər görür. Bütün proses öz-özünə, sehrli şəkildə çalışır.
Amma PostgreSQL indekslərinin bir problemi var — onlar və diskdə əlavə yer tuturlar, məlumatların çıxarılması və yenilənməsi performansı aşağı düşür. "Şişmə" dedikdə, indeks strukturlarının təsirsiz saxlanması başa düşülür. Bu, bəlkə də - ya da olmaya bilər - mülkiyyətlərdən yaranan zibillərlə əlaqədardır, onu silir (bu məlumatı Peter Geoghegan-a təşəkkür edirəm ()). İndeks şişməsi, indeksin aktiv şəkildə dəyişdiyi iş yükü ilə çox fərqlidir.
PostgreSQL 12, B-Tree indekslərinin işləmə qabiliyyətini ciddi şəkildə artırır və TPC-C test növləri ilə aparılan eksperimentlər, yerin indi ortalama 40% az istifadə edildiyini göstərir. İndi yalnız B-Tree indekslərinin xidmətinə (yəni yazma əməliyyatlarına) daha az vaxt sərf edirik, eyni zamanda verilənlərin çıxarılmasına da, çünki indekslər çox daha kiçik oldu.
Cədvəllərini aktiv şəkildə yeniləyən tətbiqlər — adətən OLTP tətbiqləri () — diski çox daha səmərəli istifadə edəcək və sorğuları daha yaxşı emal edəcək. Diskdə daha çox yer olduqca, verilənlər bazasının infrastrukturu yüksəldilmədən böyüməsi üçün daha çox yeri olacaq.
Bəzi yüksəltmə strategiyaları B-Tree indekslərini yenidən qurmağı tələb edir ki, bu da bu üstünlüklərdən yararlansın (məsələn, indeksləri avtomatik yenidən qurmayacaq). PostgreSQL-in əvvəlki versiyalarında böyük indeksləri cədvəllərdə yenidən qurmaq bir müddət dayanıqlığa gətirib çıxarırdı, çünki bu müddət ərzində dəyişikliklər edilə bilmirdi. Lakin PostgreSQL 12-də, indeksləri paralel olaraq yenidən qurmaq üçün artıq bir gözəl xüsusiyyət var: , bu da tamamilə dayanıqlığı aradan qaldırır.
PostgreSQL 12-də indeksləmə infrastrukturunun başqa təkmilləşdirmələri də mövcuddur. Daha bir şey, burada sehrli bir müdaxilə olmadan olmadı — , yəni WAL (write-ahead log). Prediktiv yazı jurnal, hər bir tranzaksiyanı PostgreSQL-də qarışıqlıq və replikasiyaya qarşı yazır. Tətbiqlər bunu arxivləşdirmək və Təbii ki, prediktiv yazı jurnal diske yazılır, bu da performansa təsir göstərə bilər.
PostgreSQL 12-də, indekslər GiST, GIN və SP-GiST tərəfindən yaradılan WAL yazılarının xərcləri azaldılmışdır. Bu bir neçə hiss edir dəyərli üstünlük təmin edir: WAL yazıları diskin üzərində daha az yer tutur və verilənlərin bərpası, məsələn, böhran sonrası bərpa və ya müəyyən bir zamanda bərpa zamanı daha sürətli olur. Əgər siz tətbiqlərinizdə bu cür indekslərdən istifadə edirsinizsə (məsələn, PostGIS əsasında geospraysional tətbiqlərdə GISt indeksi çox istifadə olunur), bu, əlinizdən heç bir əlavə iş olmadan işinizi əhəmiyyətli dərəcədə yaxşılaşdıracaq bir xüsusiyyətdir.
Sekmentləşmə — daha çox, daha yaxşı, daha sürətli
PostgreSQL 10-da təqdim edildi. . PostgreSQL 11-də bu, daha da asan oldu. PostgreSQL 12-də isə, sekmentlərin ölçüsünü dəyişmək mümkündür.
PostgreSQL 12-də sekmentləşdirmə sisteminin performansı əhəmiyyətli dərəcədə yaxşılaşıb, xüsusilə cədvəldə minlərlə sekment olduqda. Məsələn, əgər sorğu cədvəldə yalnız bir neçə sekmenti əhatə edirsə, minlərlə sekment olan cədvəldə bu sorğu çox daha sürətli icra olunacaq. Bu cür sorğular üçün performans yalnız artırılmayıb; eyni zamanda, bir çox sekmenti olan cədvəllərdə INSERT əməliyyatlarının sürətləndiyini də görəcəksiniz.
Veri yazma vasitəsilə — bu, əslində, əla bir üsuldur və budur bir nümunə — PostgreSQL 12-də seqmentləşdirilmiş cədvəllərə keçid də daha səmərəlidir. COPY ilə hər şey sürətli idi, amma PostgreSQL 12-də tam bir uçuşa keçdi.
Bu üstünlüklərə görə PostgreSQL-də daha böyük məlumat dəstlərini saxlamaq mümkündür, onları çıxarmaq isə daha asandır. Və bunun üçün heç bir əziyyət çəkməyə ehtiyac yoxdur. Əgər tətbiqinizin bir çox seqmenti varsa, məsələn, o, zaman seriyası məlumatlarını yazırsa, sadə bir yüksəliş onun performansını əhəmiyyətli dərəcədə artıracaq.
Və bu yüksəliş "yenilədik və sevindik" kateqoriyasına daxil olmasa da, PostgreSQL 12-də seqmentləşdirilmiş cədvəllərə istinad edən xarici açarlar yaratmaq mümkündür, beləliklə, seqmentləşdirmə ilə iş daha da asan olur.
WITH sorğuları çox daha yaxşıdır
Nə zaman (onlar CTE olaraq da adlandırılır, WITH sorğuları), mən bu barədə yazmaq üçün səbirsizliklə gözləyirdim, . Bu, tətbiqi sürətləndirəcək özəlliklərdən biridir. Əgər, əlbəttə, CTE-lərdən istifadə edirsinizsə.
Mən tez-tez müşahidə edirəm ki, SQL-də yeni başlayanlar CTE-ləri sevir: əgər onları müəyyən bir şəkildə yazsanız, doğrudan da, imperativ proqram yazmağa bənzəyir. Mən şəxsən bu sorğuları yenidən yazaraq sim-kartı CTE-lərdən yayınmağı və performansı artırmağı üstün tuturdum. İndi isə hər şey fərqlidir.
PostgreSQL 12 bir xüsusi CTE tipini yan təsirlər olmadan daxil etməyə imkan tanıyır (SELECT), yalnız bir dəfə sorğunun sonuna yaxın istifadə olunan. Əgər mən CTE-lər ilə yazdığım sorğuların statistikasını aparsaydım, onların əksəriyyəti bu kateqoriyaya daxil olardı. Bu, proqramçılara daha aydın kod yazmağa kömək edir, indi isə o da sürətli işləyir.
Daha da yaxşısı, PostgreSQL 12 SQL-i öz-özünə optimallaşdırır, siz heç nə etməyə ehtiyac qalmır. Və buna görə də indi, yəqin ki, belə sorğuları optimallaşdırmağa ehtiyacım olmayacaq, PostgreSQL-in sorğu optimallaşdırmasına davam etməsi əladır.
Tam zamanlı (JIT) — indi standartdır
PostgreSQL 12 sistemlərində JIT tərtibatı standart olaraq aktivdir. Birincisi, siz müəyyən daxili əməliyyatlar üçün dəstəyi alırsınız, ikincisi, ifadələr (ən sadə nümunə — x + y) seçim siyahılarında (bu, SELECT-dən sonra gəlir), toplama əməliyyatlarında, WHERE şərtləri ilə ifadələrdə və digərlərində JIT ilə performansı artırmaq üçün istifadə olunur.
JIT PostgreSQL 12-də standart olaraq aktiv olduğuna görə, performans öz-özünə yaxşılaşacaq, amma mən tətbiqinizi PostgreSQL 11-də sınaqdan keçirməyi tövsiyə edirəm, burada yalnız JIT gəldi, sorğuların performansını ölçmək və nəyinsə tənzimlənməsinə ehtiyac olub-olmadığını öyrənmək üçün.
Bəs PostgreSQL 12-nin digər yeni xüsusiyyətləri?
PostgreSQL 12-də çox sayda yeni və faydalı xüsusiyyət mövcuddur — SQL/JSON standart ifadələri ilə JSON məlumatlarını öyrənmək imkanından tutmuş, çox faktorlu autentifikasiyaya qədər. clientcert=verify-full, yaradılan sütunlar və daha çox şey. Bunlar ayrıca bir yazı üçün yetərlidir.
PostgreSQL 10 kimi, PostgreSQL 12-nin yükseldilməsi ilə ümumi performans artacaq. Əlbəttə, sizin də öz yolunuz ola bilər — tətbiqi oxşar şəraitdə iş sistemində sınaqdan keçirib, inkişaf etdirmələrə daxil olmağı daha əvvəl yoxlayın, mənim PostgreSQL 10 ilə etdiyim kimi. Hətta PostgreSQL 12 indidən düşündüyümdən daha stabil olsa da, tətbiqlərinizi istehsala buraxmadan əvvəl keyfiyyətli sınaqdan keçirməkdən çəkinməyin.
Mənbə: habr.com
