[TL; DR] Sử dụng ngày tháng để lưu trữ ngày tháng, số để lưu trữ số và chuỗi để lưu trữ chuỗi.
Oracle lưu trữ NUMBER
kiểu dữ liệu là 1 byte trên 2 chữ số.
Oracle lưu trữ CHAR
kiểu dữ liệu là 1 byte cho mỗi ký tự ASCII (UTF-8 và các cách mã hóa khác có thể mất nhiều hơn đối với các ký tự trong các tập hợp mở rộng) và sẽ đệm bên phải chuỗi bằng các ký tự khoảng trắng để tất cả các chuỗi đều có cùng độ dài.
Oracle lưu trữ VARCHAR2
kiểu dữ liệu là 1 byte cho mỗi ký tự ASCII cộng với chi phí nhỏ (1 hoặc 2 byte) cho độ dài chuỗi.
Oracle lưu trữ DATE
kiểu dữ liệu là 7 byte
(2 cho năm và 1 cho mỗi tháng, ngày, giờ, phút, giây).
Dựa trên câu hỏi trước của bạn
dường như bạn đang lưu trữ year
và quarter
và giả sử rằng bạn luôn có các năm 4 chữ số và các quý 1 chữ số thì:
-
NUMBER(5,0)
sẽ mất 3 byte; -
CHAR(5 CHARACTER)
sẽ mất 5 byte; -
VARCHAR2(5 CHARACTER)
sẽ mất 6 byte; và -
DATE
sẽ mất 7 byte.
Vì vậy, chỉ xem xét bộ nhớ một NUMBER(5,0)
sẽ là hiệu quả nhất.
Tuy nhiên
Ngay sau khi bạn bắt đầu làm số học trên năm / quý được lưu trữ dưới dạng số / chuỗi thì bạn sẽ gặp phải các vấn đề về hiệu suất:
Ví dụ:nhận được quý tiếp theo:
- Nếu
quarter
là mộtNUMBER
kiểu dữ liệu thì bạn có thể sử dụng:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END
nhưng điều này không xử lý được khi bạn muốn cộng 5 phần tư hoặc bắt đầu trừ các phần tư và sau đó logic bắt đầu phức tạp hơn nhiều. - Nếu
quarter
là mộtCHAR
sau đó, bạn có thể chuyển đổi kiểu dữ liệu đó thành một số hoặc một ngày tháng và sử dụng một trong hai phương pháp đó (thao tác chuỗi có vẻ không hiệu quả). - Nếu
quarter
làDATE
thì bạn chỉ cần sử dụngADD_MONTHS( quarter, 3 )
.
DATE
phương thức là tự lập tài liệu và đã tồn tại trong khi NUMBER
phương thức sẽ chỉ trở thành một hàm tùy chỉnh để bạn ước lượng một QUARTER
kiểu dữ liệu và khi bạn triển khai tất cả các chức năng so sánh và thao tác bạn cần, bạn sẽ viết lại DATE
một cách hiệu quả kiểu dữ liệu dưới dạng UDT cho các quý và các chức năng đó sẽ kém hiệu quả hơn so với các chức năng ngày được tối ưu hóa.
Không sử dụng các kiểu dữ liệu không phù hợp - chỉ lưu trữ ngày tháng dưới dạng ngày tháng; số như số; và chuỗi dưới dạng chuỗi.