Nhiều cột so với vài bảng - hiệu suất khôn ngoan


12

Có, tôi biết rằng chuẩn hóa dữ liệu nên là ưu tiên của tôi (vì nó là như vậy).

  1. Tôi đã có một bảng với 65 cột lưu trữ dữ liệu với xe cột: used_vehicle, color, doors, mileage, pricevà vân vân, trong tổng số 65.
  2. Bây giờ, tôi có thể chia đó và có một Vehiclebảng, VehicleInterior, VehicleExterior, VehicleTechnical, VehicleExtra(tất cả one-to-one với chính Vehiclebảng).

Giả sử tôi sẽ có khoảng 5 triệu hàng (xe).

Bật SELECTvới một WHEREmệnh đề: Hiệu suất sẽ được tìm kiếm tốt hơn (cả hai trường hợp được lập chỉ mục ít nhất là trên IDs):

  1. Vehicle bảng có 65 cột hoặc
  2. Vehiclebảng với JOINSbốn bảng khác (tất cả có 5 triệu hàng) để trả về tất cả dữ liệu liên quan đến Vehicle?

(Theo công cụ cơ sở dữ liệu, hãy xem xét PostgreSQL và / hoặc MySQL).

Thực sự đánh giá cao bất kỳ hiểu biết chi tiết bạn có thể có từ kinh nghiệm trước đây của bạn?


1
Một lý do làm điều này (phân vùng dọc) là nếu bạn có thắc mắc mà đối phó với các cột từ VehicleInterior, các truy vấn khác mà đối phó với các cột từ chỉ VehicleTechnical, vv Hoặc nếu có nhiều hàng / xe mà hoàn toàn không có thông tin về (ví dụ) VehicleExtrađể thay vì nhiều hàng có nhiều null trong một bảng, bạn có các hàng trong phần còn lại của bảng và không có hàng nào trongVehicleExtra
ypercubeᵀᴹ

Câu trả lời:


14

Giả sử chúng ta đang nói về mối quan hệ 1: 1 giữa tất cả các bảng.

Lưu trữ tổng thể thực tế luôn rẻ hơn (thực chất) với một bảng thay vì nhiều bảng trong mối quan hệ 1: 1. Mỗi hàng có 28 byte trên không, cộng thêm một vài byte nữa cho phần đệm thêm. Và bạn cần lưu trữ cột PK với mỗi bảng. Và có một chỉ mục (dự phòng) riêng biệt trên mỗi cột này ... Kích thước không quan trọng đối với hiệu suất.

Điều này thậm chí đúng nếu nhiều cột là NULL trong hầu hết các hàng vì lưu trữ NULL rất rẻ :

Trong khi truy xuất tất cả các cột, một bảng duy nhất nhanh hơn đáng kể so với 5 bảng được nối với nhau. Nó cũng đơn giản hơn nhiều . Năm bảng có thể khó tham gia nếu không phải tất cả các hàng đều có trong tất cả các bảng. Với các WHEREđiều kiện nhắm mục tiêu vào một bảng duy nhất, thật dễ dàng để nối thêm các bảng khác LEFT JOIN. Không tầm thường nếu bạn có các vị từ trên nhiều bảng ...

Phân vùng dọc vẫn có thể cải thiện hiệu suất của các truy vấn nhất định. Ví dụ: nếu 90% truy vấn của bạn truy xuất cùng 5 cột trong số 65 cột có sẵn, thì điều này sẽ nhanh hơn với một bảng chỉ giữ 5 cột này.

OTOH, bạn có thể có thể phục vụ cho các truy vấn như vậy trên một vài cột được chọn với chỉ mục "bao phủ" cho phép quét chỉ mục .

Một ứng cử viên khác cho phân vùng dọc: Nếu bạn có nhiều cập nhật chỉ trên một vài cột, trong khi phần còn lại hầu như không thay đổi. Có thể rẻ hơn đáng kể để phân chia các hàng trong trường hợp như vậy, vì Postgres viết một phiên bản hàng mới cho mỗi bản cập nhật. Có các trường hợp ngoại lệ cho các giá trị lớn được lưu trữ ngoài luồng ("TOASTed"). Thêm chi tiết:

Nó thực sự phụ thuộc vào tình hình hoàn chỉnh. Nếu nghi ngờ, hãy đi với giải pháp đơn giản là có một bảng duy nhất, đặc biệt nếu nó mô tả đúng thực tế: Trong ví dụ của bạn, đó là tất cả các thuộc tính của một chiếc xe hơi và có ý nghĩa với nhau.


