Làm cách nào tôi có thể đảm bảo rằng các phần chèn vào SQL Server 2008 R2 được lưu trong bộ nhớ cache trước?


17

Hãy tưởng tượng một luồng dữ liệu "bùng nổ", tức là nó có thể có 10.000 sự kiện đến rất nhanh, sau đó không có gì trong một phút.

nhập mô tả hình ảnh ở đây

Lời khuyên của chuyên gia: Làm cách nào tôi có thể viết mã chèn C # cho SQL Server, để đảm bảo rằng SQL lưu trữ mọi thứ ngay lập tức trong RAM của chính nó, mà không chặn ứng dụng của tôi nhiều hơn mức cần thiết để cung cấp dữ liệu vào RAM nói trên? Để đạt được điều này, bạn có biết bất kỳ mẫu nào để thiết lập máy chủ SQL hoặc các mẫu để thiết lập các bảng SQL riêng lẻ mà tôi đang viết không?

Tất nhiên, tôi có thể thực hiện phiên bản của riêng mình, bao gồm việc xây dựng hàng đợi của riêng tôi trong RAM - nhưng tôi không muốn phát minh lại Rìu đá Paleolithic, có thể nói như vậy.


1
Bạn đang nói về mã khách hàng C #? Vì vậy, bạn quan tâm đến mã SQL đảm bảo ghi được lưu trữ?
Richard

6
Tôi có xu hướng xếp hàng tự chèn vào NGAY CẢ nếu RDBMS hỗ trợ vì (a) nó không khó, (b) nó hoàn toàn nằm trong tầm kiểm soát của bạn và (c) nó không phụ thuộc vào nhà cung cấp.

Tôi quan tâm đến mã máy khách C # có chứa mã SQL để đảm bảo ghi được lưu vào bộ đệm. Tuy nhiên, tôi chắc chắn rằng tôi có thể làm việc với T-SQL thẳng và viết trình bao bọc C # của riêng tôi.

Câu trả lời:


11

Bạn đã thử chỉ viết và xem những gì xảy ra? Bạn có một nút cổ chai được biết đến?

Nếu bạn cần ngăn chặn ứng dụng của mình bị chặn thì bạn có một cách là xếp hàng ghi để trì hoãn cuộc gọi cơ sở dữ liệu. Tuy nhiên, tôi hy vọng hàng đợi sẽ xóa trong một hoặc hai giây: vì vậy bạn có cần một hàng đợi nếu điều này ổn không?

Hoặc bạn có thể spool đến một bảng dàn dựng và sau đó tuôn ra sau? Chúng tôi sử dụng kỹ thuật này để đối phó với việc ghi hàng triệu hàng mới mỗi phút (chúng tôi thực sự sử dụng DB theo giai đoạn với phục hồi đơn giản): nhưng chúng tôi đã không thực hiện nó cho đến khi chúng tôi có kinh nghiệm chỉ viết các hàng.

Lưu ý: Mỗi lần ghi trong SQL Server sẽ thực hiện trên đĩa như một phần của giao thức Write Ahead Logging (WAL). Điều này áp dụng cho mục nhập nhật ký t cho ghi đó.

Trang dữ liệu với hàng sẽ đi vào đĩa tại một số điểm (dựa trên thời gian, sử dụng, áp suất bộ nhớ, v.v.) nhưng nói chung, dữ liệu của bạn sẽ nằm trong bộ nhớ. Đây được gọi là "Điểm kiểm tra" và không đuổi dữ liệu khỏi bộ nhớ, chỉ xóa các thay đổi (chỉnh sửa ngày 24 tháng 11 năm 2011)

Biên tập:

Để xem xét xuyên suốt, dựa trên đoạn cuối ở trên, hãy chuyển LDF của bạn cho cơ sở dữ liệu này sang một bộ đĩa chuyên dụng để có hiệu suất cao hơn. Ditto một cơ sở dữ liệu dàn (mỗi cái cho MDF / LDF). Khá phổ biến khi có hàng tá hoặc 3 khối lượng khác nhau (thông qua SAN thông thường) cho máy chủ cơ sở dữ liệu của bạn


1
Spooling đến một bàn dàn có lẽ là cách tốt nhất để đi. Tôi cũng đã có xác nhận từ một trong những người bạn của tôi, người làm việc trong môi trường có hàng tỷ bảng, anh ấy nói anh ấy sử dụng bảng tạm thời để phân tích nhanh hơn.

7

Trừ khi tôi thiếu thứ gì đó, điều này sẽ vi phạm yêu cầu Độ bền từ ACID ( http://en.wikipedia.org/wiki/ACID ). Đó là, nếu ứng dụng của bạn "ghi" dữ liệu vào RAM và sau đó máy chủ gặp sự cố, dữ liệu của bạn sẽ bị mất.

Vì vậy, những gì bạn tìm kiếm là một hệ thống phi cơ sở dữ liệu đóng vai trò là hàng đợi lưu trữ cuối cùng vào cơ sở dữ liệu hoặc hệ thống cơ sở dữ liệu đủ nhanh cho những gì bạn đang làm. Tôi khuyên bạn nên thử cái sau trước và xem nó có đủ không; đừng vay rắc rối.


+1 Tôi nên đã đề cập đến điều này. WAL được yêu cầu cho ACID
gbn

2

Tôi đã sử dụng một lần một Dataset cho việc này. Tôi đã chèn các hàng vào tập dữ liệu khi chúng đến, và có một luồng khác đang xóa các hàng cứ sau 2 giây hoặc lâu hơn vào cơ sở dữ liệu. Bạn cũng có thể sử dụng tài liệu xml để thực hiện bộ đệm, và sau đó chuyển xml vào cơ sở dữ liệu trong một cuộc gọi, điều này có thể còn tốt hơn.

Trân trọng

Piotr

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.