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

Khám phá các thao tác lập chỉ mục trực tuyến cấp độ phân vùng trong SQL Server 2014 CTP1

SQL Server 2014 CTP1 giới thiệu các phần mở rộng cho các tùy chọn hoạt động trực tuyến sẽ là tin tốt cho các công ty lưu trữ cơ sở dữ liệu rất lớn yêu cầu ít hoặc không có thời gian chết.

Để đặt bối cảnh, hãy tưởng tượng rằng bạn đang sử dụng SQL Server 2012 Enterprise Edition cho các tính năng phân vùng chỉ mục và quản lý chỉ mục trực tuyến và bạn thử xây dựng lại chỉ mục sau trên bảng được phân vùng:

ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber]
ON [dbo].[FactInternetSales]
REBUILD PARTITION = ALL
WITH (ONLINE= ON);

Kiểm tra điều này trong SQL Server 2012, chúng tôi có thể xây dựng lại tất cả các phân vùng trực tuyến mà không gặp lỗi. Nhưng điều gì sẽ xảy ra nếu chúng ta muốn chỉ định một phân vùng cụ thể thay vì tất cả các phân vùng?

ALTER INDEX [PK_FactInternetSales_SalesOrderNumber_SalesOrderLineNumber]
ON [dbo].[FactInternetSales]
REBUILD PARTITION = 1
WITH (ONLINE= ON);

Cố gắng thực hiện điều này trong SQL Server 2012 trở về trước, bạn sẽ thấy thông báo lỗi sau:

Bản tin 155, Mức 15, Trạng thái 1, Dòng 4
'ONLINE' không phải là một tùy chọn ALTER INDEX REBUILD PARTITION được công nhận.

Nhưng bắt đầu với SQL Server 2014 (kể từ CTP1), các hoạt động lập chỉ mục phân vùng đơn trực tuyến hiện đã được hỗ trợ. Và đây chắc chắn là một vấn đề lớn đối với các tình huống bảo trì bảng rất lớn mà bạn muốn, hoặc thực sự phải chia việc bảo trì tổng thể của bạn thành các phần nhỏ hơn trong một khoảng thời gian. Bạn cũng có thể muốn thực hiện bảo trì cấp độ phân vùng chỉ cho những phân vùng thực sự yêu cầu nó - ví dụ:những phân vùng thực sự vượt quá một cấp độ phân mảnh cụ thể.

Để kiểm tra chức năng CTP1 của SQL Server 2014 này, tôi đã sử dụng AdventureWorksDW2012 với phiên bản FactInternetSales chứa 61.847.552 hàng và được phân vùng theo cột ShipDate.

Tạo lại tất cả các phân vùng trực tuyến cho bảng bằng cách sử dụng PARTITION = ALL trong môi trường thử nghiệm của tôi mất 3 phút 23 giây. Về thời lượng tổng thể, các bài kiểm tra của tôi dành cho các chỉ mục không phải là tất cả đều bị phân mảnh, vì vậy thời lượng 3 phút 23 giây đại diện cho thời lượng trung bình trong một số bài kiểm tra. Cũng nên nhớ rằng tôi không có khối lượng công việc cạnh tranh đang chạy vào thời điểm đó, vì vậy, việc xây dựng lại trực tuyến đang diễn ra mà không phải cạnh tranh với khối lượng công việc quan trọng khác so với chỉ mục được đề cập.

Hình dạng kế hoạch thực thi truy vấn để xây dựng lại chỉ mục trực tuyến bằng cách sử dụng PARTITION = ALL như sau:


Kế hoạch thực thi để xây dựng lại trực tuyến tất cả các phân vùng

Lưu ý rằng các hoạt động được bật song song ngoại trừ toán tử Quét liên tục. Trong kế hoạch thực thi truy vấn, bạn có thể thấy 39 hàng trong tham chiếu bên ngoài Quét liên tục đang được chuyển tới toán tử Luồng phân phối và sau đó điều khiển Vòng lặp lồng nhau.

