Αναβάθμιση για τεμπέληδες: πώς το PostgreSQL 12 βελτιώνει την απόδοση

Αναβάθμιση για τεμπέληδες: πώς το PostgreSQL 12 βελτιώνει την απόδοση

PostgreSQL 12, η πιο πρόσφατη έκδοση της «καλύτερης σχεσιακής βάσης δεδομένων ανοιχτού κώδικα στον κόσμο», θα κυκλοφορήσει σε μερικές εβδομάδες (αν όλα πάνε σύμφωνα με το σχέδιο). Αυτό ακολουθεί το συνηθισμένο πρόγραμμα της κυκλοφορίας μιας νέας έκδοσης με έναν τόνο νέων χαρακτηριστικών μία φορά το χρόνο, και ειλικρινά, αυτό είναι εντυπωσιακό. Γι' αυτό έγινα ενεργό μέλος της κοινότητας PostgreSQL.

Κατά τη γνώμη μου, σε αντίθεση με τις προηγούμενες εκδόσεις, το PostgreSQL 12 δεν περιέχει ένα ή δύο επαναστατικά χαρακτηριστικά (όπως η κατάτμηση ή ο παραλληλισμός ερωτημάτων). Κάποτε αστειεύτηκα ότι το κύριο χαρακτηριστικό του PostgreSQL 12 είναι η μεγαλύτερη σταθερότητα. Αυτό δεν χρειάζεστε όταν διαχειρίζεστε τα κρίσιμα δεδομένα της επιχείρησής σας;

Αλλά το PostgreSQL 12 δεν σταματά εκεί: με νέες δυνατότητες και βελτιώσεις, οι εφαρμογές θα έχουν καλύτερη απόδοση, και το μόνο που χρειάζεται να κάνετε είναι να αναβαθμίσετε!

(Λοιπόν, ίσως να ξαναδημιουργηθούν τα ευρετήρια, αλλά σε αυτήν την έκδοση δεν είναι τόσο τρομακτικό όσο έχουμε συνηθίσει.)

Θα είναι υπέροχο να αναβαθμίσετε την PostgreSQL και να απολαύσετε αμέσως σημαντικές βελτιώσεις χωρίς περιττή φασαρία. Πριν από μερικά χρόνια, εξέτασα μια αναβάθμιση από PostgreSQL 9.4 σε PostgreSQL 10 και είδα πώς η εφαρμογή επιταχύνθηκε χάρη στον βελτιωμένο παραλληλισμό ερωτημάτων στο PostgreSQL 10. Και, το πιο σημαντικό, σχεδόν τίποτα δεν απαιτείται από εμένα (απλώς ορίστε μια παράμετρο διαμόρφωσης max_parallel_workers).

Συμφωνώ, είναι βολικό όταν οι εφαρμογές λειτουργούν καλύτερα αμέσως μετά την αναβάθμιση. Και προσπαθούμε πολύ σκληρά να ευχαριστήσουμε τους χρήστες, γιατί η PostgreSQL έχει όλο και περισσότερους από αυτούς.

Πώς μπορεί λοιπόν μια απλή αναβάθμιση σε PostgreSQL 12 να σας κάνει ευτυχισμένους; Θα σου πω τώρα.

Σημαντικές βελτιώσεις ευρετηρίασης

Χωρίς ευρετηρίαση, μια βάση δεδομένων δεν θα πάει μακριά. Πώς αλλιώς μπορείτε να βρείτε γρήγορα πληροφορίες; Το θεμελιώδες σύστημα ευρετηρίου της PostgreSQL ονομάζεται Β-δέντρο. Αυτός ο τύπος ευρετηρίου είναι βελτιστοποιημένος για συστήματα αποθήκευσης.

Απλώς χρησιμοποιούμε τον χειριστή CREATE INDEX ON some_table (some_column), και η PostgreSQL κάνει πολλή δουλειά για να διατηρεί το ευρετήριο ενημερωμένο, ενώ εισάγουμε, ενημερώνουμε και διαγράφουμε συνεχώς τιμές. Όλα λειτουργούν από μόνα τους, ως δια μαγείας.

