2010-11-06 25 views
16

Tôi có nên chạyCác tác động của SET-ting ALLOW_SNAPSHOT_ISOLATION ON là gì?

ALTER DATABASE DbName SET ALLOW_SNAPSHOT_ISOLATION OFF 

nếu giao dịch bản chụp (TX) cách ly (iso) không được sử dụng tạm thời?
Nói cách khác,

  • lý do tại sao nó phải được kích hoạt, ở vị trí đầu tiên?
  • Tại sao nó không được kích hoạt theo mặc định?

Chi phí của việc bật tính năng này (nhưng tạm thời không được sử dụng) trong SQL Server là gì?


--Update:
cho phép của ảnh chụp TX mức iso trên cơ sở dữ liệu không thay đổi ĐỌC CAM KẾT tx iso là mặc định.
Bạn có thể kiểm tra xem nó bằng cách chạy:

use someDbName; 
--(1) 
alter database someDbName set allow_snapshot_isolation ON; 
dbcc useroptions; 

hàng cuối cùng cho thấy tx mức iso của phiên hiện tại là (đọc cam kết).

Vì vậy, cho phép chụp độ tx iso mà không thay đổi để nó không sử dụng nó, vv Để sử dụng nó ta nên hành

--(2) 
SET TRANSACTION ISOLATION LEVEL SNAPSHOT 

Update2:
Tôi lặp lại kịch bản từ [1 ] nhưng đã bật SNAPSHOT (nhưng chưa được bật) nhưng không bật READ_COMMITTED_SNAPSHOT

--with enabling allow_snapshot_isolation 
alter database snapshottest set allow_snapshot_isolation ON 

-- but without enabling read_committed_snapshot 
--alter database snapshottest set read_committed_snapshot ON 
-- OR with OFF 
alter database snapshottest set read_committed_snapshot OFF 
go 

Không có kết quả/hàng từ thực thi

select * from sys.dm_tran_version_store 

sau khi thực hiện câu lệnh INSERT, DELETE hoặc CẬP NHẬT

Bạn có thể cung cấp cho tôi với kịch bản minh họa rằng kích hoạt SNAPSHOT mức tx iso bởi (1) nhưng không bật lên bởi (2) tạo ra bất kỳ phiên bản trong tempdb và/hoặc tăng kích thước dữ liệu với 14 byte mỗi hàng?
Thực sự tôi không hiểu điểm trong phiên bản nếu nó được kích hoạt bởi (1) nhưng không được sử dụng (không được thiết lập bởi (2))?

[1]
Quản lý tempdb trong SQL Server: tempdb Khái niệm cơ bản (Version Store: Ví dụ đơn giản)
http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/12/31/managing-tempdb-in-sql-server-tempdb-basics-version-store-simple-example.aspx

+0

của nó thường được coi là lịch sự để biện minh cho mối quan tâm ur sau một downvote ... – Mulki

Trả lời

20

Ngay sau khi phiên bản hàng (còn gọi là ảnh chụp nhanh) được bật trong cơ sở dữ liệu, tất cả các ghi phải được phiên bản. Nó không quan trọng theo mức độ cô lập viết xảy ra, kể từ khi mức độ cô lập luôn ảnh hưởng đến chỉ lần đọc. Ngay sau các phiên bản cơ sở dữ liệu hàng được kích hoạt, bất kỳ insert/update/delete ý:

  • tăng kích thước của dữ liệu với 14 byte cho mỗi hàng
  • có thể tạo ra một hình ảnh của dữ liệu trước khi cập nhật trong các cửa hàng phiên bản (tempdb)

Một lần nữa, điều đó hoàn toàn không liên quan đến mức cách ly được sử dụng. Lưu ý rằng hàng versioning cũng xảy ra nếu có những điều sau đây là đúng:

  • bảng có kích hoạt
  • MARS được kích hoạt trên các kết nối
  • trực tuyến hoạt động chỉ số đang chạy trên bàn

Tất cả điều này được giải thích trong Row Versioning Resource Usage:

