Vissa människor försöker undvika NULL
värden, att hävda logiken skulle vara förvirrande.
Jag är inte en av dem. NULL
värden är bra för kolumner utan data. De är definitivt det billigaste sättet att lagra "tomma" kolumner - för diskutrymme såväl som prestanda (huvudeffekten är mindre tabeller och index):
- Använder inte NULL i PostgreSQL fortfarande en NULL-bitmapp i rubriken?
- Ökar inställningen "NOT NULL" på en kolumn i postgresql prestanda?
- Optar nullbara kolumner ytterligare utrymme i PostgreSQL?
När du förstår arten av NULL
värderingar finns det ingen anledning att undvika dem. Postgres erbjuder en mängd olika funktioner för att hantera NULLs. colaesce()
, nullif()
, concat()
, concat_ws()
, ...
I allmänhet när det gäller prestanda berörs, en NOT NULL-begränsning slår en KONTROLLERA begränsning och båda slår triggers av ett stockskott. Men även enkla triggers är billiga. Kostnaden för en NOT NULL
begränsning är nästan ingenting. Alla dessa påverkar också bara skrivoperationer, men i de flesta applikationer dominerar läsoperationer.
Den mest relevanta effekten på prestanda (underoptimala index och frågor bortsett från) är därför storleken av tabeller och index eller, ännu viktigare, antalet tuplar per datasida . Större tupler leder till långsammare prestanda för de flesta användningsfall. Antalet datasidor som måste läsas för att tillfredsställa en fråga ökar i enlighet därmed. Tillgängligt cacheminne är mättat tidigare.
Jag har inget benchmark redo, men det är bäst att testa för just din miljö ändå. Detta är bara enkla tumregler. Verkligheten är mycket mer komplex.