Αλλά τα ευρετήρια PostgreSQL έχουν ένα πρόβλημα - αυτά είναι φουσκωμένα και καταλαμβάνουν επιπλέον χώρο στο δίσκο και μειώνουν την απόδοση της ανάκτησης και της ενημέρωσης δεδομένων. Με το "bloat" εννοώ την αναποτελεσματική διατήρηση της δομής του δείκτη. Αυτό μπορεί - μπορεί και όχι - να σχετίζεται με τις πλειάδες σκουπιδιών που αφαιρεί ΚΕΝΟ (ευχαριστώ τον Peter Gaghan για τις πληροφορίες)Peter Geoghegan)). Η διόγκωση του δείκτη είναι ιδιαίτερα αισθητή σε φόρτους εργασίας όπου ο δείκτης αλλάζει ενεργά.

Το PostgreSQL 12 βελτιώνει σημαντικά την απόδοση των ευρετηρίων B-tree και πειράματα με σημεία αναφοράς όπως το TPC-C έχουν δείξει ότι κατά μέσο όρο χρησιμοποιείται πλέον 40% λιγότερος χώρος. Τώρα ξοδεύουμε λιγότερο χρόνο όχι μόνο για τη διατήρηση ευρετηρίων B-tree (δηλαδή για πράξεις εγγραφής), αλλά και για την ανάκτηση δεδομένων, επειδή τα ευρετήρια είναι πολύ μικρότερα.

Εφαρμογές που ενημερώνουν ενεργά τους πίνακές τους - συνήθως εφαρμογές OLTP (επεξεργασία συναλλαγών σε πραγματικό χρόνο) - θα χρησιμοποιεί το δίσκο και θα επεξεργάζεται αιτήματα πολύ πιο αποτελεσματικά. Όσο περισσότερος χώρος στο δίσκο, τόσο περισσότερος χώρος έχει η βάση δεδομένων για να αναπτυχθεί χωρίς να αναβαθμιστεί η υποδομή.

Ορισμένες στρατηγικές αναβάθμισης απαιτούν την αναδόμηση ευρετηρίων B-tree για να επωφεληθούν από αυτά τα οφέλη (π. pg_upgrade δεν θα αναδημιουργήσει τα ευρετήρια αυτόματα). Σε προηγούμενες εκδόσεις της PostgreSQL, η αναδόμηση μεγάλων ευρετηρίων σε πίνακες είχε ως αποτέλεσμα σημαντικό χρόνο διακοπής λειτουργίας, επειδή δεν μπορούσαν να γίνουν αλλαγές στο μεταξύ. Αλλά το PostgreSQL 12 έχει ένα άλλο ωραίο χαρακτηριστικό: τώρα μπορείτε να αναδημιουργήσετε ευρετήρια παράλληλα με την εντολή REINDEX ΣΥΓΧΡΟΝΩΣγια να αποφευχθεί εντελώς η διακοπή λειτουργίας.

Υπάρχουν άλλες βελτιώσεις στην υποδομή ευρετηρίασης στο PostgreSQL 12. Ένα άλλο πράγμα όπου υπήρχε κάποια μαγεία - ημερολόγιο εγγραφής, γνωστός και ως WAL (ημερολόγιο εγγραφής πριν). Ένα αρχείο καταγραφής εγγραφής καταγράφει κάθε συναλλαγή στην PostgreSQL σε περίπτωση αποτυχίας και αναπαραγωγής. Οι εφαρμογές το χρησιμοποιούν για αρχειοθέτηση και ανάκαμψη σε σημείο στο χρόνο. Φυσικά, το αρχείο καταγραφής εγγραφής είναι γραμμένο στο δίσκο, κάτι που μπορεί να επηρεάσει την απόδοση.