Mỗi hàng cơ sở dữ liệu có thể sử dụng tối đa 14 byte ở cuối hàng cho hàng thông tin phiên bản. Hàng thông tin phiên bản chứa số thứ tự giao dịch của giao dịch cam kết phiên bản và con trỏ đến hàng được phiên bản. Những 14 byte được thêm lần đầu tiên hàng được sửa đổi, hoặc khi một hàng mới được chèn, dưới bất kỳ các điều kiện:

  • READ_COMMITTED_SNAPSHOT hoặc ALLOW_SNAPSHOT_ISOLATION tùy chọn là ON .
  • Bảng có trình kích hoạt.
  • Nhiều bộ kết quả hoạt động (MARS) đang được sử dụng.
  • Hoạt động xây dựng chỉ mục trực tuyến hiện đang chạy trên bảng.

...

phiên bản Row phải được lưu trữ càng miễn là một giao dịch tích cực cần phải truy cập nó. ... nếu nó đáp ứng bất kỳ của điều kiện sau đây:

  • Nó sử dụng hàng tách biệt phiên bản dựa trên.
  • Nó sử dụng trình kích hoạt, MARS hoặc các hoạt động xây dựng chỉ mục trực tuyến.
  • Nó tạo ra các phiên bản hàng.

Cập nhật

:setvar dbname testsnapshot 

use master; 

if db_id('$(dbname)') is not null 
begin 
    alter database [$(dbname)] set single_user with rollback immediate; 
    drop database [$(dbname)]; 
end 
go 

create database [$(dbname)]; 
go 

use [$(dbname)]; 
go 


-- create a table before row versioning is enabled 
-- 
create table t1 (i int not null); 
go 
insert into t1(i) values (1); 
go 

-- this check will show that the records do not contain a version number 
-- 
select avg_record_size_in_bytes 
from sys.dm_db_index_physical_stats (db_id(), object_id('t1'), NULL, NULL, 'DETAILED') 
-- record size: 11 (lacks version info that is at least 14 bytes) 


-- enable row versioning and and create an identical table 
-- 
alter database [$(dbname)] set allow_snapshot_isolation on; 
go 

create table t2 (i int not null); 
go 

set transaction isolation level read committed; 
go 

insert into t2(i) values (1); 
go 

-- This check shows that the rows in t2 have version number 
-- 
select avg_record_size_in_bytes 
    from sys.dm_db_index_physical_stats (db_id(), object_id('t2'), NULL, NULL, 'DETAILED') 
-- record size: 25 (11+14) 

-- this update will show that the version store has records 
-- even though the isolation level is read commited 
-- 
begin transaction; 
update t1 
    set i += 1; 
select * from sys.dm_tran_version_store; 
commit; 
go 

-- And if we check again the row size of t1, its rows now have a version number 
select avg_record_size_in_bytes 
from sys.dm_db_index_physical_stats (db_id(), object_id('t1'), NULL, NULL, 'DETAILED') 
-- record size: 25 
+0

Wow, điều này là có thật hi-tek. Bạn có thể viết biểu thức tương đương của ": setvar dbname testsnapshot" runnable trong cửa sổ truy vấn SSMS không? –

+1

Bật chế độ SQLCMD trong chính SSMS: http://msdn.microsoft.com/en-us/library/ms174187.aspx. Sidenote: Tôi cũng có thư viện cho phép mở rộng SQLCMD trong ứng dụng khách: http://code.google.com/p/dbutilsqlcmd/ –

+0

http://msdn.microsoft.com/en-us/library/ms189050.aspx Nếu tôi đang đọc quyền này, có thực sự khác biệt về viết. – Antony

1

Theo mặc định, bạn phải cách ly chụp OFF, Nếu bạn bật nó ON, SQL sẽ duy trì ảnh chụp nhanh dữ liệu để chạy các giao dịch. Ví dụ: Trên kết nối 1, bạn đang chạy chọn lớn. Trên kết nối 2, bạn cập nhật một số bản ghi sẽ được trả lại bằng cách chọn đầu tiên.

Trong chế độ cô lập ảnh chụp ON, SQL sẽ tạo bản sao tạm thời của dữ liệu, bị ảnh hưởng bởi cập nhật, do đó, SELECT sẽ trả về dữ liệu gốc.

Mọi thao tác dữ liệu bổ sung sẽ ảnh hưởng đến hiệu suất. Đó là lý do tại sao cài đặt này TẮT theo mặc định.

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