Nach dem Treffen „PostgreSQL 11 New Features“ (Teil 2)

Im ersten Teil haben wir über die wichtigsten Neuerungen und Änderungen in PostgreSQL 11 gesprochen. Dieses Mal werden wir einige Punkte im Frage / Antwort-Format, die durch Meetup angesprochen wurden, genauer diskutieren.

Was ist der beste Weg, um ein großes Datenarray als Satz von Eingabeparametern für eine gespeicherte Prozedur in PL / pgSQL zu übertragen?


Am bequemsten ist es, eine temporäre Tabelle zu erstellen, dort Kopien der Daten zu erstellen und diese dann in der Prozedur zu verwenden.

Externe Engines (zheap) und die Entwicklung von In-Memory-PostgreSQL


Nicht für alle Workloads ist ein Modell geeignet, bei dem alte Versionen von Datensätzen in der Tabelle selbst gespeichert werden. In allen anderen Subd (versionionniki) werden sie in einem Rückgängig-Protokoll gespeichert. Sie können über die Machbarkeit streiten, aber unter dem Strich müssen Sie alte Datensätze irgendwo speichern. Wenn sie eine kurze Lebensdauer haben und jemand sie selten anspricht, ist das Speichern in der Tabelle selbst schädlich. Die externe zheap-Engine PostgreSQL ist ein Versuch von EnterpriseDB, eine Tabellen-Engine für PostgreSQL mit Rückgängig-Protokoll zu erstellen. Es funktioniert, obwohl es noch etwas zu verbessern gibt.

Wer arbeitet mit Frau SQL im SNAPSHOT Isolation Level-Modus weiß, dass es Tempdb hat, in dem alte Versionen abgelegt werden, und ist mit einem vollständigen Staubsauger zum Reinigen von Tempdb ausgestattet. Andererseits fordert die Community an, In-Memory-Tabellen in PostgreSQL zu erstellen. Dies ist ganz einfach möglich: tmpfs, und das war's. In PostgreSQL Pro wurde sogar die erste Pilotversion veröffentlicht, die Sie ausprobieren können.

Was PostgreSQL nie hatte, waren Plug-In-Engines. Es gab steckbare Indizes, die eine gemeinsame WAL verwendeten. PostgreSQL muss viel einstecken und wenig im laufenden Betrieb ersetzen. Beispielsweise ist Executor nicht deaktiviert, Sie können jedoch bereits benutzerdefinierte Knoten verwenden, die Sie selbst programmieren. Die Optimierer in PostgreSQL sind vollständig steckbar. Sie können Ihre eigenen schreiben und PostgreSQL als Interpret Ihrer Abfragen verwenden. SQL-Parser kann nicht verbunden werden.

Motoren wollen in drei Richtungen verbunden werden:

  • Motor mit Rückgängig-Protokoll
  • In-Memory
  • Spaltenspeicher für OLAP-Abfragen

Postgres Pro befindet sich in Gesprächen mit EnterpriseDB darüber, wie eine API erstellt werden kann, um all dies zu verbinden.

Über Fremdschlüssel


Fremdschlüssel in PostgreSQL werden durch Trigger implementiert. Sie können Ihren Trigger schreiben, der jede Art von Funktionalität implementiert. Alle möglichen Einschränkungen müssen im Trigger vorgenommen werden. Die Logik in den Triggern ist nicht besonders notwendig, um zu behalten, aber alles zu überprüfen - es ist notwendig.

Plant Postgres Pro SaaS oder PaaS?


Postgres Pro plant, PostgreSQL für die Cloud zu optimieren, insbesondere um dynamische Änderungen an Freigabepuffern zu implementieren und die Anzahl der Parameter zu verringern, die einen Neustart von PostgreSQL erfordern. Sie werden die Cloud nicht selbst erstellen.

Wie richte ich ein Laufwerk ein, damit die parallele Indizierung schneller funktioniert? Was ist besser, mehrere Festplatten oder eine SSD?


Besser ein paar SSDs. Je mehr Parallelisierungsoptionen die Hardware bietet, desto besser. Wenn Sie eine Festplatte, nicht genügend Speicher und einen Prozessor haben, hilft Ihnen die Parallelisierung nicht weiter. SSDs haben jedoch eine Besonderheit: Sie verlangsamen sich, wenn mehr als 80% des Volumens belegt sind. Vergessen Sie daher nicht, die Trimmung anzupassen, da sonst die Grenze von 80% bei etwa 50% liegt.

Wörterbuchverwaltung und Hinzufügen von Wörtern in der Volltextsuche


Wenn Sie Zauber oder Schneeball verwenden, ändern Sie einfach das Stoppwortwörterbuch. Das Problem ist, dass die Indizierung keinen Sinn macht, wenn Sie ein Stoppwort hinzugefügt haben. Dies kann langsam erfolgen. Ein Stoppwort wird aus einer Anfrage entfernt und niemals durchsucht. Und wenn Sie das Stoppwort entfernt haben, ist es nirgends in der Sammlung vorhanden und Sie müssen es neu indizieren. Das Problem liegt nicht im Wörterbuch, sondern darin, dass Sie es bereits verwendet und Ihr Wissen gespeichert haben.

