Vấn đề
Trong bài này, chúng tôi sẽ tập trung vào việc trình bày phân vùng bảng. Cách giải thích đơn giản nhất về phân vùng bảng có thể được gọi là chia các bảng lớn thành các bảng nhỏ. Chủ đề này cung cấp khả năng mở rộng và khả năng quản lý.
Phân vùng bảng trong SQL Server là gì?
Giả sử rằng chúng ta có một cái bàn và nó phát triển từng ngày. Trong trường hợp này, bảng có thể gây ra một số vấn đề cần được giải quyết bằng các bước được xác định bên dưới:
- Duy trì bảng này. Sẽ mất nhiều thời gian và tiêu tốn nhiều tài nguyên hơn (CPU, IO, v.v.).
- Sao lưu.
- Sự cố khóa.
Do những lý do nêu trên, chúng ta cần một bảng phân vùng. Cách tiếp cận này có những lợi ích sau:
- Khả năng quản lý:Nếu chúng tôi chia nhỏ bảng, chúng tôi có thể quản lý từng phân vùng của bảng. Ví dụ:chúng tôi chỉ có thể tạo một phân vùng của bảng.
- Khả năng lưu trữ:Một số phân vùng của bảng chỉ được sử dụng vì lý do này. Chúng tôi không cần sao lưu phân vùng này của bảng. Chúng tôi có thể sử dụng bản sao lưu nhóm tệp và sao lưu nó chỉ bằng cách thay đổi một phân vùng của bảng.
- Hiệu suất truy vấn:Trình tối ưu hoá truy vấn SQL Server quyết định sử dụng loại bỏ phân vùng. Có nghĩa là SQL Server không thực hiện bất kỳ tìm kiếm nào đối với phân vùng không liên quan của bảng.
Phân vùng bảng dọc và ngang trong SQL Server
Phân vùng bảng là một khái niệm chung. Có một số kiểu phân vùng hoạt động cho các trường hợp cụ thể. Cơ bản nhất và được sử dụng rộng rãi là hai cách tiếp cận:phân vùng dọc và phân vùng ngang.
Tính chất cụ thể của mỗi loại phản ánh bản chất của một bảng như một cấu trúc bao gồm các cột và hàng:
• Phân vùng theo chiều dọc chia bảng thành các cột.
• Phân vùng ngang chia bảng thành các hàng.
Ví dụ điển hình nhất về phân vùng bảng dọc là bảng các nhân viên với thông tin chi tiết của họ - tên, email, số điện thoại, địa chỉ, ngày sinh, nghề nghiệp, tiền lương và tất cả các thông tin khác có thể cần thiết. Một phần của dữ liệu đó là bí mật. Bên cạnh đó, trong hầu hết các trường hợp, các nhà khai thác chỉ cần một số dữ liệu cơ bản như tên và địa chỉ email.
Phân vùng theo chiều dọc tạo ra một số bảng "hẹp hơn" với dữ liệu cần thiết trong tay. Các truy vấn chỉ nhắm mục tiêu một phần cụ thể. Bằng cách này, các doanh nghiệp giảm tải, đẩy nhanh các nhiệm vụ và đảm bảo rằng dữ liệu bí mật sẽ không bị tiết lộ.
Việc phân vùng bảng theo chiều ngang dẫn đến việc chia một bảng tổng quát thành nhiều bảng nhỏ hơn, trong đó mỗi bảng hạt có cùng số cột, nhưng số hàng ít hơn. Đây là cách tiếp cận tiêu chuẩn cho các bảng có quá nhiều dữ liệu theo thứ tự thời gian.
Ví dụ, một bảng với dữ liệu của cả năm có thể được chia thành các phần nhỏ hơn cho mỗi tháng hoặc mỗi tuần. Sau đó, truy vấn sẽ chỉ liên quan đến một bảng cụ thể nhỏ hơn. Phân vùng theo chiều ngang cải thiện khả năng mở rộng cho các khối lượng dữ liệu với sự tăng trưởng của chúng. Các bảng được phân vùng sẽ vẫn nhỏ hơn và dễ xử lý.
Bất kỳ phân vùng bảng nào trong máy chủ SQL đều nên được xem xét cẩn thận. Đôi khi bạn phải yêu cầu dữ liệu từ một số bảng được phân vùng cùng một lúc và sau đó bạn sẽ cần JOIN trong các truy vấn. Bên cạnh đó, việc phân vùng theo chiều dọc vẫn có thể dẫn đến các bảng lớn và bạn sẽ phải chia chúng nhiều hơn. Trong công việc, bạn nên dựa vào các quyết định cho mục đích kinh doanh cụ thể của mình.
Bây giờ chúng ta đã làm rõ khái niệm về phân vùng bảng trong SQL Server, đã đến lúc tiến hành trình diễn.
Chúng tôi sẽ tránh bất kỳ tập lệnh T-SQL nào và xử lý tất cả các bước phân vùng bảng bằng trình hướng dẫn Phân vùng Máy chủ SQL.
Bạn cần gì để tạo phân vùng cơ sở dữ liệu SQL?
- Cơ sở dữ liệu mẫu WideWorldImporters
- Phiên bản dành cho nhà phát triển SQL Server 2017
Hình ảnh dưới đây cho chúng ta thấy cách thiết kế vách ngăn bàn. Chúng tôi sẽ tạo một phân vùng bảng theo năm và định vị các nhóm tệp khác nhau.
Tại bước này, chúng tôi sẽ tạo hai nhóm tệp (FG_2013, FG_2014). Bấm chuột phải vào cơ sở dữ liệu rồi bấm vào tab Nhóm tệp.
Bây giờ, chúng tôi sẽ kết nối các nhóm tệp với tệp pdf mới.
Cấu trúc lưu trữ cơ sở dữ liệu của chúng tôi đã sẵn sàng để phân vùng bảng. Chúng tôi sẽ tìm bảng mà chúng tôi muốn được phân vùng và khởi động trình hướng dẫn Tạo phân vùng.
Trên ảnh chụp màn hình bên dưới, chúng tôi sẽ chọn một cột mà chúng tôi muốn áp dụng chức năng phân vùng. Cột đã chọn là "Ngày hóa đơn".
Trên hai màn hình tiếp theo, chúng ta sẽ đặt tên cho một hàm phân vùng và một lược đồ phân vùng.
Hàm phân vùng sẽ xác định cách thực hiện phân vùng cho các hàng [Bán hàng]. [Hóa đơn] dựa trên cột Ngày hóa đơn.
Lược đồ phân vùng sẽ xác định bản đồ cho các hàng Bán hàng. Hóa đơn thành các nhóm tệp.
Gán các phân vùng cho các nhóm tệp và thiết lập ranh giới.
Ranh giới Trái / Phải xác định cạnh của mỗi khoảng giá trị biên có thể là trái hoặc phải. Chúng tôi sẽ thiết lập các ranh giới như thế này và nhấp vào Ước tính dung lượng. Tùy chọn này cung cấp cho chúng tôi thông tin về số lượng hàng được đặt trong các ranh giới.
Và cuối cùng, chúng ta sẽ chọn Chạy ngay lập tức rồi bấm Tiếp theo.
Khi thao tác thành công, hãy nhấp vào Đóng.
Như bạn thấy, bảng Sales.Invoices của chúng tôi đã được phân vùng. Truy vấn này sẽ hiển thị chi tiết của bảng được phân vùng.
SELECT
OBJECT_SCHEMA_NAME(pstats.object_id) AS SchemaName
,OBJECT_NAME(pstats.object_id) AS TableName
,ps.name AS PartitionSchemeName
,ds.name AS PartitionFilegroupName
,pf.name AS PartitionFunctionName
,CASE pf.boundary_value_on_right WHEN 0 THEN 'Range Left' ELSE 'Range Right' END AS PartitionFunctionRange
,CASE pf.boundary_value_on_right WHEN 0 THEN 'Upper Boundary' ELSE 'Lower Boundary' END AS PartitionBoundary
,prv.value AS PartitionBoundaryValue
,c.name AS PartitionKey
,CASE
WHEN pf.boundary_value_on_right = 0
THEN c.name + ' > ' + CAST(ISNULL(LAG(prv.value) OVER(PARTITION BY pstats.object_id ORDER BY pstats.object_id, pstats.partition_number), 'Infinity') AS VARCHAR(100)) + ' and ' + c.name + ' <= ' + CAST(ISNULL(prv.value, 'Infinity') AS VARCHAR(100))
ELSE c.name + ' >= ' + CAST(ISNULL(prv.value, 'Infinity') AS VARCHAR(100)) + ' and ' + c.name + ' < ' + CAST(ISNULL(LEAD(prv.value) OVER(PARTITION BY pstats.object_id ORDER BY pstats.object_id, pstats.partition_number), 'Infinity') AS VARCHAR(100))
END AS PartitionRange
,pstats.partition_number AS PartitionNumber
,pstats.row_count AS PartitionRowCount
,p.data_compression_desc AS DataCompression
FROM sys.dm_db_partition_stats AS pstats
INNER JOIN sys.partitions AS p ON pstats.partition_id = p.partition_id
INNER JOIN sys.destination_data_spaces AS dds ON pstats.partition_number = dds.destination_id
INNER JOIN sys.data_spaces AS ds ON dds.data_space_id = ds.data_space_id
INNER JOIN sys.partition_schemes AS ps ON dds.partition_scheme_id = ps.data_space_id
INNER JOIN sys.partition_functions AS pf ON ps.function_id = pf.function_id
INNER JOIN sys.indexes AS i ON pstats.object_id = i.object_id AND pstats.index_id = i.index_id AND dds.partition_scheme_id = i.data_space_id AND i.type <= 1 /* Heap or Clustered Index */
INNER JOIN sys.index_columns AS ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id AND ic.partition_ordinal > 0
INNER JOIN sys.columns AS c ON pstats.object_id = c.object_id AND ic.column_id = c.column_id
LEFT JOIN sys.partition_range_values AS prv ON pf.function_id = prv.function_id AND pstats.partition_number = (CASE pf.boundary_value_on_right WHEN 0 THEN prv.boundary_id ELSE (prv.boundary_id+1) END)
WHERE pstats.object_id = OBJECT_ID('Sales.Invoices')
ORDER BY TableName, PartitionNumber;
MS Hiệu suất phân vùng SQL Server
Chúng tôi sẽ so sánh hiệu suất của bảng được phân vùng và không được phân vùng cho cùng một bảng. Để thực hiện việc này, hãy sử dụng truy vấn dưới đây và kích hoạt Bao gồm kế hoạch thực thi thực tế.
DECLARE @Dt as date = '20131231'
SELECT COUNT(InvoiceDate)
FROM [Sales].[Invoices]
where InvoiceDate < @Dt
Khi chúng tôi kiểm tra kế hoạch thực thi, chúng tôi biết rằng nó bao gồm các thuộc tính "Được phân vùng", "Số lượng phân vùng thực tế" và "Được truy cập phân vùng thực tế".
Thuộc tính được phân vùng cho biết rằng bảng này đã được bật cho phân vùng.
Số lượng phân vùng thực tế thuộc tính là tổng số phân vùng được đọc bởi công cụ SQL Server.
Được truy cập theo phân vùng thực tế thuộc tính là số phân vùng được đánh giá bởi công cụ SQL Server. SQL Server loại bỏ quyền truy cập cho các phân vùng khác vì nó được gọi là loại bỏ phân vùng và đạt được lợi thế về hiệu suất truy vấn.
Bây giờ, hãy xem kế hoạch thực thi bảng không phân vùng.
Sự khác biệt chính giữa hai kế hoạch thực thi này là Số lượng hàng đã đọc vì thuộc tính này cho biết có bao nhiêu hàng được đọc cho truy vấn này. Như bạn có thể thấy từ biểu đồ nén bên dưới, giá trị bảng được phân vùng quá thấp. Vì lý do này, nó sẽ tiêu thụ IO thấp.
Tiếp theo, chạy truy vấn và kiểm tra kế hoạch thực thi.
DECLARE @DtBeg as date = '20140502'
DECLARE @DtEnd as date = '20140701'
SELECT COUNT(InvoiceDate)
FROM [Sales].[Invoices]
where InvoiceDate between @DtBeg and @DtEnd
Báo cáo khóa cấp độ phân vùng
Khóa leo thang là một cơ chế được sử dụng bởi SQL Server Lock Manager. Nó sắp xếp để khóa một cấp độ của các đối tượng. Khi số lượng hàng được khóa tăng lên, trình quản lý khóa sẽ thay đổi đối tượng khóa. Đây là cấp độ phân cấp của khóa leo thang “Hàng -> Trang -> Bảng -> Cơ sở dữ liệu”. Tuy nhiên, trong bảng được phân vùng, chúng ta có thể khóa một phân vùng vì nó tăng tính đồng thời và hiệu suất. Mức báo cáo khóa mặc định là “TABLE” trong SQL Server.
Thực thi truy vấn bằng câu lệnh UPDATE bên dưới.
BEGIN TRAN
DECLARE @Dt as date = '20131221'
UPDATE [Sales].[Invoices] SET CreditNoteReason = 'xxx' where InvoiceDate < @Dt
SP_LOCK
Hộp màu đỏ xác định một khóa độc quyền đảm bảo rằng không thể thực hiện nhiều cập nhật cho cùng một tài nguyên cùng một lúc. Nó xuất hiện trong bảng Hóa đơn.
Bây giờ, chúng tôi sẽ đặt chế độ báo cáo cho bảng Sales.Invoices để tự động hóa bảng này và chạy lại truy vấn.
ALTER TABLE Sales.Invoices SET (LOCK_ESCALATION = AUTO)
Bây giờ, hộp màu đỏ xác định khóa độc quyền thụt lề để bảo vệ các khóa độc quyền được yêu cầu hoặc có được trên một số tài nguyên thấp hơn trong hệ thống phân cấp. Trong thời gian ngắn, mức khóa này cho phép chúng tôi cập nhật hoặc xóa phân vùng bảng khác. Điều đó có nghĩa là chúng ta có thể bắt đầu một bản cập nhật khác hoặc chèn phân vùng khác của bảng.
Trong các bài viết trước, chúng tôi cũng đã khám phá vấn đề chuyển đổi giữa phân vùng bảng và cung cấp hướng dẫn. Thông tin này có thể giúp ích cho bạn nếu bạn giải quyết những trường hợp này. Tham khảo bài viết để biết thêm thông tin.
Tài liệu tham khảo
- Khóa các chế độ
- Bảng và chỉ mục được phân vùng