Το PostgreSQL 12 έχει μειώσει την επιβάρυνση των εγγραφών WAL που δημιουργούνται από τα ευρετήρια GiST, GIN και SP-GiST κατά την κατασκευή ευρετηρίου. Αυτό παρέχει πολλά απτά πλεονεκτήματα: οι εγγραφές WAL καταλαμβάνουν λιγότερο χώρο στο δίσκο και τα δεδομένα αναπαράγονται γρηγορότερα, όπως κατά τη διάρκεια της ανάκτησης από καταστροφή ή της ανάκτησης σε χρόνο σημείου. Εάν χρησιμοποιείτε τέτοια ευρετήρια στις εφαρμογές σας (για παράδειγμα, οι γεωχωρικές εφαρμογές που βασίζονται σε PostGIS χρησιμοποιούν πολύ το ευρετήριο GiST), αυτό είναι ένα άλλο χαρακτηριστικό που θα βελτιώσει σημαντικά την εμπειρία χωρίς καμία προσπάθεια εκ μέρους σας.

Διαμέριση - μεγαλύτερο, καλύτερο, πιο γρήγορο

Παρουσιάστηκε η PostgreSQL 10 δηλωτική κατάτμηση. Στο PostgreSQL 11 έχει γίνει πολύ πιο εύκολο στη χρήση. Στο PostgreSQL 12 μπορείτε να αλλάξετε την κλίμακα των ενοτήτων.

Στο PostgreSQL 12, η ​​απόδοση του συστήματος διαμερισμάτων έχει γίνει σημαντικά καλύτερη, ειδικά αν υπάρχουν χιλιάδες κατατμήσεις στον πίνακα. Για παράδειγμα, εάν ένα ερώτημα επηρεάζει μόνο μερικά διαμερίσματα σε έναν πίνακα με χιλιάδες από αυτά, θα εκτελεστεί πολύ πιο γρήγορα. Η απόδοση δεν βελτιώνεται μόνο για αυτούς τους τύπους ερωτημάτων. Θα παρατηρήσετε επίσης πόσο πιο γρήγορες είναι οι λειτουργίες INSERT σε πίνακες με πολλαπλά διαμερίσματα.

Καταγραφή δεδομένων με χρήση COPY - Παρεμπιπτόντως, αυτός είναι ένας υπέροχος τρόπος μαζική λήψη δεδομένων και ιδού ένα παράδειγμα λήψη JSON — Οι διαμερισμένοι πίνακες στο PostgreSQL 12 έχουν επίσης γίνει πιο αποτελεσματικοί. Με το COPY όλα ήταν ήδη γρήγορα, αλλά στο PostgreSQL 12 πετάει απολύτως.

Χάρη σε αυτά τα πλεονεκτήματα, η PostgreSQL σάς επιτρέπει να αποθηκεύετε ακόμη μεγαλύτερα σύνολα δεδομένων και να διευκολύνετε την ανάκτησή τους. Και καμία προσπάθεια από μέρους σας. Εάν η εφαρμογή έχει πολλά διαμερίσματα, όπως καταγραφή δεδομένων χρονοσειρών, μια απλή αναβάθμιση θα βελτιώσει σημαντικά την απόδοσή της.

Αν και αυτό δεν είναι ακριβώς μια βελτίωση "αναβάθμιση και απόλαυση", η PostgreSQL 12 σάς επιτρέπει να δημιουργείτε ξένα κλειδιά που αναφέρονται σε διαμερισμένους πίνακες, καθιστώντας τη διαμέριση ευχάριστη εργασία.

ΜΕ Ερωτήματα μόλις έγινε πολύ καλύτερο

Όταν εφαρμόστηκε μια ενημερωμένη έκδοση κώδικα για ενσωματωμένες κοινές εκφράσεις πίνακα (γνωστός και ως CTE, γνωστός και ως WITH queries), ανυπομονούσα να γράψω ένα άρθρο σχετικά πόσο ευχαριστημένοι ήταν οι προγραμματιστές εφαρμογών με την PostgreSQL. Αυτό είναι ένα από εκείνα τα χαρακτηριστικά που θα επιταχύνουν την εφαρμογή. Εκτός, φυσικά, εάν χρησιμοποιείτε CTE.

