2009-12-23 37 views
5

Tôi cần đặt trường Varchar (255) làm khóa chính của bảng cơ sở dữ liệu trong Firebird 2.1.Kích thước tối đa của khóa chính trong Firebird là bao nhiêu?

Tôi nhận được thông báo lỗi cho biết rằng kích thước trường quá lớn. Tôi đang sử dụng UTF8 làm bộ ký tự và kích thước trang mặc định là 4096.

Có thể thực hiện việc này trong Firebird không? Tôi cần đảm bảo rằng cột này là duy nhất.

+0

khi bạn thực hiện gstat: Độ sâu của chỉ mục trên khóa chính của bạn là bao nhiêu? –

+0

Tôi không chắc chắn ý của bạn là gì về "chiều sâu của chỉ mục". Tôi đã không sử dụng gstat trước đây. – dthrasher

+0

Có thể [chủ đề này] (http://tech.groups.yahoo.com/group/firebird-support/message/98562) có thể giúp bạn hiểu được một sự trở lại của gstat. Bạn nên đọc các bài báo của Ann Harrison ở [trang IBPhoenix] (http://www.ibphoenix.com/resources/documents/design) để hiểu cách lập chỉ mục chỉ mục trong Firebird (: – EMBarbosa

Trả lời

8

Như đã giải thích kích thước chính tối đa là 1/4 kích thước trang, nhưng từ Firebird Reference Update (here), chiều dài chuỗi indexable tối đa theo byte nhỏ hơn chiều dài khóa tối đa 9. Và UTF8 trong Firebird được lưu trữ nội bộ dưới dạng 4 Bytes/char.

Do đó độ dài tối đa cho UTF8 trong cơ sở dữ liệu có kích thước trang 4096 là 253 ký tự (4096/4 -9 = 1024 -9 = 1015 giới hạn đến 253 * 4 = 1012). Vì vậy, nếu bạn muốn có một chuỗi lớn hơn, bạn cần một cơ sở dữ liệu cỡ lớn hơn (ngay cả khi bạn đang sử dụng Firebird 2.5.x).

+0

Ah, điều đó giải thích nó. Tôi không thể tìm ra được tại sao tôi bị thiếu một vài byte! – dthrasher

1

Theo FirebirdFAQ kích thước khóa tối đa trong Firebird 2.x bằng một phần tư kích thước trang. Nếu kích thước trang của bạn là 4096 byte, kích thước khóa tối đa của bạn là 1024 byte.
Biến thể UTF8 dự trữ toàn bộ 32 bit trên mỗi byte mặc dù nó có thể sử dụng ít không gian hơn. Vì vậy, một varchar (255) trong UTF8 là 1020 byte. Tôi không biết tại sao nó đạt đến giới hạn, nhưng dù sao tôi cũng muốn tăng kích thước trang hoặc thử varchar (254).

0

chỉ cần đảm gstat d: \ đường dẫn \ database.fdb

bạn sẽ nhận được someting như thế này cho chỉ số của bạn:

> 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 

nếu Depth là hơn 3: bạn sẽ phải tăng trang kích thước. Nó giống như Douglas Tosi nói.

Bạn có thể thấy điều này rất tốt trong các công cụ như IBExpert full edition hoặc trong IBAnalist

Các vấn đề liên quan