Ý nghĩa của 39 hàng? Truy vấn sau xác thực số lượng phân vùng tối đa từ sys.dm_db_partition_stats . Đối với môi trường thử nghiệm của tôi, kết quả là 39 cho số phân vùng tối đa, khớp với những gì tôi thấy cho các hàng thực tế Quét liên tục:

SELECT MAX([partition_number]) AS [max_partition_number]
FROM [sys].[dm_db_partition_stats]
WHERE [object_id] = OBJECT_ID('FactInternetSales');

Bây giờ, bạn cũng sẽ nhận thấy toán tử Chèn chỉ mục trực tuyến trong kế hoạch trước đó. Xóa ONLINE = ON tùy chọn từ ALTER INDEX REBUILD của tôi (làm cho nó hoạt động ngoại tuyến) và giữ PARTITION = ALL tùy chọn, thay đổi duy nhất là có toán tử “Chèn chỉ mục” thay vì “Chèn chỉ mục trực tuyến” trong kế hoạch thực thi truy vấn - và cũng giảm thời lượng, trong đó thử nghiệm của tôi cho thấy thời lượng thực thi 1 phút 9 giây so với trực tuyến 3 phút 23 giây.

Sau đó, tôi đã thử nghiệm xây dựng lại trực tuyến một phân vùng với 5.678.080 hàng trong đó thay vào đó (hãy nhớ tổng số hàng trong bảng là 61.847.552 hàng). Đối với thử nghiệm này, thời lượng tổng thể mất đúng 1 phút và có hình dạng kế hoạch thực thi truy vấn như sau:


Kế hoạch thực thi để xây dựng lại trực tuyến một phân vùng duy nhất

Nhận xét đầu tiên là đây là một kế hoạch nối tiếp. Cũng lưu ý rằng tôi đã nói rằng tôi đã chọn một phân vùng trong số 39 phân vùng ban đầu, mặc dù phân vùng cụ thể đó đại diện cho ~ 9% số hàng trong bảng tổng thể. Cũng lưu ý rằng Quét liên tục hiển thị 1 hàng thay vì 39 như tôi mong đợi.

Điều gì về thời lượng của một phân vùng duy nhất, xây dựng lại ngoại tuyến? Trong môi trường thử nghiệm của tôi, điều này mất 11 giây so với 1 phút xây dựng lại trực tuyến. Hình dạng kế hoạch thực thi truy vấn để xây dựng lại ngoại tuyến của một phân vùng như sau:


Kế hoạch thực thi để xây dựng lại ngoại tuyến một phân vùng

Lưu ý rằng không có quy trình Quét liên tục hoặc quy trình Vòng lặp lồng nhau được liên kết và cũng lưu ý rằng kế hoạch này hiện có các toán tử song song trong đó so với kế hoạch nối tiếp trước đó, mặc dù cả hai đều đang thực hiện Quét chỉ mục theo cụm cho 5.678.080 hàng. Cũng thực hiện tìm kiếm từ khóa “phân vùng” trong văn bản kế hoạch XML cho hoạt động lập chỉ mục song song ngoại tuyến phân vùng đơn không dẫn đến bất kỳ kết quả phù hợp nào - so với kế hoạch nối tiếp, hoạt động lập chỉ mục phân vùng đơn trực tuyến có Partitioned =“true” cho Quét chỉ mục theo cụm và chỉ mục trực tuyến Chèn toán tử vật lý.

Quay lại phần khám phá chính…

Tôi có thể chọn một vài, nhưng không phải tất cả các phân vùng trong một lần thực thi không? Không may măn.

ALTER INDEXALTER TABLE các lệnh có PARTITION = ALL và sau đó là PARTITION = <partition number> đối số, nhưng không có khả năng liệt kê nhiều phân vùng cho một hoạt động xây dựng lại duy nhất. Tuy nhiên, tôi không phàn nàn quá nhiều về điều này, vì tôi rất vui khi có khả năng xây dựng lại trực tuyến một phân vùng duy nhất và việc thực hiện thao tác một lần cho mỗi lần xây dựng lại không quá phức tạp, tuy nhiên tác động tích lũy đến thời lượng là một cái gì đó Tôi muốn khám phá thêm.

