2011-10-03 23 views
9

Tôi đã tự hỏi liệu có một tác động hiệu quả của việc thêm một cột hàng tuần trên một bảng trong cơ sở dữ liệu Sql-Server không?RowVersion and Performance

+3

so với gì? nếu bạn cần một bản đổ chuông, bạn cần một sự đổi hàng .... –

+2

Tôi đồng ý với Mitch. Bạn sẽ sử dụng cách giải quyết nào để thay thế nó, nếu bạn cần nó? – gbn

+0

bản sao có thể có của [Không rowversion/dấu thời gian ảnh hưởng đến hiệu suất đáng kể?] (Http://stackoverflow.com/questions/7217062/does-rowversion-timestamp-affects-performance-significantly) –

Trả lời

14

Có một vài tác động về hiệu suất, chuyển đổi hàng chỉ là một tên mới cho kiểu dữ liệu dấu thời gian cũ. Vì vậy, cơ sở dữ liệu của bạn sẽ cần lưu trữ trường nhị phân bổ sung. hiệu suất của bạn sẽ bị ảnh hưởng nhiều hơn khi bạn cố gắng làm các truy vấn trên dữ liệu này như:

SELECT * 
FROM MyTable 
WHERE rowVersion > @rowVersion 

Đó là cách phổ biến mà có thể được sử dụng để có được danh sách các mặt hàng được cập nhật kể từ @rowVersion ngoái. Điều này có vẻ ổn và sẽ hoạt động hoàn hảo cho một bảng có 10.000 hàng. Nhưng khi bạn nhận được 1M hàng, bạn sẽ nhanh chóng phát hiện ra rằng nó luôn luôn làm một bảng và hiệu suất hit của bạn là bởi vì bảng của bạn bây giờ không còn phù hợp hoàn toàn trong RAM của máy chủ.

Đây là vấn đề phổ biến gặp phải với cột rowVersion, nó không được lập chỉ mục một cách kỳ diệu trên chính nó. Ngoài ra, khi bạn chỉ mục cột rowVersion bạn phải chấp nhận rằng chỉ mục thường sẽ bị phân mảnh theo thời gian, bởi vì các giá trị mới được cập nhật luôn nằm ở cuối chỉ mục, để lại khoảng trống trong chỉ mục khi bạn cập nhật các mục hiện có .

Chỉnh sửa: Nếu bạn không sử dụng trường rowVersion để kiểm tra các mục được cập nhật và thay vào đó bạn sẽ sử dụng nó để đảm bảo rằng bản ghi không được cập nhật kể từ lần cuối bạn đọc, thì điều này sẽ là một cách sử dụng hoàn toàn có thể chấp nhận được và sẽ không ảnh hưởng.

UPDATE MyTable SET MyField = ' @myField 
WHERE Key = @key AND rowVersion = @rowVersion