Tôi đang chạy một số thử nghiệm trong Cơ sở dữ liệu SQL và phát hiện ra ít nhất một hoạt động mới hỗ trợ ONLINE = ON
. Nhân tiện, đây là phiên bản mới nhất - SELECT @@VERSION;
tiếp tục mang lại số bản dựng cũ, nhưng bằng chứng là ngày bản dựng:
ngày 12 tháng 2 năm 2015 00:53:13
Bản quyền (c) Microsoft Corporation
Phiên bản Cơ sở dữ liệu Azure SQL này hỗ trợ ONLINE = ON
tùy chọn cho ALTER TABLE ... ALTER COLUMN
.
Giả sử bạn có một bảng với cột có thể vô hiệu:
CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255)); INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects;
Và bây giờ bạn quyết định làm cho cột đó không thể nullable, bạn có thể làm điều này (giả sử không có NULL
s):
ALTER TABLE dbo.a ALTER COLUMN x VARCHAR(255) NOT NULL WITH (ONLINE = ON);
Bạn cũng có thể thực hiện những việc như thay đổi đối chiếu, kiểu dữ liệu hoặc kích thước của cột:
ALTER TABLE dbo.a ALTER COLUMN x NVARCHAR(510) -- changed data type and length COLLATE Albanian_BIN NOT NULL -- changed collation and nullability WITH (ONLINE = ON);
Trong các phiên bản hiện tại của SQL Server (và các phiên bản trước của Cơ sở dữ liệu Azure SQL), ONLINE = ON
gợi ý không được hỗ trợ cho ALTER TABLE
và không có tùy chọn, đây là hoạt động chặn và kích thước dữ liệu. Công bằng mà nói, lần đầu tiên tôi chạy mã, tôi chỉ có thể chứng minh rằng phiên bản có ONLINE = ON
đã chạy thành công, không phải là nó hoạt động như quảng cáo.
Tôi đã chạy mã này với ONLINE = ON
và không có:
CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255)); INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects; -- placeholder; ALTER TABLE dbo.a ALTER COLUMN x NVARCHAR(510) COLLATE Albanian_BIN NOT NULL -- WITH (ONLINE = ON); -- placeholder; DROP TABLE dbo.a;
Trong --placeholder
tại chỗ, tôi đã thử một vài thao tác để xác định bất kỳ sự khác biệt nào về hành vi (đây là Cơ sở dữ liệu SQL sản xuất của chúng tôi, vì vậy tôi không muốn sử dụng đủ dữ liệu hoặc tạo đủ hoạt động mà sự khác biệt sẽ rõ ràng). Tôi muốn kiểm tra trong cả hai trường hợp xem trang đã thay đổi (cho biết hoạt động trực tuyến thực sự) hay các giá trị đã được cập nhật tại chỗ trên các trang hiện có (hoạt động không trực tuyến). Tôi cũng có thể mở rộng thử nghiệm để xem có bao nhiêu trang mới được tạo nếu các trang đã đầy và / hoặc tất cả 255 ký tự đã được sử dụng, nhưng tôi nghĩ rằng chỉ cần xem các trang đã thay đổi là đủ.
Tôi đã thử DBCC IND()
:
DBCC IND(N'dbname', N'dbo.a', 1, 1);
Kết quả ở đây không có gì đáng ngạc nhiên:
Msg 40518, Mức 16, Trạng thái 1Lệnh DBCC 'IND' không được hỗ trợ trong phiên bản SQL Server này.
Và sys.dm_db_database_page_allocations
(thay thế cho DBCC IND
):
SELECT allocated_page_page_id FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID(N'dbo.a'),1,1,N'LIMITED') WHERE is_iam_page = 0;
Điều này mang lại một tập kết quả trống - Tôi tin rằng do thiết kế mà chức năng quản lý động này không tiết lộ bất kỳ thông tin vật lý nào trong Cơ sở dữ liệu Azure SQL.
Tiếp theo, tôi đã thử một thủ thuật với fn_PhysLocCracker
, những người như Michelle Ufford (@sqlfool) đã viết blog về trước đây:
SELECT l.page_id FROM dbo.a OUTER APPLY sys.fn_PhysLocCracker(%%PhysLoc%%) AS l;
Sự thành công! Giá trị này trả về cho các trang được sử dụng trong quá trình quét với dbo.a
và rõ ràng là trong ONLINE = ON
phiên bản, dữ liệu được chuyển sang các trang mới (có lẽ để lại các trang cũ trong suốt quá trình hoạt động) và không có gợi ý, dữ liệu và siêu dữ liệu được cập nhật tại chỗ:
So sánh các trang theo hành vi ALTER COLUMN tiêu chuẩn (trái) với ONLINE =ON (phải)
Một thứ khác mà tôi muốn so sánh là các kế hoạch thực hiện. Tôi có thể không thấy nhiều trong Management Studio, nhưng trong SQL Sentry Plan Explorer Pro, tôi có thể thấy toàn bộ lệnh gọi, bao gồm cả những gì diễn ra đằng sau hậu trường của một số lệnh DDL. Công cụ của chúng tôi đã không làm thất vọng - mặc dù nó không đưa ra kế hoạch thực tế cho biến thể cập nhật tại chỗ, nhưng nó cũng chứng tỏ rằng có sự khác biệt đáng kể về hành vi khi sử dụng ONLINE = ON
:
So sánh các gói theo hành vi ALTER COLUMN tiêu chuẩn (trái) với ONLINE =ON (phải)
Tất nhiên, bạn sẽ chỉ thấy sự khác biệt này nếu bạn đáp ứng tất cả các điều kiện khác cần thiết cho hoạt động trực tuyến (nhiều điều kiện tương tự với các yêu cầu để xây dựng lại chỉ mục trực tuyến) trong tài liệu được cập nhật gần đây.
Bây giờ, nếu bạn không sử dụng Cơ sở dữ liệu SQL, điều đó sẽ giúp bạn như thế nào? Rốt cuộc, cú pháp này không phân tích cú pháp chính xác ngay cả trong SQL Server 2014 Cập nhật tích lũy # 6 (12.0.2480). Chà, Microsoft đã không chính xác bảo vệ thực tế rằng mô hình phát triển đã trở thành "đám mây trước, sau đó hộp" - như Mark Souza gần đây đã ngụ ý khi anh ấy tweet về tính năng bảo mật cấp hàng mới được giới thiệu đầu tiên trong Cơ sở dữ liệu Azure SQL:
Bảo mật cấp hàng. Được cộng đồng #sqlserver yêu cầu rất nhiều. http://t.co/pp0sNr8Nt5 Đám mây trước tiên nhưng bạn biết điều đó có nghĩa là gì. Nó đang đến
- Mark Souza (@mark_AzureCAT) ngày 8 tháng 2 năm 2015
Điều này có nghĩa là các hoạt động trực tuyến này có thể sẽ sớm đến với bản sao SQL Server cục bộ của bạn vào một thời điểm nào đó. Tuy nhiên, giống như nhiều hoạt động trực tuyến khác, hãy nhớ rằng những thứ này có xu hướng được dành riêng cho Phiên bản Doanh nghiệp.