2009-12-23 6 views
5

Devo impostare un campo Varchar (255) come chiave primaria di una tabella di database in Firebird 2.1.Qual è la dimensione massima di una chiave primaria in Firebird?

Ottengo messaggi di errore dicendo che la dimensione del campo è troppo grande. Sto usando UTF8 come set di caratteri e dimensione della pagina predefinita di 4096.

È possibile farlo in Firebird? Devo assicurarmi che questa colonna sia unica.

+0

quando si crea gstat: qual è la profondità del proprio indice sulla chiave primaria? –

+0

Non sono sicuro di cosa intendi per "profondità dell'indice". Non ho usato gstat prima. – dthrasher

+0

Forse [questo thread] (http://tech.groups.yahoo.com/group/firebird-support/message/98562) può aiutarti a capire un po 'di ritorno di gstat. Dovresti leggere i documenti di Ann Harrison nel [sito IBPhoenix] (http://www.ibphoenix.com/resources/documents/design) per capire come gli indici di indice in Firebird (: – EMBarbosa

risposta

8

Come ha spiegato la dimensione massima chiave è 1/4 della dimensione della pagina, ma da Firebird Reference Aggiornamento (here), la lunghezza massima della stringa indicizzabile in byte è 9 in meno della lunghezza massima della chiave. E UTF8 in Firebird è memorizzato internamente come 4 Bytes/char.

Pertanto la lunghezza massima per un UTF8 in un database di 4096 pagine è di 253 caratteri (4096/4 -9 = 1024 -9 = 1015 limitante a 253 * 4 = 1012). Quindi, se si desidera una stringa più grande, è necessario un database di dimensioni pagina più grande (anche se si utilizza Firebird 2.5.x).

+0

Ah, che lo spiega. Non riuscivo a capire perché mi mancavano pochi byte! – dthrasher

1

Secondo FirebirdFAQ la dimensione massima della chiave in Firebird 2.x è un quarto della dimensione della pagina. Se la dimensione della pagina è 4096 byte, la dimensione massima della chiave è 1024 byte.
I varchar UTF8 riservano un massimo di 32 bit per carattere, anche se potrebbe utilizzare meno spazio. Quindi un varchar (255) in UTF8 è 1020 byte. Non so perché sta raggiungendo il limite, ma comunque aumenterei le dimensioni della pagina o proverei varchar (254).

0

solo fare gstat d: \ percorso \ database.fdb

otterrete someting come questo per l'indice:

> Index CLIENT_IDX (2) 
>   Depth: 3, leaf buckets: 545, nodes: 138523 
>   Average data length: 10.12, total dup: 13873, max dup: 645 
>   Fill distribution: 
>    0 - 19% = 0 
>    20 - 39% = 0 
>    40 - 59% = 0 
>    60 - 79% = 0 
>    80 - 99% = 545 

se la profondità è superiore a 3: si dovrà aumentare pagina dimensione. È lo stesso di Douglas Tosi dire.

Si può vedere questo molto bene in strumenti come IBExpert full edition o in IBAnalist

Problemi correlati