Ich weiß, das ist eine gute Idee in MySQL. Wenn ich mich richtig erinnere, erlaubt es in MySQL Indizes, effizienter zu arbeiten.Erhöht die Einstellung "NOT NULL" für eine Spalte in postgresql die Leistung?
Antwort
Es ist immer eine gute ideal, um Spalten davon abzuhalten, NULL zu sein, wenn Sie es vermeiden können, weil die Semantik der Verwendung so unordentlich ist; siehe What is the deal with NULLs? für eine gute Diskussion darüber, wie diese Sie in Schwierigkeiten bringen können.
In Versionen von PostgreSQL bis zu 8.2 wusste die Software nicht, wie Vergleiche auf dem häufigsten Typenindex (der B-Struktur) in einer Weise durchgeführt werden, die NULL-Werte darin enthalten würde. In dem relevanten Bit von documentation on index types, können Sie sehen, dass wie beschrieben "aber beachten Sie, dass IS NULL = nicht äquivalent und nicht indexierbar ist". Der effektive Nachteil besteht darin, dass der Planer, wenn Sie eine Abfrage angeben, die NULL-Werte enthalten muss, diese unter Verwendung des offensichtlichen Index für diesen Fall möglicherweise nicht erfüllen kann. Als einfaches Beispiel, wenn Sie eine ORDER BY-Anweisung haben, die mit einem Index beschleunigt werden könnte, aber Ihre Abfrage auch NULL-Werte zurückgeben muss, kann der Optimierer diesen Index nicht verwenden, da das Ergebnis keine NULL-Daten enthält - und daher unvollständig und nutzlos sein. Der Optimierer weiß dies und führt stattdessen einen nicht indizierten Scan der Tabelle durch, der sehr teuer sein kann.
PostgreSQL improved this in 8.3, "eine IS NULL-Bedingung für eine Indexspalte kann mit einem B-Tree-Index verwendet werden". Die Situationen, in denen Sie gebrannt werden können, indem Sie versuchen, etwas mit NULL-Werten zu indizieren, wurden reduziert. Da die NULL-Semantik jedoch immer noch sehr schmerzhaft ist und Sie möglicherweise in eine Situation geraten, in der selbst der 8.3-Planer nicht das tut, was Sie von ihm erwarten, sollten Sie nach Möglichkeit NOT NULL verwenden, um Ihre Chancen auf eine schlecht optimierte Abfrage zu verringern .
Nein, solange Sie NULLs nicht in der Tabelle speichern, sehen die Indizes genau gleich aus (und ebenso effizient).
Einstellen der Spalte NOT NULL, obwohl viele andere Vorteile hat, so sollten Sie immer gesetzt es, dass, wenn Sie nicht vorhaben, NULLs darin zu speichern :-)
Einstellung NOT NULL
hat per se keine Auswirkung auf die Leistung. Ein paar Zyklen für die Prüfung - irrelevant.
Sie können jedoch die Leistung verbessern, indem Sie NULL anstelle von Dummy-Werten verwenden. Abhängig von den Datentypen können Sie eine Menge Speicherplatz und RAM sparen und dadurch beschleunigen .. alles.
Die Null-Bitmap wird nur zugewiesen, wenn NULL-Werte in der Zeile vorhanden sind. Es ist ein Bit für jede Spalte in der Zeile (NULL oder nicht). Bei Tabellen mit bis zu 8 Spalten ist die Null-Bitmap praktisch vollständig frei, wobei ein Ersatzbyte zwischen Tupel-Header und Zeilendaten verwendet wird. Danach wird der Speicherplatz in Vielfachen von (typischerweise 8 Bytes, die 64 Spalten abdecken) zugeordnet. Der Unterschied ist zum Padding verloren. Sie bezahlen also den vollen (niedrigen!) Preis für den ersten Nullwert in jeder Zeile. Zusätzliche NULL-Werte können nur Speicherplatz sparen.
Die Mindestanforderung für jede Speicher Nicht-Null-Wert ist 1 Byte (boolean
, "char"
, ...) oder in der Regel viel mehr, plus (möglicherweise) Polsterung für die Ausrichtung. Lesen Sie data types oder überprüfen Sie die Details in der Systemtabelle pg_type
.
Mehr über null Lagerung:
Was meinen Sie mit "ein paar Zyklen für den Scheck"? – ma11hew28
@MattDiPasquale: Postgres muss die Einschränkung erzwingen und eine Ausnahme auslösen, wenn sie nicht erfüllt wird. Da das Testen auf NULL so einfach ist, sind die Kosten vernachlässigbar. –
großen Kommentar ... Ich wusste nicht, dass die Beziehung zwischen nicht null und Indizes. Danke Typ! –