Sẽ mất bao lâu để xây dựng lại tất cả 39 phân vùng riêng biệt và trực tuyến so với PARTITION = ALL thời lượng 3 phút 23 giây?

Chúng tôi biết rằng lợi ích của việc xây dựng lại trực tuyến là khả năng vẫn truy cập vào bảng hoặc chỉ mục được liên kết trong quá trình hoạt động chỉ mục. Nhưng đổi lại hoạt động trực tuyến đó, chúng tôi sẽ mất lợi thế về hiệu suất của việc xây dựng lại so với hoạt động xây dựng lại ngoại tuyến. Và điều tôi muốn biết tiếp theo là cách xây dựng lại trực tuyến từng phân vùng sẽ hoạt động như thế nào so với PARTITION = ALL thay thế.

Thực hiện 39 hoạt động xây dựng lại riêng biệt (một hoạt động xây dựng lại cho mỗi phân vùng duy nhất), tổng thời lượng thực thi là 9 phút 54 giây so với PARTITION = ALL mất 3 phút 23 giây, vì vậy rõ ràng cách tiếp cận từng phần không nhanh bằng cách xây dựng lại trực tuyến tất cả các phân vùng trong một câu lệnh. Mặc dù tôi có thể thực hiện từng phân vùng một, nhưng lợi ích tổng thể là khả năng chia nhỏ các hoạt động bảo trì của chúng tôi theo thời gian và giữ quyền truy cập vào các đối tượng khi chúng đang được xây dựng lại, nhưng nếu bạn đang tìm kiếm một bản xây dựng lại ngắn hơn cửa sổ, các tùy chọn ngoại tuyến vẫn là nhanh nhất, tiếp theo là trực tuyến cho PARTITION = ALL và ở vị trí cuối cùng, thực hiện từng phân vùng một.

Bảng sau đây tóm tắt lại các so sánh thời lượng - và một lần nữa, các bài kiểm tra này dựa trên SQL Server 2014 CTP1 và kích thước bảng rất cụ thể và cấu hình máy khách VM, vì vậy hãy chú ý nhiều hơn đến thời lượng tương đối giữa các bài kiểm tra thay vì chính thời lượng:

Mô tả thử nghiệm Thời lượng
Xây dựng lại ngoại tuyến tất cả các phân vùng 1:09
Xây dựng lại trực tuyến tất cả các phân vùng 3:23
Xây dựng lại trực tuyến một phân vùng 1:00
Xây dựng lại ngoại tuyến một phân vùng 0:11
Xây dựng lại trực tuyến tất cả các phân vùng, mỗi lần một phân vùng 9:54


Bây giờ cũng có những khía cạnh khác để khám phá về chủ đề này. Chỉ vì một hoạt động trực tuyến không có nghĩa là không có một vài thời điểm (hoặc lâu hơn) mà các ổ khóa vẫn được giữ trên đối tượng được nhắm mục tiêu. Các hoạt động lập chỉ mục vẫn có hành vi khóa đối với các hoạt động trực tuyến - và SQL Server 2014 đã cung cấp các tùy chọn cho việc này cũng như những tùy chọn mà tôi sẽ khám phá trong một bài đăng riêng.


  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 để tạo và điền bảng trong một bước duy nhất như một phần của thao tác nhập CSV?

  2. Hiểu SQL Server Lockdown để Bảo mật Môi trường Cơ sở dữ liệu

  3. Hiệu suất của hàm COUNT SQL

  4. danh sách được phân tách bằng dấu phẩy dưới dạng một chuỗi đơn, T-SQL

  5. Cách nhập cơ sở dữ liệu SQL Server vào Access 2016