Συχνά διαπιστώνω ότι στους αρχάριους στην SQL λατρεύουν να χρησιμοποιούν CTE· αν τα γράψετε με έναν συγκεκριμένο τρόπο, είναι πραγματικά σαν να γράφετε ένα επιτακτική ανάγκη. Προσωπικά, μου άρεσε να ξαναγράφω αυτά τα ερωτήματα για να περιφέρομαι χωρίς CTE και αύξηση της παραγωγικότητας. Τώρα όλα είναι διαφορετικά.

Το PostgreSQL 12 σάς επιτρέπει να ενσωματώσετε έναν συγκεκριμένο τύπο CTE χωρίς παρενέργειες (SELECT), το οποίο χρησιμοποιείται μόνο μία φορά κοντά στο τέλος του αιτήματος. Εάν παρακολουθούσα τα ερωτήματα CTE που έγραψα ξανά, τα περισσότερα από αυτά θα εμπίπτουν σε αυτήν την κατηγορία. Αυτό βοηθά τους προγραμματιστές να γράφουν καθαρό κώδικα που τώρα εκτελείται επίσης γρήγορα.

Επιπλέον, το PostgreSQL 12 βελτιστοποιεί την ίδια την εκτέλεση της SQL, χωρίς να χρειάζεται να κάνετε τίποτα. Και παρόλο που μάλλον δεν θα χρειαστεί να βελτιστοποιήσω τέτοια ερωτήματα τώρα, είναι υπέροχο που η PostgreSQL συνεχίζει να εργάζεται για τη βελτιστοποίηση ερωτημάτων.

Just-in-Time (JIT) - τώρα προεπιλογή

Σε συστήματα PostgreSQL 12 με υποστήριξη LLVM Η μεταγλώττιση JIT είναι ενεργοποιημένη από προεπιλογή. Πρώτα απ 'όλα, έχετε υποστήριξη JIT για ορισμένες εσωτερικές λειτουργίες και, δεύτερον, ερωτήματα με εκφράσεις (το απλούστερο παράδειγμα είναι x + y) σε λίστες επιλογής (που έχετε μετά το SELECT), συγκεντρωτικά στοιχεία, εκφράσεις με προτάσεις WHERE και άλλα μπορούν να χρησιμοποιήσουν το JIT για να βελτιώσουν την απόδοση.

Εφόσον το JIT είναι ενεργοποιημένο από προεπιλογή στο PostgreSQL 12, η ​​απόδοση θα βελτιωθεί από μόνη της, αλλά συνιστώ να δοκιμάσετε την εφαρμογή στο PostgreSQL 11, το οποίο εισήγαγε το JIT, για να μετρήσετε την απόδοση του ερωτήματος και να δείτε αν χρειάζεται να συντονίσετε κάτι.

Τι γίνεται με τις υπόλοιπες νέες δυνατότητες στο PostgreSQL 12;

Το PostgreSQL 12 έχει πολλά νέα χαρακτηριστικά, από τη δυνατότητα εξέτασης δεδομένων JSON χρησιμοποιώντας τυπικές εκφράσεις διαδρομής SQL/JSON έως έλεγχο ταυτότητας πολλαπλών παραγόντων με μια παράμετρο clientcert=verify-full, δημιούργησε στήλες και πολλά άλλα. Αρκετά για μια ξεχωριστή ανάρτηση.

Όπως το PostgreSQL 10, το PostgreSQL 12 θα βελτιώσει τη συνολική απόδοση αμέσως μετά την αναβάθμιση. Εσείς, φυσικά, μπορείτε να έχετε τη δική σας διαδρομή - δοκιμάστε την εφαρμογή υπό παρόμοιες συνθήκες στο σύστημα παραγωγής πριν ενεργοποιήσετε βελτιώσεις, όπως έκανα με το PostgreSQL 10. Ακόμα κι αν το PostgreSQL 12 είναι ήδη πιο σταθερό από ό,τι περίμενα, μην τεμπελιάζετε στις δοκιμές εφαρµογές διεξοδικά, πριν τις ελευθερώσουν στην παραγωγή.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο