2009-12-10 26 views
12

Tôi muốn biết nếu có một đạt được hiệu suất thực sự giữa hai lựa chọn:SQL Tham vs Query riêng trong luật mà không tham - Hiệu suất

Lựa chọn 1:

  • tôi làm một truy vấn SQL với một tham gia để chọn tất cả Người dùng và Hạng của họ.

Phương án 2:

  • tôi làm một truy vấn SQL để chọn tất cả tài
  • tôi lấy tất cả người sử dụng và làm một truy vấn SQL để có được hàng ngũ của người dùng này.

Trong mã, tùy chọn hai dễ nhận ra hơn đối với tôi. Đó là chỉ vì cách tôi thiết kế lớp Persistence của mình.

Vì vậy, tôi muốn biết tác động đến hiệu suất là gì. Sau giới hạn nào tôi nên cân nhắc lựa chọn 1 thay vì lựa chọn 2?

Trả lời

12

Nói chung, máy chủ DB luôn tham gia nhanh hơn mã ứng dụng. Hãy nhớ rằng bạn sẽ phải thực hiện thêm truy vấn với một chuyến đi vòng quanh mạng cho mỗi lần tham gia. Tuy nhiên, nếu tập hợp kết quả đầu tiên của bạn nhỏ và chỉ mục của bạn được điều chỉnh tốt, mô hình này có thể hoạt động tốt.

Nếu bạn chỉ làm việc này để tái sử dụng giải pháp ORM của mình, thì bạn có thể đang chiến đấu trong trận thua. Tôi luôn thấy rằng tôi cần các tập dữ liệu chỉ đọc mà chỉ có thể được tạo bằng SQL, vì vậy bây giờ tôi sử dụng ORM cho các hoạt động CRUD cho từng đối tượng và SQL thông thường cho các tìm kiếm, báo cáo, tập hợp, v.v.

+0

Ý của bạn là gì? Bởi sự tò mò, bạn đang sử dụng ORM nào? – Melursus

+0

Chuyến đi khứ hồi nghĩa là đi từ ứng dụng đến máy chủ cơ sở dữ liệu và ngược lại. Khi bạn tham gia vào ứng dụng, bạn đang chạy các truy vấn phụ trong một vòng lặp, nghĩa là bạn chạy N truy vấn/vòng tròn phụ, quy mô rất kém –

+0

Chính xác. Nếu truy vấn đầu tiên của bạn luôn có số hàng tối đa (ví dụ: Super Model Chess Champions) và bảng con nhanh và nhỏ (như tên của con cái họ) thì việc tham gia vào ứng dụng không lớn kết quả. Nếu sự gia nhập lớn hoặc liên tục phát triển (tất cả các khách hàng của bạn và đơn đặt hàng của họ) điều này có thể xấu xí trong sản xuất sau khi bạn đã chuyển sang những thứ khác. –

0

Tùy thuộc vào số lượng người dùng bạn dự đoán. Tùy chọn một chắc chắn sẽ nhanh hơn, nhưng với một lượng dữ liệu hợp lý, sự khác biệt sẽ không đáng kể.

+0

Mọi chuyến đi khứ hồi đều đau, ngay cả khi chỉ có 10 hoặc 20 người dùng, bạn đang thực hiện nhiều công việc hơn cần thiết –

1

Nếu xếp hạng là giá trị tĩnh, hãy cân nhắc lưu vào bộ nhớ cache trong ứng dụng của bạn.

Nếu bạn cần người dùng thường xuyên và chỉ xếp hạng hiếm khi, hãy xem xét việc tải xếp hạng chậm. (ví dụ: các truy vấn riêng biệt, nhưng truy vấn thứ hai chỉ thỉnh thoảng được sử dụng).

Sử dụng tham gia nếu bạn luôn cần cả hai bộ dữ liệu và chúng phải là bản sao hiện tại của cơ sở dữ liệu.

Thử nghiệm mọi lựa chọn có khả năng và chạy thử nghiệm hiệu suất.

EDIT: Suy nghĩ thêm về lớp kiên trì của bạn, bởi vì tôi đang đối mặt với vấn đề này. Xem xét thêm các lớp "persistence-like" xử lý các phép nối như truy vấn cơ bản của chúng và là chỉ đọc. Cho dù điều này phù hợp với kịch bản cụ thể của bạn là để bạn có thể quyết định, nhưng rất nhiều truy cập cơ sở dữ liệu cho nhiều ứng dụng dựa trên các phép nối, có thể khá lớn và phức tạp. Nếu bạn có thể xử lý chúng một cách nhất quán với các đối tượng liên tục, cập nhật của bạn, nó có thể là một chiến thắng lớn cho kiến ​​trúc tổng thể của bạn. Về mặt khái niệm, nó giống như có một khung nhìn trong cơ sở dữ liệu và truy vấn khung nhìn thay vì viết một phép nối, nhưng bạn đang làm tất cả trong mã.

+0

Bạn có một số ví dụ hoặc liên kết về các lớp "Giống như Persitence" không? – Melursus

+0

Tôi không thể đăng bài trực tuyến vì chúng chưa được viết! Tôi đã viết các lớp thực thể, hoạt động giống như các thực thể LINQ to SQL, nhưng được điền bằng mã ADO.NET "cổ điển". Tôi cũng có các lớp Active Record đóng gói các truy vấn cấp bảng và mã truy cập dữ liệu, và tạo ra các câu lệnh INSERT và UPDATE. Các lớp Active Record cư trú các thực thể từ DataSets. Các lớp thực thể chứa siêu dữ liệu để hỗ trợ chức năng ActiveRecord. Chúng tôi sẽ sử dụng trình tạo mã để tạo các mã này trong tương lai. Cấu trúc tương tự sẽ hoạt động đối với các truy vấn phức tạp. Ước gì tôi có thể sử dụng LINQ, nhưng tôi không thể. –

0

Trong 99% trường hợp tham gia sẽ nhanh hơn.

Tuy nhiên, có một tình huống hiếm khi xảy ra chậm hơn. Nếu bạn đang làm một đến nhiều tham gia vào bảng với kích thước hàng lớn và bạn đang đạt giới hạn băng thông mạng.

Ví dụ: có một cột blob có kích thước T1 là 1MB, bạn đang tham gia T2 bao gồm 100 hàng cho mỗi hàng T1. Tập kết quả sẽ là hàng đếm T1 nhiều 100.

Vì vậy, nếu bạn đang truy vấn một hàng T1 có tham gia, nó sẽ là 100MB kết quả, nếu bạn lấy hàng T1 (1MB) và sau đó chọn riêng để tìm nạp 100 T2 T1 này tập kết quả sẽ là 1MB.

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