Wie groß ist zu groß für eine PostgreSQL-Tabelle?

127

Ich arbeite am Design für ein RoR-Projekt für mein Unternehmen, und unser Entwicklungsteam hat bereits eine Debatte über das Design, insbesondere die Datenbank, geführt.

Wir haben ein Modell namens Message, das beibehalten werden muss. Es ist ein sehr, sehr kleines Modell mit nur drei DB-Spalten außer der ID, aber es wird wahrscheinlich VIELE dieser Modelle geben, wenn wir zur Produktion gehen. Wir sehen uns bis zu 1.000.000 Einfügungen pro Tag an. Die Modelle werden immer nur von zwei Fremdschlüsseln durchsucht, die indiziert werden können. Außerdem müssen die Modelle nie gelöscht werden, aber wir müssen sie auch nicht behalten, wenn sie ungefähr drei Monate alt sind.

Wir fragen uns also, ob die Implementierung dieser Tabelle in Postgres ein erhebliches Leistungsproblem darstellt. Hat jemand Erfahrung mit sehr großen SQL-Datenbanken, um uns zu sagen, ob dies ein Problem sein wird oder nicht? Und wenn ja, mit welcher Alternative sollten wir gehen?

Dylan Karr
quelle
3
Mit einer guten Caching-Ebene und einer kleinen Konfiguration in PG sollte es Ihnen gut gehen. Sie sollten Leistungsprobleme von Fall zu Fall angehen und eine Voroptimierung vermeiden. Partitionierung und Replikation sind jedoch immer großartige Optionen, die Sie nutzen können, wenn Sie auf Engpässe stoßen.
Sam
1
Verwandte Frage hier und hier .
Erwin Brandstetter
5
Wir verarbeiten ungefähr 30 Millionen Nachrichten pro Tag in einer PostgreSQL-Datenbank mit mehr als 5 TB.
Frank Heikens
1
Zu Ihrer Information , ich habe heute zufällig postgresql.org/about gelesen und festgestellt, dass (im Prinzip) die Anzahl der Zeilen in einer Tabelle unbegrenzt ist.
Al Chou

Antworten:

115

Zeilen pro Tabelle sind für sich genommen kein Problem.

Ungefähr 1 Million Zeilen pro Tag für 90 Tage sind also 90 Millionen Zeilen. Ich sehe keinen Grund, warum Postgres damit nicht umgehen kann, ohne alle Details zu wissen, was Sie tun.

Abhängig von Ihrer Datenverteilung können Sie eine Mischung aus Indizes, gefilterten Indizes und Tabellenpartitionierung verwenden, um die Geschwindigkeit zu erhöhen, sobald Sie feststellen, welche Leistungsprobleme Sie möglicherweise haben oder nicht. Ihr Problem wird bei jedem anderen mir bekannten RDMS dasselbe sein. Wenn Sie nur 3 Monate Datenentwurf in einem Prozess benötigen, um die Daten zu entfernen, benötigen Sie keine weiteren. Auf diese Weise haben Sie ein konsistentes Datenvolumen in der Tabelle. Wenn Sie Glück haben, wissen Sie, wie viele Daten vorhanden sein werden, testen Sie sie auf Ihr Volumen und sehen Sie, was Sie erhalten. Das Testen einer Tabelle mit 90 Millionen Zeilen kann so einfach sein wie:

select x,1 as c2,2 as c3
from generate_series(1,90000000) x;

https://wiki.postgresql.org/wiki/FAQ

Limit   Value
Maximum Database Size       Unlimited
Maximum Table Size          32 TB
Maximum Row Size            1.6 TB
Maximum Field Size          1 GB
Maximum Rows per Table      Unlimited
Maximum Columns per Table   250 - 1600 depending on column types
Maximum Indexes per Table   Unlimited
Kuberchaun
quelle
19
Ich bin damit einverstanden, dass 90 Millionen Zeilen für PostgreSQL kein Problem darstellen. Aber es könnte ein Problem für ein ORM mit PostgreSQL sein. (Ein ORM mit irgendwelchen DBMS.)
Mike Sherrill 'Cat Recall'
@ MikeSherrill'Catcall 'Guter Punkt, ich habe mich nur auf "Wie groß ist zu groß für eine PostgreSQL-Tabelle?" Konzentriert.
Kuberchaun
2
@yeyo: Weil ORMs normalerweise viele Abfragen verwenden, um Daten abzurufen, die mit nur einem oder zwei zurückgegeben werden können. Das OP verwendet Ruby on Rails.
Mike Sherrill 'Cat Recall'
39
Dies ist etwas spät, aber ich denke, dass es in vielen Fällen (insbesondere bei Rails / aktiven Datensätzen) üblich ist, das ORM vollständig aus der Gleichung zu entfernen und eine rohe SQL-Zeichenfolge zu schreiben, um sie aus Leistungsgründen abzufragen. Lassen Sie Ihr ORM keine Datenentscheidungen für Sie treffen! Es ist ein Accessoire, das nicht unbedingt erforderlich ist.
Stefan Theard
2
Die in der URL angegebene Info-URL zeigt diese Grenzwerte derzeit nicht an. Weiß jemand, wohin sie verschoben wurde?
Geschoren
58

Eine andere Möglichkeit, Ihre Abfragen in einer Tabelle mit> 100 Millionen Zeilen erheblich zu beschleunigen, besteht darin, die Tabelle im Index, die am häufigsten in Ihren Abfragen verwendet wird, außerhalb der Geschäftszeiten zu gruppieren. Wir haben eine Tabelle mit> 218 Millionen Zeilen und haben 30-fache Verbesserungen festgestellt.

Für eine sehr große Tabelle ist es außerdem eine gute Idee, einen Index für Ihre Fremdschlüssel zu erstellen.

James Doherty
quelle
> In der Gruppe außerhalb der Geschäftszeiten die Tabelle im Index, die am häufigsten in Ihren Abfragen verwendet wird. Können Sie erklären, wie dies gemacht wird?
Spion
6
Ja, hier ist ein schrittweises Beispiel. 1) Die Tabelle, auf die ich mich beziehe, wird in diesem Beispiel als Investition bezeichnet. 2) Der in Abfragen am häufigsten verwendete Index ist (bankid, record_date). Hier ist Ihr Schritt für Schritt: 1) psql -c "drop index investition_bankid_rec_dt_idx;" Datenbankname 2) psql -c "Index investition_bankid_rec_dt_idx für Investition erstellen (bankid, record_date);" 3) psql -c "Clusterinvestition_bankid_rec_dt_idx bei Investition;" 4) Vakuumdb -d ccbank -z -v -t Investition In Schritt eins und zwei löschen wir den Index und erstellen ihn neu.
James Doherty
3
In Schritt 3 erstellen wir den Cluster. Dadurch wird die DB-Tabelle im Wesentlichen in die physische Reihenfolge des Index versetzt. Wenn postgresql eine Abfrage ausführt, werden die wahrscheinlich nächsten Zeilen zwischengespeichert. Schritt 4 Wir saugen die Datenbank, um die Statistiken für den Abfrageplaner zurückzusetzen
James Doherty