Ich habe bereits einige Millionen Zeilen in meiner Datenbank. Ich wusste nichts über den PostgreSQL-UUID-Datentyp, als ich mein Schema entwarf.
Eine der Tabellen verfügt über 16 Millionen Zeilen (ca. 3,5 bis 4 Millionen Datensätze pro Shard) und wächst mit ca. 500.000 Datensätzen pro Tag. Ich habe immer noch den Luxus, das Produktionssystem bei Bedarf für ein paar Stunden herunterzufahren. Ich werde diesen Luxus in ein oder zwei Wochen nicht haben.
Meine Frage ist, lohnt sich das? Ich wundere mich über die JOIN-Leistung, die Speicherplatznutzung (vollständiger gzip-Dump ist 1,25 GiB) und solche Dinge.
Das Tabellenschema ist:
# \d twitter_interactions
Table "public.twitter_interactions"
Column | Type | Modifiers
-------------------------+-----------------------------+-----------
interaction_id | character(36) | not null
status_text | character varying(1024) | not null
screen_name | character varying(40) | not null
twitter_user_id | bigint |
replying_to_screen_name | character varying(40) |
source | character varying(240) | not null
tweet_id | bigint | not null
created_at | timestamp without time zone | not null
Indexes:
"twitter_interactions_pkey" PRIMARY KEY, btree (interaction_id)
"twitter_interactions_tweet_id_key" UNIQUE, btree (tweet_id)
"index_twitter_interactions_on_created_at" btree (created_at)
"index_twitter_interactions_on_screen_name" btree (screen_name)
Triggers:
insert_twitter_interactions_trigger BEFORE INSERT ON twitter_interactions FOR EACH ROW EXECUTE PROCEDURE twitter_interactions_insert_trigger()
Number of child tables: 9 (Use \d+ to list them.)
quelle
Ich bin kein Postgres-Mensch, aber basierend auf dem, was ich von SQL Server kenne, ist die Leistung, die Sie haben werden, umso besser, je mehr Zeilen Sie auf eine Datenseite passen (das Lesen von Daten von der Festplatte ist in der Regel) die teuerste Operation). Der Wechsel von einem 36 ish 1 Byte breiten Feld zu einer 16 Byte großen GUID scheint also eine einfache Kostenersparnis zu sein. Je weniger Lesevorgänge Sie durchführen können, desto schneller können Sie Ergebnisse zurückgeben. All dies setzt natürlich voraus, dass eine GUID / UUID die Geschäftsanforderungen der Tabelle erfüllt. Wenn eine UUID diese erfüllt, würde a Bigint ? Das würde Ihre Speicherkosten um weitere 8 Byte pro Zeile senken.
Bearbeiten 1
Für Zeichendaten in Postgres fallen zusätzliche Speicherkosten an. Kurze Zeichenfolgen mit weniger als 127 Bytes haben einen 1-Byte-Overhead, während längere 4 Bytes haben, so dass der zweite Befragte 40-Byte-Kosten für ein 36-Byte-Feld errechnet hat. Es gibt jedoch auch eine Option für die String-Komprimierung, sodass möglicherweise nicht die vollen 40 ausgegeben werden. Ich kann die endgültigen Kosten nicht abschätzen, aber die Grundlagen bleiben erhalten: Alles über 16 Byte erhöht die Speicherkosten. Das Lesen dauert länger und verbrauchen mehr Speicher.
quelle
Beachten Sie neben dem Platzproblem, dass Sie jede Tabelle ändern müssen, um den richtigen Datentyp zu verwenden. Andernfalls wird die Join-Leistung schlecht.
quelle
Neben der Einsparung von Daten und Indizes (wie von anderen gesagt), die sich in Einsparungen bei den E / A-Vorgängen niederschlägt, müssen Sie berücksichtigen, wie Sie neue Werte generieren
interaction_id
und welche Auswirkungen dies auf das System haben wird Indizes und Abfragebedingungen (Joins).Für den Index ist er kleiner. Wenn jedoch viele Ihrer Abfragen Index-Scans verwenden, kann das Umschalten auf UUIDs Index-Scans unmöglich machen (abhängig davon, wie Sie UUIDs generieren) und ist
bigint
möglicherweise die bessere Wahl.Schließlich hängt die tatsächliche Auswirkung auf die Leistung auch von Ihren Nutzungsmustern ab und der Datenverteilung , sollten Sie Tests durchführen und über eine Entwicklungs- und Testumgebung verfügen, in der Sie Ihre Änderungen testen können.
Auf diese Weise erhalten Sie eine genauere Antwort auf die Auswirkungen auf die Leistung.
quelle