2010-06-30 33 views
6

Tôi thấy rằng tôi đang sử dụng rất nhiều truy vấn tham gia, đặc biệt là để có được số liệu thống kê về hoạt động của người dùng từ cơ sở dữ liệu của tôi. Truy vấn như thế này không phải là hiếm:Tham gia truy vấn và khi quá nhiều

from io in db._Owners where io.tenantId == tenantId 
    join i in db._Instances on io.instanceId equals i.instanceId 
    join m in db._Machines on i.machineId equals m.machineId 
    select ... 

Ứng dụng của tôi vẫn không hoạt động, vì vậy tôi không có cách nào đánh giá nếu các truy vấn này sẽ được tính toán cấm trong thực tế cuộc sống. Truy vấn của tôi:

  1. Có giới hạn khi thực hiện quá nhiều lần 'tham gia' quá nhiều và có thể mô tả mà không nhận được số liệu thống kê hoạt động thực tế không?
  2. Lựa chọn thay thế của tôi là gì? Ví dụ: tốt hơn là chỉ cần tạo các bảng bổ sung để giữ số liệu thống kê mà tôi cập nhật khi tôi đi, thay vì kéo các nguồn bảng khác nhau mỗi lần tôi muốn thống kê?
+3

Kết nối ba chiều không có gì bất thường. Các ứng dụng trong thế giới thực có thể lớn hơn rất nhiều, dễ dàng. –

+1

Các câu trả lời bạn đang nhận được tất cả giả định rằng các kết nối này đang được thực hiện bên trong SQL. Điều quan trọng là khi làm việc với LinqToSql rằng bạn xác minh các truy vấn thực tế được gửi để đảm bảo bạn đã không vô tình nâng xử lý cho khách hàng. – hemp

Trả lời

13

Nếu bạn không có thông tin hiệu suất thì không tối ưu hóa.

Tối ưu hóa sớm là gốc rễ của mọi điều ác.

1) Tôi không nghĩ rằng bạn sẽ đạt đến "giới hạn". 2) Điều này được gọi là denomalization, không chuẩn hóa sớm chỉ là lãng phí nỗ lực nếu bạn không biết nếu một vấn đề tồn tại.

Tôi muốn truy vấn của bạn trông khá bình thường.

0

1) Có giới hạn đến khi thực hiện quá nhiều 'tham gia' được quá nhiều

Không, số lượng tham gia không phải là một vấn đề quá nhiều như cấu trúc của dữ liệu trong mỗi bảng, sự hiện diện và sử dụng các chỉ mục và những gì cần phải được thực hiện để lấy dữ liệu.

Dữ liệu được chuẩn hóa thường là mục tiêu chính trong thiết kế DB quan hệ. Bạn thường xem xét việc không chuẩn hóa như một phương tiện tối ưu hóa các truy vấn chỉ khi cần thiết vì nỗ lực bổ sung cần thiết để duy trì tính nhất quán của dữ liệu.

Nếu bạn thực sự quan tâm, hãy đăng mô hình dữ liệu của bạn ERD (bảng cơ sở dữ liệu & cách chúng liên quan) và cơ sở dữ liệu bạn đang sử dụng cho dự án (vì không phải tất cả cơ sở dữ liệu đều giống nhau).

+0

@Ponies: Ngoài sự tò mò, tại sao bạn đánh dấu câu trả lời của mình là wiki? –

+1

@Ken: Để tôi có thể chỉnh sửa nó, tất nhiên! – hemp

+1

Ngựa con thiết lập nó; cây gai dầu lái nó về nhà. –

0

Trừ khi bạn có lưu lượng truy cập và chỉ mục rất cao được đặt chính xác, v.v., bạn không nên gặp sự cố.

Để báo cáo/phân tích, một số địa điểm sẽ tạo ra một số data warehouse ở dạng cơ bản nhất là bản sao không được chuẩn hóa của cơ sở dữ liệu chính của bạn. Họ dễ dàng hơn để báo cáo vì một bảng thường chứa nhiều nhất, nếu không phải tất cả, dữ liệu cần thiết trong báo cáo. Họ cũng có thể đọc nhanh hơn vì bạn không phải tham gia quá nhiều. Tuy nhiên, chúng sẽ yêu cầu không gian đĩa nhiều hơn (dữ liệu trùng lặp). Nếu viết được cho phép, chúng sẽ chậm hơn (phải cập nhật tất cả dữ liệu trùng lặp) và bạn sẽ có vấn đề giữ cho dữ liệu trùng lặp đó nhất quán.

Nói cách khác, trừ khi bạn chỉ thực hiện báo cáo (hoặc truy cập chỉ đọc), hãy giữ các kết nối.

Các vấn đề liên quan