SQL Server 2014 CTP1 giới thiệu các tùy chọn chờ khóa ưu tiên thấp để sử dụng với các hoạt động lập chỉ mục trực tuyến và chuyển đổi phân vùng.
Đối với những hoạt động quản lý chỉ mục trực tuyến hoặc phân vùng chỉ mục và chuyển đổi phân vùng trong SQL Server 2012 Enterprise Edition, có thể bạn đã gặp phải tình trạng chặn hoạt động DDL của mình tại một thời điểm nào đó vì các hoạt động này vẫn có một số yêu cầu khóa.
Để minh họa, hãy tưởng tượng rằng tôi thực hiện xây dựng lại chỉ mục trực tuyến phân vùng đơn sau trong SQL Server 2014 CTP1:
ALTER INDEX [ClusteredIndex_on_ps_ShipDate] ON [dbo]. [FactInternetSales] REBUILD PARTITION =(37) WITH (ONLINE =ON);
Và chúng ta hãy xem xét các khóa có được và phát hành trong hoạt động xây dựng lại này bằng Sự kiện mở rộng và định nghĩa phiên sau (đây là phiên không có mục tiêu và tôi đã xem kết quả qua ngăn “Xem dữ liệu trực tiếp” trong SQL Server Management Studio):
TẠO PHIÊN BẢN SỰ KIỆN [Online_Index_Rebuild_Locks_Taken] TRÊN MÁY CHỦ THÊM SỰ KIỆN sqlserver.lock_acquired (WHERE ([object_id] =(309576141))), THÊM SỰ KIỆN sqlserver.lock_released (WHERE ([object_id] =(309576141) 4096 KB, EVENT_RETENTION_MODE =ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY =30 GIÂY, MAX_EVENT_SIZE =0 KB, MEMORY_PARTITION_MODE =NONE, TRACK_CAUSALITY =OFF, STARTUP_STATE =OFF); ĐI
Giá trị 309576141 đại diện cho ID đối tượng của bảng FactInternetSales.
Quá trình xây dựng lại chỉ mục trực tuyến của tôi cho một phân vùng mất 56 giây để hoàn thành và sau khi hoàn thành, tôi thấy hoạt động thu nhận và giải phóng khóa sau:
Khóa hoạt động để xây dựng lại trực tuyến một phân vùng
Như bạn có thể thấy từ đầu ra, mặc dù việc xây dựng lại là một hoạt động trực tuyến, nó liên quan đến việc mua các khóa ở nhiều chế độ khác nhau trong vòng đời của hoạt động. Lý tưởng nhất là thời lượng khóa là tối thiểu (ví dụ - dấu thời gian giống hệt với SCH_S
đầu tiên khóa được mua và phát hành). Nhưng ngay cả với một số lượng khóa tối thiểu, bạn chắc chắn có thể gặp phải các vấn đề đồng thời tùy thuộc vào các giao dịch chạy chống lại chỉ mục đang được xây dựng lại hoặc chuyển sang.
Tôi đã đề cập ở phần đầu của bài đăng này rằng Microsoft đã giới thiệu các tùy chọn chờ khóa ưu tiên thấp cho các hoạt động trực tuyến và hoạt động chuyển đổi phân vùng trong SQL Server 2014 CTP1. Về chủ đề chuyển đổi phân vùng, hãy tưởng tượng tôi thực hiện thao tác sau:
BẢNG BÁO GIÁ [AdventureWorksDW2012]. [dbo]. [FactInternetSales] CHUYỂN ĐỔI PHẦN 37 THÀNH [AdventureWorksDW2012]. [dbo]. [staging_FactInternetSales];
Để xem các khóa có được và phát hành cho hoạt động này, tôi đã sửa đổi phiên Sự kiện mở rộng đã xác định trước đó của mình để bao gồm các đối tượng áp dụng (bảng nguồn và đích). Tôi thấy như sau:
Khóa hoạt động cho hoạt động chuyển đổi phân vùng
Thao tác chuyển sang phân vùng trống xảy ra trong vòng chưa đầy một giây, nhưng chúng tôi vẫn thấy rằng SCH_S
và SCH_M
cần có khóa trong suốt vòng đời hoạt động trên cả nguồn và đích (309576141 là FactInternetSales và 398624463 là staging_FactInternetSales).
Vì vậy, một lần nữa, mặc dù thời gian khóa có thể cực kỳ ngắn khi không có giao dịch đồng thời nào truy cập vào các đối tượng được đề cập, chúng tôi biết điều này không phải lúc nào cũng có thể thực hiện được và do đó các hoạt động xây dựng lại chỉ mục trực tuyến và chuyển đổi phân vùng của chúng tôi thực sự có thể bị chặn.
Vì vậy, với thực tế này, SQL Server 2014 giới thiệu WAIT_AT_LOW_PRIORITY
đối số có thể được điều chỉnh bằng MAX_DURATION
và ABORT_AFTER_WAIT
tùy chọn cho cả ALTER INDEX
và ALTER TABLE
các lệnh mà chúng tôi có thể sử dụng cho cả hoạt động chuyển đổi phân vùng và chỉ mục trực tuyến.
Điều này cho phép chúng tôi làm gì? Trước hết, hãy nói về hành vi trước SQL Server 2014. Ví dụ:hãy tưởng tượng rằng tôi có giao dịch sau đây đang mở và không được cam kết:
BẮT ĐẦU GIAO DỊCH; XÓA [dbo]. [staging_FactInternetSales];
Nếu tôi cố gắng thực hiện ALTER TABLE SWITCH
đến bảng staging_FactInternetSales dưới dạng đích trong một phiên riêng biệt, tôi sẽ bị chặn và yêu cầu sẽ chỉ chờ đợi. Cụ thể cho ví dụ này, tôi sẽ đợi với LCK_M_SCH_M
loại chờ đợi. Sau khi tôi khôi phục hoặc thực hiện giao dịch của mình, hoạt động có thể tiếp tục và hoàn tất.
Bây giờ nếu tôi đang sử dụng WAIT_AT_LOW_PRIORITY
của SQL Server 2014 với MAX_DURATION
và ABORT_AFTER_WAIT
, Tôi có thể tận dụng một vài tùy chọn khác nhau tùy thuộc vào yêu cầu ứng dụng của mình.
MAX_DURATION
cho phép tôi chỉ định số phút hoạt động xây dựng lại chỉ mục trực tuyến hoặc chuyển đổi phân vùng sẽ đợi. Nếu MAX_DURATION
đạt được giá trị, chúng tôi có thể đặt điều gì xảy ra tiếp theo dựa trên cài đặt của ABORT_AFTER_WAIT
, có thể là giá trị NONE
, SELF
hoặc BLOCKERS
:
-
NONE
có nghĩa là thao tác lập chỉ mục sẽ tiếp tục thử thao tác. -
SELF
có nghĩa là nếuMAX_DURATION
đạt được, hoạt động (xây dựng lại chỉ mục trực tuyến hoặc chuyển đổi phân vùng) sẽ bị hủy bỏ. - Nếu
BLOCKERS
được sử dụng, nó sẽ giết bất kỳ giao dịch nào đang chặn hoạt động xây dựng lại chỉ mục trực tuyến hoặc chuyển đổi phân vùng (theo ý kiến của tôi, không phải là một tùy chọn được sử dụng nhẹ nhàng).BLOCKERS
cũng yêu cầuALTER ANY CONNECTION
quyền đối với yêu cầu đưa ra hoạt động xây dựng lại chỉ mục trực tuyến hoặc chuyển đổi phân vùng.
Các ví dụ mã sau minh họa các biến thể cấu hình khác nhau.
Hành vi mặc định trước năm 2014 (chờ vô thời hạn)
- Việc thực thi những điều sau đây sẽ dẫn đến hành vi mà chúng ta đã quen với trước SQL Server 2014 - và nó vẫn có thể là những gì bạn muốn hoặc mong đợi đối với một số trường hợp nhất định:
BẢNG BÁO GIÁ [AdventureWorksDW2012]. [dbo]. [FactInternetSales] CHUYỂN ĐỔI PHẦN 37 THÀNH [AdventureWorksDW2012]. [dbo]. [staging_FactInternetSales] VỚI (WAIT_AT_LOW_PRIORITY (MAX_DURATION =0 PHÚT, ABIT =NFTER_WA);ONEER_WA)
Chờ 1 phút và hủy thao tác DDL
- Ví dụ sau đợi 1 phút nếu có giao dịch chặn và sẽ nhận được “vượt quá khoảng thời gian chờ yêu cầu khóa” cho
SWITCH
hoạt động nếu đạt đến thời lượng tối đa: BẢNG BÁO GIÁ [AdventureWorksDW2012]. [dbo]. [FactInternetSales] CHUYỂN ĐỔI PHẦN 37 THÀNH [AdventureWorksDW2012]. [dbo]. [staging_FactInternetSales] VỚI (WAIT_AT_LOW_PRIORITY (MAX_DURATION =1 PHÚT, ABIT_AFTER_WA);FA)
Chờ 1 phút và giết (các) trình chặn
- Ví dụ này đợi 1 phút nếu có một giao dịch chặn và sau đó sẽ kết thúc các giao dịch chặn (bao gồm nguồn hoặc đích), cho phép
SWITCH
hoạt động để hoàn thành. BẢNG BÁO ĐỘNG [AdventureWorksDW2012]. [dbo]. [staging_FactInternetSales] CHUYỂN ĐỔI PHẦN 37 THÀNH [AdventureWorksDW2012]. [dbo]. [FactInternetSales] VỚI (WAIT_AT_LOW_PRIORITY (MAX_DURATION =1 PHÚT, ABIT_AFTER_WA); Trong ví dụ của tôi về mộtDELETE
bên trong một giao dịch không được cam kết, không có lỗi trong cửa sổ SQL Server Management Studio của tôi vì tôi không có câu lệnh đang chạy tích cực, nhưng việc thử một câu lệnh khác trong phiên đó đã trả lại thông báo lỗi sau (vì phiên của tôi đã bị hủy): Msg 233, Mức 20, Trạng thái 0, Dòng 3
Đã xảy ra lỗi mức truyền tải khi gửi yêu cầu đến máy chủ. (nhà cung cấp:Nhà cung cấp bộ nhớ dùng chung, lỗi:0 - Không có quy trình nào ở đầu bên kia của đường ống.)Giết (các) Trình chặn ngay lập tức (Nguồn hoặc Đích cho SWITCH)
- Sau đây là một ví dụ về việc loại bỏ trình chặn ngay lập tức - và trong ví dụ của tôi, việc chuyển đổi đã xảy ra trong giây thứ hai và thực sự phiên mà trình chặn đã bị giết:
BẢNG BÁO GIÁ [AdventureWorksDW2012]. [dbo]. [FactInternetSales] CHUYỂN ĐỔI PHẦN 37 SANG [AdventureWorksDW2012]. [dbo]. [staging_FactInternetSales] VỚI (WAIT_AT_LOW_PRIORITY (MAX_DURATION =0 PHÚT, ABIT_AFTER_WA);Một khía cạnh tích cực cuối cùng mà tôi muốn nêu ra…
Nhật ký lỗi máy chủ SQL cung cấp một số kiểm tra theo mặc định về việc sử dụng khóa ưu tiên thấp, bao gồm thông tin về
Ngày 9/10/2013 1:37:15 CHABORT_AFTER_WAIT
hoạt động phù hợp với thông tin nạn nhân:
Nhật ký SQL Server (Hiện tại - 9/10/2013 12:03:00 CH)
Nguồn spid51
Thông báo
Quy trình ID 57 đã bị giết bởi câu lệnh ABORT_AFTER_WAIT =BLOCKERS DDL trên database_id =5, object_id =309576141.Và bạn cũng sẽ thấy các mục nhập riêng cho chính hoạt động ban đầu. Ví dụ:
Một câu lệnh ALTER TABLE SWITCH được thực thi trên cơ sở dữ liệu 'AdventureWorksDW2012', bảng 'staging_FactInternetSales' theo tên máy chủ 'WIN-4T7S36VMSD9', ID tiến trình máy chủ 1360 với bảng đích 'AdventureWorksDW2012.dbo.FactInternetSales' bằng cách sử dụng các tùy chọn WAIT_AT_LOW_PRIORITY =1WAIT_AT_LOW_PRIORITY =1 với MAX_DIT_AT_LOW_PRIORITY =1 BỘ CHẶN. Chặn phiên người dùng sẽ bị hủy sau khoảng thời gian chờ tối đa.Loại nhật ký này rất hữu ích cho mục đích gỡ rối và kiểm tra và tôi rất vui khi thấy nó.