2011-09-06 11 views
13

In riferimento alla Documentazione Postgres su Character Types, non sono chiaro sul punto di specificare una lunghezza per tipi variabili (varchar).Perché specificare una lunghezza per i tipi di caratteri variabili

Assunzione:

  • la lunghezza di corda non importa per l'applicazione.
  • non vi interessa che qualcuno mette che la dimensione massima del database
  • si dispone di spazio illimitato su disco rigido

Lo fa menzione:

L'esigenza di archiviazione per una breve stringa (fino a 126 byte) è 1 byte più la stringa effettiva, che include lo spazio vuoto nella custodia di carattere. Stringhe più lunghe hanno 4 byte di overhead anziché 1. Le stringhe lunghe vengono compresse automaticamente dal sistema, pertanto il requisito fisico su disco potrebbe essere inferiore. I valori molto lunghi sono anche memorizzati nelle tabelle di sfondo in modo che non interferiscano con l'accesso rapido ai valori di colonna più brevi. In ogni caso, la stringa di caratteri più lunga che è possibile memorizzare è di circa 1 GB. (Il valore massimo che sarà consentito per n nella dichiarazione del tipo di dati è inferiore a quella . Non sarebbe utile cambiare questo perché con multibyte codifiche dei caratteri il numero di caratteri e byte può essere molto differente .

questo parla la dimensione di corda, non la dimensione del campo, (cioè suona come sarà sempre comprimere uno stringa di grandi dimensioni in un grande campo varchar, ma non una piccola stringa in un grande campo varchar?)

Chiedo questa domanda come sarebbe molto più facile (e pigro) specificare una dimensione molto più grande quindi non devi mai preoccuparti di avere una stringa troppo l arge. Ad esempio, se si specifica varchar (50) per un nome di luogo, otterrò posizioni che hanno più caratteri (es. Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch), ma se si specifica varchar (100) o varchar (500), sono meno incline a ottenere quel problema .

Quindi si otterrebbe un risultato in termini di prestazioni tra varchar (500) e (arbitrariamente) varchar (5000000) o text() se la stringa più grande era lunga 400 caratteri?

Anche senza interesse se qualcuno ha la risposta a questo E conosce la risposta a questo per altri database, si prega di aggiungere anche questo.

Ho cercato su Google, ma non ho trovato una spiegazione sufficientemente tecnica.

risposta

11

La mia comprensione è che i vincoli sono utili per l'integrità dei dati , pertanto utilizzo le dimensioni delle colonne per convalidare gli elementi di dati nel livello inferiore e per descrivere meglio il modello di dati.

Alcuni link sulla questione:

+8

Uso 'Text' (o' varchar') insieme con vincoli di controllo che limita la lunghezza è un po 'più flessibile rispetto all'utilizzo 'varchar (nn)'. Cambiare il limite di lunghezza è facile come cadere e ricreare il vincolo di controllo, mentre un ALTER TABLE da estendere ad es. varchar (20) in varchar (50) può richiedere molto tempo su un grande tavolo e mette un blocco esclusivo su quel tavolo. –

+0

Ottimi collegamenti ...! –

5

La mia comprensione è che si tratta di un'eredità di database meno recenti con storage non flessibile come quello di Postgres. Alcuni utilizzerebbero strutture a lunghezza fissa per facilitare la ricerca di record particolari e, dal momento che SQL è un linguaggio un po 'standardizzato, quell'eredità è ancora visibile anche quando non fornisce alcun vantaggio pratico.

Quindi, l'approccio "make it big" dovrebbe essere del tutto ragionevole con Postgres, ma potrebbe non essere trasferito bene ad altri sistemi RDBMS meno flessibili.

2

La documentazione spiega questo:

Se i character varying s usato senza identificatore di lunghezza, il tipo accetta stringhe di qualsiasi dimensione. Quest'ultima è un'estensione PostgreSQL.

Lo standard SQL richiede una specifica di lunghezza per tutti i tipi. Questo è probabilmente principalmente per motivi legacy. Tra gli utenti di PostgreSQL, la preferenza tende ad essere quella di omettere la specifica della lunghezza, ma se si desidera scrivere un codice portatile, è necessario includerlo (e scegliere una dimensione arbitraria, in molti casi).

1

più Due pensieri:

  1. Il dottore dice che Postgres 'valori molto lunghi sono memorizzati anche nelle tabelle di fondo'. Pertanto, la definizione di tutte le stringhe come non vincolate probabilmente li spinge in tabelle di sfondo, di sicuro un successo in termini di prestazioni.

  2. Dichiarare tutto come molto lungo interferisce con gli sforzi del DB di prevedere un piano di esecuzione della query, perché ha meno conoscenza dei dati.

  3. Anche la costruzione di un b-tree per contenere un indice sarebbe stata eliminata perché non sarebbe stato in grado di indovinare una strategia di imballaggio ragionevole. Per esempio se il sesso fosse TEXT, come faresti a sapere che è tutto solo M o F?

Problemi correlati