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

Độ dài cột ưu tiên của Oracle

Không có sự khác biệt về hiệu suất. Và không có tối ưu hóa ẩn nào được thực hiện nhờ sức mạnh của 2.

Điều duy nhất tạo ra sự khác biệt trong cách mọi thứ được lưu trữ là thực tế dữ liệu. 100 ký tự được lưu trữ trong VARCHAR2(2000) cột được lưu trữ giống hệt như 100 ký tự được lưu trữ trong VARCHAR2(500) cột.

Hãy coi độ dài như một hạn chế kinh doanh , không phải là một phần của kiểu dữ liệu. Điều duy nhất thúc đẩy quyết định của bạn về độ dài là các ràng buộc nghiệp vụ về dữ liệu được đưa vào đó.

Chỉnh sửa :tình huống duy nhất mà độ dài không tạo ra sự khác biệt, là khi bạn cần một chỉ mục trên cột đó. Các phiên bản Oracle cũ hơn (<10) đã có giới hạn về độ dài khóa và điều đó đã được kiểm tra khi tạo chỉ mục.

Mặc dù có thể có trong Oracle 11, nhưng có thể không phải là lựa chọn khôn ngoan nhất để có một chỉ mục trên một giá trị có 4000 ký tự.

Chỉnh sửa 2 :

Vì vậy, tôi tò mò và thiết lập một thử nghiệm đơn giản:

create table narrow (id varchar(40));
create table wide (id varchar(4000));

Sau đó, điền vào cả hai bảng bằng các chuỗi gồm 40 'X'. Nếu thực sự có sự khác biệt (đáng kể) giữa bộ nhớ, điều này sẽ hiển thị bằng cách nào đó khi truy xuất dữ liệu, phải không?

Cả hai bảng đều có chính xác 1048576 hàng.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set autotrace traceonly statistics
SQL> select count(*) from wide;


Statistics
----------------------------------------------------------
          0  recursive calls
          1  db block gets
       6833  consistent gets
          0  physical reads
          0  redo size
        349  bytes sent via SQL*Net to client
        472  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(*) from narrow;


Statistics
----------------------------------------------------------
          0  recursive calls
          1  db block gets
       6833  consistent gets
          0  physical reads
          0  redo size
        349  bytes sent via SQL*Net to client
        472  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

Vì vậy, quá trình quét toàn bộ bảng cho cả hai bảng đã thực hiện chính xác như nhau. Vậy điều gì sẽ xảy ra khi chúng ta thực sự chọn dữ liệu?

SQL> select * from wide;

1048576 rows selected.


Statistics
----------------------------------------------------------
          4  recursive calls
          2  db block gets
      76497  consistent gets
          0  physical reads
          0  redo size
   54386472  bytes sent via SQL*Net to client
     769427  bytes received via SQL*Net from client
      69907  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    1048576  rows processed

SQL> select * from narrow;

1048576 rows selected.


Statistics
----------------------------------------------------------
          4  recursive calls
          2  db block gets
      76485  consistent gets
          0  physical reads
          0  redo size
   54386472  bytes sent via SQL*Net to client
     769427  bytes received via SQL*Net from client
      69907  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    1048576  rows processed

SQL>

Có một chút khác biệt trong số lần nhận được nhất quán, nhưng đó có thể là do bộ nhớ đệm.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giải quyết không thể thực hiện thao tác DML bên trong truy vấn

  2. Chỉ mục thời gian không đổi cho cột chuỗi trên cơ sở dữ liệu Oracle

  3. Không thể chèn dữ liệu Varchar2 bằng quy trình được lưu trữ với loại Bảng là tham số IN

  4. Cách tốt nhất để biên dịch trước JSP bằng Ant là gì

  5. ORA-06502:PL / SQL:lỗi số hoặc giá trị:bộ đệm chuỗi ký tự ngoại lệ quá nhỏ từ mã C #