In vielen Fällen können Sie auch die wenig bekannte Funktion ts_rewrite verwenden, mit der Sie einen Teil der Anforderung durch eine andere Anforderung ersetzen können. Als zum Beispiel das U-Boot Kursk ertrank, eilten alle, um Informationen darüber zu suchen. Fedor Sigaev arbeitete zu dieser Zeit im Wanderer, und auf Wunsch von "Kursk" wurden Informationen über die Stadt herausgegeben. Sie nahmen umgehend eine Substitution vor: Geben Sie bei diesem Wort Informationen über das U-Boot heraus. Aber dann begannen Benutzer zu fluchen, die sich für das Dorf selbst interessierten. Ich weiß nicht, ob sie es realisiert haben oder nicht, aber es war notwendig, die "Stadt Kursk" vorzustellen. Mit solchen Ersetzungen kann ts_rewrite vorgenommen werden. Darüber hinaus kann die Funktion für einen reibungslosen Übergang während des Zeitraums der Wörterbuchänderungen verwendet werden.

Das Ändern des Parsers und der Wörterbücher ist natürlich eine komplexe Aufgabe. Sprachen mit unterschiedlichen Alphabeten wie Russisch und Englisch verstehen sich gut. Viel schlimmer sind jetzt beispielsweise französisch-englische Texte. Es ist nicht klar, auf welche Sprache sich ein Wort bezieht, was auf die gleiche Weise geschrieben ist, aber in einer Sprache ist es ein Stoppwort und in einer anderen nicht. Postgres Pro arbeitet derzeit an der Feinabstimmung von Wörterbüchern, um komplexere Konfigurationen zu beschreiben.

Abdeckungsindizes und heißes Update


Es sind vollkommen Freunde. Richtig, wenn mindestens ein Feld im Deckindex aktualisiert wird, verhält sich der Index wie gewohnt und alles wird ersetzt.

Unfähigkeit, temporäre Tabellen zu erstellen, wenn Abfragen im Standby ausgeführt werden


PostgreSQL speichert kein Tabellenwissen im Systemverzeichnis, aber es gibt einen Patch, der Wissen in das Systemverzeichnis überträgt. Daher können Sie mit diesem Patch temporäre Tabellen verwenden. Dann tritt jedoch ein anderes Problem auf: Es sind keine Transaktionen in Bereitschaft. Um mit einer temporären Tabelle zu arbeiten, müssen Sie die doppelte virtuelle Transaktions-ID verwenden, die nur für temporäre Tabellen gilt und nicht für die Haupttabellen, die vom Assistenten stammen. Wenn Sie sich eine 32-Bit-Zahl ansehen, handelt es sich um zwei verschiedene Zahlen.

Postgres Pro verfügt außerdem über ein Modul pg_variables, das auch im Standby-Modus funktioniert. Dies ist keine temporäre Tabelle, aber die erforderliche Funktionalität kann dargestellt werden.

Implementieren Sie den Cluster-Index


Postgres Pro hatte mehrere Versuche, es zu implementieren. Jetzt können Sie den Clustertabellenindex eingeben und die Tabelle wird in derselben Reihenfolge angezeigt. Leiden unter dem Verwalten einer Tabelle in einem Clusterzustand. Wir haben verschiedene Ansätze ausprobiert, aber das Einfügen in eine solche Tabelle war immer sehr teuer. Und das ist für niemanden interessant. Daher wurde bisher der Schluss gezogen, dass es notwendig ist, zu Index Organized Tables zu wechseln.

Empfohlener Autovakuum-Skalierungsfaktor


Normalerweise empfehlen wir die Einstellung von 1 - 5%. Dies ist jedoch völlig optional. Für kleine Tabellen, in denen trotz der Änderungen im Durchschnitt die gleiche Verteilung erhalten bleibt, kann ein großer Wert festgelegt werden. Wenn der Tisch groß ist und selten aufgefüllt wird, aber treffend, mit einer starken Änderung in der Verteilung, müssen Sie etwas anderes erfinden. Es hängt alles von der Verteilung Ihrer Daten ab.

Hinweise in komplexen Abfragen


In Oracle müssen Sie bei komplexen Abfragen regelmäßig mit Hinweisen helfen, da plötzlich vollständige Scans auftreten. Es gibt Hinweise in Postgres Pro, ziemlich launisch, aber Sie können sie bekommen. In regulärem PostgreSQL gibt es jedoch keine Hinweise, und es ist unwahrscheinlich, dass sie angezeigt werden. Wenn Sie integrierte Hinweise haben, fügen Benutzer, die mit einem Optimierungsproblem konfrontiert sind, Hinweise ein, beruhigen sich und melden kein Problem. Die Entwicklung des Optimierers wird gestoppt.

Der PostgreSQL-Optimierer hat übrigens ein Problem. Wenn er eine Stichprobe aus einer Tabelle schätzt, selbst für einen mehr oder weniger vernünftigen Betrag, vermutet er mit einem Fehler. Dann beginnt es sich zu verbinden, das Ergebnis wird mit etwas anderem verbunden, der Fehler sammelt sich und auf der dritten oder vierten Ebene fehlt PostgreSQL viel.

Es gibt eine solche Einstellung - Join-Kollaps-Grenze. PostgreSQL sortiert JOINs für eine effizientere Verwendung, aber das Standardsortierlimit ist 8. Wenn mehr als 8 JOINs hintereinander vorhanden sind, sortiert das System sie nicht und es besteht eine Abhängigkeit von der JOIN-Reihenfolge in der Abfrage.

Es gibt auch einen genetischen Optimierer mit verschiedenen Parametern. Sie können verschiedene Einstellungen in einer Sitzung aktivieren und mehr oder weniger beschreiben, wie die Anforderung ausgeführt werden soll. In dieser Reihenfolge können Sie mithilfe von Klammern das Herunterfahren einiger Vorgänge festlegen, den gleichen Sekunden-Scan. Eine andere Möglichkeit besteht darin, bestimmte Parameter in Funktionen einzufügen. In gewissem Sinne sind dies auch Hinweise. Nicht sehr praktisch, aber zumindest etwas.

Source: https://habr.com/ru/post/de416187/


All Articles