2009-03-22 30 views
8

Tôi thích công cụ ORM, nhưng tôi đã thường nghĩ rằng các bản cập nhật lớn (hàng ngàn hàng), có vẻ như không hiệu quả để tải, cập nhật và lưu khi một cái gì đó giống nhưcập nhật cơ sở dữ liệu khối lượng lớn với một ORM

UPDATE [table] set [column] = [value] WHERE [predicate] 

sẽ cho hiệu suất tốt hơn nhiều.

Tuy nhiên, giả sử bạn muốn đi xuống tuyến đường này vì lý do hiệu suất, sau đó bạn sẽ đảm bảo rằng mọi đối tượng được lưu trong bộ nhớ được cập nhật chính xác.

Giả sử bạn đang sử dụng LINQ to SQL và bạn đã làm việc trên DataContext, làm cách nào để đảm bảo rằng UPDATE hiệu suất cao của bạn được phản ánh trong đồ thị đối tượng của DataContext?

Đây có thể là "bạn không" hoặc "sử dụng trình kích hoạt trên DB để gọi mã .NET làm giảm bộ nhớ cache" v.v., nhưng tôi muốn nghe các giải pháp chung cho loại sự cố này.

+0

không phải là một trong những lý do sử dụng ORM? tức là nó cung cấp các cơ chế để đồng bộ hóa các đối tượng trong bộ nhớ và các đối tượng được lưu trữ được cập nhật? Tất nhiên, cơ chế của tôi là ORM cụ thể –

+0

Có, nhưng quan điểm của tôi là nếu bạn sử dụng công cụ ORM và muốn cải thiện hiệu suất của các bản cập nhật hàng loạt bằng phương pháp SQL trực tiếp, bạn sẽ mất một số lợi ích của ORM. –

Trả lời

4

Bạn nói đúng, trong trường hợp này sử dụng ORM để tải, thay đổi và sau đó lưu giữ các bản ghi không hiệu quả. quá trình tôi đi một cái gì đó như thế này

1) sử dụng thực hiện sớm ORM, trong trường hợp NHibernate của tôi, độc quyền

2) Do sự phát triển trưởng thành xác định các vấn đề hiệu suất, trong đó sẽ bao gồm bản cập nhật lớn

3) Refactor những người ra to SQL hoặc SP cách tiếp cận

4) Sử dụng Refresh (object) lệnh để cập nhật đối tượng được lưu trữ,

vấn đề lớn của tôi đã được thông báo cho các khách hàng khác rằng bản cập nhật đã xảy ra. Trong hầu hết các trường hợp, chúng tôi đã chấp nhận rằng một số khách hàng sẽ cũ, đó là trường hợp sử dụng ORM tiêu chuẩn, và sau đó kiểm tra dấu thời gian khi cập nhật/chèn.

2

ORM là tuyệt vời để phát triển nhanh chóng, nhưng bạn nói đúng - chúng không hiệu quả. Chúng tuyệt vời ở chỗ bạn không cần phải suy nghĩ về các cơ chế cơ bản mà chuyển đổi các đối tượng của bạn trong bộ nhớ thành các hàng trong bảng và ngược lại. Tuy nhiên, nhiều lần ORM không chọn quy trình hiệu quả nhất để làm điều đó. Nếu bạn thực sự quan tâm đến hiệu suất của ứng dụng, tốt nhất bạn nên làm việc với một DBA để giúp bạn thiết kế cơ sở dữ liệu và điều chỉnh các truy vấn của mình một cách thích hợp. (hoặc ít nhất là hiểu các khái niệm cơ bản của SQL mình)

0

ORMs sẽ không hiệu quả như SQL được tạo thủ công. Giai đoạn. Cũng giống như lắp ráp thủ công sẽ nhanh hơn C#. Sự khác biệt hiệu suất có phụ thuộc vào rất nhiều thứ hay không. Trong một số trường hợp, các ORM trừu tượng cao cấp cung cấp cho bạn có thể có giá trị cao hơn hiệu suất cao hơn, trong các trường hợp khác thì không.

Traversing mối quan hệ với mã đối tượng có thể khá tốt đẹp nhưng khi bạn đúng chỉ ra có những vấn đề tiềm năng.

Điều đó đang được nói, cá nhân tôi xem ORMS chủ yếu là một nền kinh tế sai. Tôi sẽ không lặp lại bản thân mình ở đây nhưng chỉ cần trỏ đến Using an ORM or plain SQL?

1

Cập nhật hàng loạt là một thiết kế có vấn đề. Đôi khi chúng có vẻ cần thiết; trong nhiều trường hợp, tuy nhiên, một thiết kế ứng dụng tốt hơn có thể loại bỏ nhu cầu cập nhật hàng loạt.

Thông thường, một số phần khác của ứng dụng đã chạm vào từng đối tượng cùng một lúc; bản cập nhật "hàng loạt" phải được thực hiện ở phần khác của ứng dụng.

Trong các trường hợp khác, bản cập nhật là khúc dạo đầu để xử lý ở nơi khác. Trong trường hợp này, bản cập nhật phải là một phần của quá trình xử lý sau.

Chiến lược thiết kế chung của tôi là ứng dụng tái cấu trúc để loại bỏ cập nhật hàng loạt.

+0

Đôi khi cập nhật hàng loạt không phải là một vấn đề thiết kế, nó là một nhiệm vụ. –

+0

@Candy Chiu: Bạn có nói rằng bạn không đọc câu trả lời không? Hoặc các ví dụ cụ thể trong câu trả lời không đủ rõ ràng? Ý kiến ​​của bạn có ý nghĩa gì? Chỉ cần tạo bản cập nhật hàng loạt vì người khác nói "xây dựng bản cập nhật hàng loạt" không giải quyết được quyết định thiết kế có vấn đề. –

+0

"làm mới dữ liệu trong db với một số giá trị do người dùng xác định". Trong trường hợp này, nếu nhiều hàng được chạm vào, có thể có vấn đề về bình thường hóa. Nhiều hàng có thể đã được trích xuất sang một bảng khác để bản cập nhật một hàng đã thực hiện công việc một cách chính xác. –

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