Câu trả lời là có, nó quan trọng, và nó có thể quan trọng rất nhiều, nhưng thường là không nhiều.
Tất cả I/O được thực hiện ở cấp trang (thường là 2K hoặc 4K tùy thuộc vào hệ điều hành của bạn). Dữ liệu cột cho các hàng được lưu trữ bên cạnh nhau, trừ khi trang đầy, trong trường hợp dữ liệu được ghi trên trang khác (thường là trang tiếp theo).
Không gian dữ liệu trên đĩa lớn hơn cần thiết cho các cột giữa (dựa trên định nghĩa bảng) các cột bạn chọn, càng có nhiều khả năng dữ liệu cho các cột được chọn sẽ (đôi khi) trên các trang khác nhau. Đang ở trên một trang khác có thể dẫn đến hoạt động bổ sung I/O (nếu không có hàng nào khác được chọn trên trang khác). Trong trường hợp xấu nhất, mỗi cột bạn chọn có thể nằm trên một trang khác.
Dưới đây là một ví dụ:
create table bad_layout (
num1 int,
large1 varchar(4000),
num2 int,
large2 varchar(4000),
num3 int,
large3 varchar(4000)
);
create table better_layout (
num1 int,
num2 int,
num3 int,
large1 varchar(4000),
large2 varchar(4000),
large3 varchar(4000)
);
So sánh: chọn num1, num2, num3 từ bad_layout; chọn num1, num2, num3 từ better_layout;
Bởi vì đối với bad_layout, mỗi cột num về cơ bản sẽ nằm trên một trang khác, mỗi hàng sẽ yêu cầu 3 hoạt động i/O. Ngược lại, đối với các cột num số_lượng tốt hơn thường xuất hiện trên cùng một trang.
Truy vấn bad_layout có thể mất khoảng 3 lần để thực thi.
Bố cục bảng tốt có thể tạo sự khác biệt lớn về hiệu suất truy vấn. Bạn nên cố gắng giữ cho các cột thường được chọn gần nhau nhất có thể với nhau trong bố cục bảng.
Điều đó có ý nghĩa; có ai quan tâm để kiểm tra nó không? Tôi không có một cài đặt PostgreSQL tiện dụng. –
Sẽ không [TOAST] (http://www.postgresql.org/docs/9.4/static/storage-toast.html) phần lớn ngăn các giá trị cột lớn gây ra loại sự cố này? Ngoài ra, tài liệu đó (nếu tôi đọc nó một cách chính xác) tuyên bố rõ ràng rằng một tuple hàng không được phép span nhiều trang. – jpmc26