Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Khám phá các tùy chọn chờ khóa ưu tiên thấp trong SQL Server 2014 CTP1

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_SSCH_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_DURATIONABORT_AFTER_WAIT tùy chọn cho cả ALTER INDEXALTER 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_DURATIONABORT_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ếu MAX_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ầu ALTER 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ột DELETE 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ề ABORT_AFTER_WAIT hoạt động phù hợp với thông tin nạn nhân:

    Ngày 9/10/2013 1:37:15 CH
    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ó.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chuyển tên bảng vào proc được lưu trữ?

  2. SQL Pivot với nhiều cột

  3. Một cách để trích xuất từ ​​dữ liệu giá trị DateTime mà không cần giây

  4. Toán tử logic HOẶC trong SQL Server là gì - Hướng dẫn sử dụng SQL Server / TSQL Phần 119

  5. SQL Server 2016:Khôi phục cơ sở dữ liệu