2009-12-10 39 views
20

Các hiệu ứng của việc xác định cột với VARCHAR2(1000) thay vì VARCHAR2(10) trong Oracle, khi các giá trị không dài hơn 10 Byte là bao nhiêu?Tác động của việc xác định cột VARCHAR2 có độ dài lớn hơn

Cột có chỉ chiếm không gian thực sự cần thiết để lưu trữ các giá trị hoặc có bất kỳ tác động tiêu cực nào đến kích thước/hiệu suất của không gian bảng/chỉ mục không?

Trả lời

17

Câu trả lời tùy thuộc vào việc bạn đang nói về một cột trong bảng cơ sở dữ liệu hay biến trong chương trình PL/SQL.

cột Cơ sở dữ liệu

Dung lượng bộ nhớ sử dụng là tương ứng với kích thước của dữ liệu được lưu trữ.

PL/SQL biến

Nếu biến được khai báo với kích thước 1-3999 (11g +)/1999 (10g hoặc sớm hơn), bộ nhớ sẽ được phân bổ cho độ dài tối đa (tức là VARCHAR2 (100) sẽ yêu cầu ít nhất 100 byte bộ nhớ).

Nếu biến được khai báo với kích thước 4000 (11g +)/2000 (10g hoặc sớm hơn) hoặc cao hơn, bộ nhớ sẽ được phân bổ theo kích thước của dữ liệu được lưu trữ. (Một câu hỏi phụ thú vị sẽ là, nếu giá trị của biến được thay đổi, như thế nào là bộ nhớ thay đổi kích cỡ - nó tái phân bổ đệm khác với kích thước mới?)

tham chiếu cho 10g: PL/SQL Datatypes

biến VARCHAR2 nhỏ được tối ưu hóa cho hiệu suất, và những cái lớn hơn được tối ưu hóa để sử dụng bộ nhớ hiệu quả. Điểm cắt là 2000 byte. Đối với một VARCHAR2 là 2000 byte hoặc dài hơn, PL/SQL tự động phân bổ chỉ đủ bộ nhớ để giữ giá trị thực tế. Đối với một biến VARCHAR2 ngắn hơn 2000 byte, PL/SQL preallocates chiều dài khai báo đầy đủ của biến. Ví dụ: nếu bạn chỉ định cùng một giá trị 500 byte cho biến VARCHAR2 (2000 BYTE) và biến VARCHAR2 (1999 BYTE), biến trước đó chiếm 500 byte và sau đó chiếm 1999 byte.

+0

Tôi đã nói về bảng-cột, nhưng tham chiếu PL/SQL cũng khá thú vị, cảm ơn! (+1) –

+0

Đúng là lưu ý rằng nó trở nên phù hợp hơn khi bạn bắt đầu viết mã PL/SQL tương tác với dữ liệu bảng - tức là bạn có thể có xu hướng khai báo các biến VARCHAR2 với cùng kích thước như cột cơ sở dữ liệu. Tất nhiên, yếu tố sử dụng bộ nhớ này là xem xét ít quan trọng nhất liên quan đến cột và định cỡ biến. –

+4

Trên vấn đề PL/SQL, điểm ngắt cho vị trí cấp phát bộ nhớ động PL/SQL đã thay đổi từ phiên bản này sang phiên bản khác. Ví dụ, trong 10g nó đã được tăng lên từ đến 2000 nhưng nó lên đến 4000 trong 11.1. Xem http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/tuning.htm#BCGEGEEG –

13

Trong cơ sở dữ liệu, không có sự khác biệt. VARCHAR2 được lưu trữ với độ dài thay đổi, chiều dài khai báo chỉ là giới hạn.

Tuy nhiên, một số ứng dụng khách hàng sẽ dành 1000 byte cho mỗi cột thay vì 10 nếu họ thấy rằng cột được định nghĩa là VARCHAR2(1000)

0

Xác định kích thước cột như độ dài tối đa mà bạn đang chuẩn bị để đối phó với. Đối với một bảng dàn dựng, nơi tôi đang tải một tệp vào cơ sở dữ liệu, tôi có thể sử dụng VARCHAR2 (4000). Sau đó, khi tất cả dữ liệu nằm trong cơ sở dữ liệu, tôi có thể thực hiện bất kỳ xác thực nào (kiểu dữ liệu, độ dài dữ liệu, giá trị tối thiểu/tối đa, ký tự được chấp nhận ...) và có giá trị hợp lệ được chuyển vào cột có định nghĩa phù hợp/ràng buộc.

Tôi có thể tận dụng DML error logging để dữ liệu không phù hợp với định nghĩa/ràng buộc được bơm ra khỏi bảng từ chối mà không cần bất kỳ mã hóa từng hàng phức tạp nào.

Nếu bạn có VARCHAR2 (1000) thì tại thời điểm nào đó, bạn sẽ nhận được dữ liệu được đặt trong đó dài hơn mong đợi (ví dụ: bạn có thể nhận được một chuỗi 10 ký tự nhưng có 14 byte vì một số ký tự Giá trị thiết lập ký tự byte.)

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