cập nhật sẽ hiếm khi không có và lựa chọn sẽ chủ yếu cho tất cả các cột (trang chi tiết xe) và thông tin chính (vài cột) cho danh sách kết quả tìm kiếm và trên thực tế có thể giải pháp tốt nhất sẽ là hai bảng: một bảng có thông tin chính (vài cột ) và bảng khác với phần còn lại của các cột. Vì vậy, trong trường hợp này, những gì bạn tham gia vào sql tham gia với cho phép 5 triệu hàng - hiệu suất khôn ngoan? Cảm ơn BTW vì nỗ lực chi tiết của bạn
Urim Kurtishi

1
@octavius: Một bảng duy nhất có chỉ mục nhiều màu trên một vài cột để cho phép quét chỉ mục cho danh sách kết quả có thể là tuyến tốt nhất. (Xin lưu ý rằng chuỗi cột có vấn đề trong các chỉ mục btree .) Tham gia không quá đắt, nhưng nó vẫn sẽ nhanh hơn nếu không tham gia. Kích thước lưu trữ được thêm vào và phân bổ dữ liệu cho nhiều bảng có thể chậm hơn lớn hơn (nhiều trang dữ liệu hơn để đọc cho mỗi truy vấn).
Erwin Brandstetter

1
Tôi đồng ý với nhận xét của Erwins rằng câu trả lời sẽ thực sự phụ thuộc vào tình huống hoàn chỉnh hoặc việc sử dụng trong thế giới thực. Nếu bạn thấy rằng 90% các truy vấn nằm trong một tập hợp con nhỏ của dữ liệu và hiệu suất là hoàn toàn tối quan trọng thì có thể có trường hợp để biện minh cho nỗ lực bổ sung được chia thành nhiều bảng. Cá nhân tôi sẽ cố gắng giữ cho mô hình dữ liệu đơn giản. Ngoài ra, nhanh như thế nào là đủ nhanh? Bạn có bao nhiêu nỗ lực để tiết kiệm mili giây cuối cùng đó? Bạn đã thử chế nhạo bất kỳ dữ liệu nào và thực hiện bất kỳ thử nghiệm nào chưa?
Ngài Swears-a-lot

@ErwinBrandstetter bạn đã đề cập trong câu trả lời của mình rằng mối quan hệ là 1: 1. Còn tàu quan hệ 1: N thì sao?
Slim

Đối với mối quan hệ 1: N, bạn vẫn cần hai bảng riêng biệt. Ngoại trừ nếu bạn nhồi nhét nhiều hàng vào một mảng hoặc loại tài liệu. Sau đó, nó phụ thuộc. Các nguyên tắc được nêu ở đây áp dụng bất kể. Các mẫu truy cập và chiến lược chỉ mục của bạn có thể tạo ra sự khác biệt. Đặt một câu hỏi mới nếu bạn muốn được cụ thể hơn.
Erwin Brandstetter

0

Một lựa chọn trên một bảng duy nhất sẽ luôn luôn nhanh hơn. Ngay sau khi bạn đã tìm thấy chiếc xe của bạn, bạn đã có tất cả các chi tiết.

Tuy nhiên, bạn mất hiệu quả của bình thường hóa. Ví dụ: nếu 1 xe có nhiều mẫu với các tùy chọn khác nhau.

Đây có phải là một db tham khảo của tất cả các xe? Hoặc một danh sách các xe cũ? Sẽ có nhiều ví dụ về cùng một kiểu / mô hình với cùng các tùy chọn?

Chỉnh sửa: tôi nên đủ điều kiện câu trả lời của mình là rdbms chung chứ không phải là postgres cụ thể. Tôi trì hoãn câu trả lời chi tiết của @ Erwin cụ thể cho postgres


2
"Một lựa chọn trên một bảng duy nhất sẽ luôn luôn nhanh hơn." Tại sao?
ypercubeᵀᴹ

Dramiclemake và scriptsiclemodel là các bảng khác nhau, vì vậy bảng xe có các khóa ngoại của violiclemake và violiclemodel. Tôi không nghĩ bình thường hóa là một vấn đề ở đây. Tôi hiểu rằng chọn trên một bảng sẽ nhanh hơn, tuy nhiên chúng ta có một tình huống khác, hàng có nhiều cột sẽ ảnh hưởng đến hiệu suất như thế nào so với các bảng có ít cột hơn (nhưng ít bảng - 5 trong số chúng có liên kết)
Urim Kurtishi

Xin lỗi tôi đã bỏ lỡ điểm mà mô hình và mô hình đã được tách ra. Phiên bản ngắn là tham gia nỗ lực cho công cụ cơ sở dữ liệu. Nếu bạn sử dụng một bảng / hàng duy nhất, bạn sẽ nhận được mọi thứ trong một lựa chọn duy nhất, điều này sẽ dẫn đến ít I / O và chi phí cho công cụ db.
Ngài Swears-a-lot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.