Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle 12c - chỉ mục trên cột 'số' có hoạt động nhanh hơn chỉ mục trên cột 'varchar' không?

[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ữ yearquarter 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ột NUMBER 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ột CHAR 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 quarterDATE thì bạn chỉ cần sử dụng ADD_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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. talend etl oracle error chèn hàng

  2. Sự cố JOIN:Sửa câu lệnh SQL để giải quyết:ORA-01799:một cột có thể không được nối bên ngoài với một truy vấn con

  3. Biểu thức chữ hoa chữ thường không hoạt động bình thường trong truy vấn sql

  4. Cơ sở dữ liệu khung thực thể-Đầu tiên với Cơ sở dữ liệu Oracle

  5. RMAN Liệt kê các lệnh sao lưu