2012-03-28 23 views
5

Chúng tôi có một hệ thống nơi khách hàng được phân bổ sản phẩm trên cơ sở ai đến trước được phục vụ trước.Giải pháp tối ưu cho số lượng lớn yêu cầu trên một bảng cơ sở dữ liệu

bảng sản phẩm của chúng tôi có chứa một chìa khóa incrementing chính mà bắt đầu từ số không mà chúng tôi sử dụng để theo dõi có bao nhiêu sản phẩm đã được phân bổ tức là một người sử dụng giữ một sản phẩm và được phân bổ 1, người sử dụng tiếp theo được 2 vv

Vấn đề là có khả năng hàng trăm ngàn người dùng sẽ truy cập vào hệ thống trong bất kỳ giờ cụ thể nào. Tất cả những ai sẽ đánh một cái bàn này.

Vì chúng tôi cần đảm bảo rằng mỗi khách hàng chỉ được phân bổ một sản phẩm và theo dõi số lượng sản phẩm đã được phân bổ, chúng tôi sử dụng khóa hàng cho mỗi khách hàng truy cập vào hệ thống để đảm bảo họ ghi vào bảng trước khách hàng tiếp theo truy cập hệ thống - nghĩa là thực thi quy tắc đầu tiên được phân phát trước.

Chúng tôi lo ngại về nút cổ chai là thời gian xử lý của từng yêu cầu đến SQL Server 2008 Enterprise Edition và khóa hàng.

Chúng tôi không thể sử dụng nhiều máy chủ vì chúng tôi cần đảm bảo tính toàn vẹn của khóa chính để mọi thứ yêu cầu sao chép sẽ không hoạt động.

Có ai biết về bất kỳ giải pháp tốt nào đặc biệt hiệu quả trong việc xử lý một số lượng lớn yêu cầu trên một bảng cơ sở dữ liệu không?

Thông tin thêm một chút: Bảng được đề cập về cơ bản chỉ chứa hai trường - ID và CustomerID. Giải pháp này dành cho một triệu sản phẩm miễn phí - vì thế kỳ vọng nhu cầu cao và lý do tại sao sử dụng khóa chính gia tăng là chìa khóa có ý nghĩa đối với chúng tôi - một khi khóa đạt đến một triệu, không có khách hàng nào có thể đăng ký. Ngoài ra, các sản phẩm đều khác nhau để phân bổ khóa chính xác là quan trọng, ví dụ: 100 khách hàng đầu tiên được nhập nhận sản phẩm có giá trị cao hơn 100 sản phẩm tiếp theo, v.v.

Cảm ơn bạn đã trợ giúp.

+1

Bạn có thể vui lòng gắn thẻ lại, bao gồm [sqlserver] và bạn có thể cho tôi biết phiên bản và ấn bản không, nếu bạn chỉnh sửa câu hỏi của mình và cho chúng tôi biết bạn có 'SQL2008 Enterprise Edition' chẳng hạn chúng tôi có thể cung cấp giải pháp phù hợp Bảng phân vùng có sẵn trong SQL 2008 EE –

+0

Cảm ơn Jeremy. Đã thêm thông tin bổ sung. –

+0

Câu hỏi đầu tiên rõ ràng; bạn đã loại bỏ mọi thứ khác trong giao dịch lấy chìa khóa chưa? Ví dụ. bạn biết trước khi cố gắng lấy chìa khóa mọi thứ bạn cần biết, đi đến bàn lấy chìa khóa và mở khóa trước khi làm những thứ khác? – Karl

Trả lời

5

Trước tiên, để loại bỏ vấn đề tạo khóa, tôi sẽ tạo tất cả trước. Nó chỉ có 1m hàng và nó có nghĩa là bạn không phải lo lắng về việc quản lý quá trình tạo khóa. Nó cũng có nghĩa là bạn không phải lo lắng về việc tạo ra quá nhiều hàng một cách vô tình, bởi vì một khi bạn đã điền bảng, bạn sẽ chỉ làm các CẬP NHẬT, không phải INSERT.

Một câu hỏi quan trọng ở đây là, tất cả đều là một mặt hàng giống hệt nhau hay không? Nếu có, thì không quan trọng thứ tự các phím là gì (hoặc ngay cả khi chúng có đơn đặt hàng), vì vậy khi khách hàng gửi yêu cầu, bạn chỉ cần 'thử' để CẬP NHẬT cái gì đó gần như thế này:

UPDATE TOP(1) dbo.Giveaway -- you can use OUTPUT to return the key value here 
SET CustomerID = @CurrentCustomerID 
WHERE CustomerID IS NULL 

IF @@ROWCOUNT = 0 -- no free items left 
PRINT 'Bad luck' 
ELSE 
PRINT 'Winner' 

Nếu mặt khác các mặt hàng 1m khác nhau thì bạn cần một giải pháp khác, ví dụ mục 1 là X, mục 2-10 là Y, 11-50 là Z, vv Trong trường hợp này, điều quan trọng là gán cho khách hàng các khóa theo thứ tự các yêu cầu được gửi, vì vậy bạn có lẽ nên xem xét một hệ thống xếp hàng nào đó, có lẽ sử dụng Dịch vụ môi giới. Mỗi khách hàng thêm một yêu cầu vào hàng đợi, sau đó một thủ tục được lưu trữ xử lý chúng cùng một lúc và gán cho họ khóa MAX miễn phí, sau đó trả lại chi tiết về những gì họ đã giành được.

+0

'SET ROWCOUNT' không được dùng trong SQL 2008. Thay vào đó, hãy sử dụng' UPDATE TOP (1) '? http://msdn.microsoft.com/en-us/library/ms188774%28v=sql.100%29.aspx –

+0

@EdHarper Vâng, đó là một điểm tốt và tôi đã cập nhật ví dụ của mình. Mặc dù thông điệp quan trọng cho OP là tất nhiên rằng nó không quan trọng mà hàng bạn cập nhật miễn là bạn cập nhật chỉ có một. – Pondlife

+0

Cảm ơn Pondlife. Các mục khác nhau, do đó, âm thanh như xếp hàng là cách để đi và chỉ chấp nhận sẽ có một số chậm trễ trong việc xử lý mỗi yêu cầu vào thời gian cao điểm. Một giải pháp khác mà tôi đang nghĩ đến là đặt tất cả các số lẻ vào một cơ sở dữ liệu và thậm chí trong cơ sở dữ liệu khác, sau đó có một bộ cân bằng tải với một công tắc bit đơn giản gửi khách hàng xen kẽ tới một db - bất kỳ suy nghĩ nào về giải pháp đó? Tôi đoán tôi có lẽ sẽ được di chuyển nút cổ chai để cân bằng tải thay vào đó và có thể sẽ kết thúc lên cần một hàng đợi quá? Cảm ơn sự giúp đỡ của bạn, được đánh giá cao. –

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