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

Chuyển phân vùng bảng trong SQL Server:Hướng dẫn

Giới thiệu

Một vài năm trước, chúng tôi được giao nhiệm vụ yêu cầu kinh doanh đối với dữ liệu thẻ ở một định dạng cụ thể cho mục đích gọi là “điều chỉnh”. Ý tưởng là trình bày dữ liệu trong một bảng cho một ứng dụng sẽ sử dụng và xử lý dữ liệu sẽ có thời gian lưu giữ là sáu tháng. Chúng tôi phải tạo một cơ sở dữ liệu mới cho nhu cầu kinh doanh này và sau đó tạo bảng cốt lõi dưới dạng bảng được phân vùng. Quy trình được mô tả ở đây là quy trình chúng tôi sử dụng để đảm bảo rằng dữ liệu cũ hơn sáu tháng được chuyển ra khỏi bảng một cách sạch sẽ.

Một chút về phân vùng

Phân vùng bảng là một công nghệ cơ sở dữ liệu cho phép bạn lưu trữ dữ liệu thuộc về một đơn vị logic (bảng) dưới dạng một tập hợp các phân vùng sẽ nằm trên cấu trúc vật lý riêng biệt - các tệp dữ liệu - thông qua một lớp trừu tượng được gọi là Nhóm tệp trong SQL Server. Quá trình tạo Bảng phân vùng này liên quan đến hai đối tượng chính:

Chức năng phân vùng :Hàm phân vùng xác định cách ánh xạ các hàng của bảng được phân vùng dựa trên các giá trị của một cột cụ thể (Cột phân vùng). Bảng được phân vùng có thể dựa trên danh sách hoặc một phạm vi. Đối với mục đích của trường hợp sử dụng của chúng tôi (chỉ lưu giữ dữ liệu có giá trị trong sáu tháng), chúng tôi đã sử dụng Phân vùng phạm vi . Hàm phân vùng có thể được định nghĩa là RANGE RIGHT hoặc RANGE LEFT. Chúng tôi đã sử dụng RANGE RIGHT như được hiển thị trong mã trong Liệt kê 1 có nghĩa là giá trị biên sẽ thuộc về phía bên phải của khoảng giá trị biên khi các giá trị được sắp xếp theo thứ tự tăng dần từ trái sang phải.

 - Liệt kê 1:Tạo chức năng phân vùngUSE [post_office_history] GOCREATE PARTITION FUNCTIONPostTranPartFunc (datetime) NHƯ CÁC GIÁ TRỊ RANGE RIGHTFOR ('20190201', '20190301', '20190401', '20190501', '20190601', '20190701' ' '20190801', '20190901', '20191001', '20191101', '20191201') ĐI 

Lược đồ phân vùng :Lược đồ phân vùng dựa trên Chức năng phân vùng và xác định hàng cấu trúc vật lý nào thuộc mỗi phân vùng sẽ được đặt. Điều này đạt được bằng cách ánh xạ các hàng như vậy thành các nhóm tệp. Liệt kê 2 cho thấy mã để tạo một Lược đồ phân vùng. Trước khi tạo Sơ đồ phân vùng, các nhóm tệp mà nó sẽ tham chiếu đến phải tồn tại.

 - Liệt kê 2:Tạo Lược đồ Phân vùng ---- Bước 1:Tạo Nhóm tệp --USE [master] GOALTER DATABASE [post_office_history] THÊM FILEGROUP [JAN] ALTER DATABASE [post_office_history] THÊM FILEGROUP [FEB] ALTER DATABASE [post_office_history ] THÊM FILEGROUP [THÁNG 3] ALTER DATABASE [post_office_history] THÊM FILEGROUP [APR] ALTER DATABASE [post_office_history] THÊM FILEGROUP [MAY] ALTER DATABASE [post_office_history] ADD FILEGROUP [APR] ALTER DATABASE [JUNory] ALTER DATABASE [ALUP] post_hist DATABASE [ALUP] ] THÊM FILEGROUP [AUG] ALTER DATABASE [post_office_history] THÊM FILEGROUP [SEP] ALTER DATABASE [post_office_history] THÊM FILEGROUP [OCT] ALTER DATABASE [post_office_history] ADD FILEGROUP [SEP] ALTER DATABASE [post_office_history] THÊM FILEGROUP [OCT] ALTER DATABASE [post_office_history] ADD FILEGROUP [NOV] ALTER DATABASE 2:Thêm tệp dữ liệu vào từng nhóm tệp --USE [master] GOALTER DATABASE [post_office_history] THÊM TẬP TIN (NAME =N'post_office_history_part_01 ', FILENAME =N'E:\ MSSQL \ DATA \ post_office_history_part_01.ndf', SIZE =2097LEGROWTH, FI97LEGROWB=1048576KB) ĐẾN FILEGROUP [JAN] CƠ SỞ DỮ LIỆU THÊM [post_office_history] THÊM TẬP TIN (NAME =N'post_office_history_part_02 ', FILENAME =N'E:\ MSSQL \ DATA \ post_office_history_part_02.ndUPf', SIZEKB =2097155 FIGRO76 FEB] ALTER DATABASE [post_office_history] THÊM TỆP (NAME =N'post_office_history_part_03 ', FILENAME =N'E:\ MSSQL \ DATA \ post_office_history_part_03.ndf', SIZE =2097152 ALKB, FILEGROW76_Sau khi đăng ký =1048577 ] THÊM TẬP TIN (NAME =N'post_office_history_part_04 ', FILENAME =N'E:\ MSSQL \ DATA \ post_office_history_part_04.ndf', SIZE =2097152KB, FILEGROWTH =1048576KB) TO FILEGROUP [APR] N'post_office_history_part_05 ', FILENAME =N'E:\ MSSQL \ DATA \ post_office_history_part_05.ndf', SIZE =2097152KB, FILEGROWTH =1048576KB) TO FILEGROUP [MAY] ALTER DATABASE_ post_office_06 =N'G:\ MSSQL \ DATA \ post_office_history_part_06. ndf ', SIZE =2097152KB, FILEGROWTH =1048576KB) ĐẾN FILEGROUP [JUN] ALTER DATABASE [post_office_history] THÊM FILE (NAME =N'post_office_history_part_07', FILENAME =N'G:\ post_9715 'SIZE2BZE , FILEGROWTH =1048576KB) VÀO FILEGROUP [THÁNG 7] CƠ SỞ DỮ LIỆU THÊM [post_office_history] THÊM FILE (NAME =N'post_office_history_part_08 ', FILENAME =N'G:\ MSSQL \ DATA \ post_office_history =1097 '152KBnd76 FILEGROUP [AUG] ALTER DATABASE [post_office_history] THÊM TỆP (NAME =N'post_office_history_part_09 ', FILENAME =N'G:\ MSSQL \ DATA \ post_office_history_part_09.ndf', SIZE =2097152KB, DỮ LIỆU [FILEGAB76] [post_office_history] THÊM TỆP (NAME =N'post_office_history_part_10 ', FILENAME =N'G:\ MSSQL \ DATA \ post_office_history_part_10.ndf', SIZE =2097152KB, FILEGROWTH =1048576KB post_SỐ LỆNH] QUẢN LÝ NAME =N'post_office_history_part_09 ', FILENAME =N'G:\ MS SQL \ DATA \ post_office_history_part_11.ndf ', SIZE =2097152KB, FILEGROWTH =1048576KB) ĐẾN FILEGROUP [NOV] ALTER DATABASE [post_office_history] ADD FILE (NAME =N'post_office_history_part_. ndf ', SIZE =2097152KB, FILEGROWTH =1048576KB) ĐỂ FILEGROUP [DEC] ĐI-- Bước 3:Tạo Lược đồ phân vùng --PRINT' tạo lược đồ phân vùng ... 'GOUSE [post_office_history] LỊCH TRÌNH PHẦN GOCREATE PostTranPartSch AS PARTITION PostTranPartFunc TO (JANPartFunc TO) , THÁNG 2, THÁNG 3, THÁNG 4, THÁNG 5, THÁNG 6, THÁNG 7, THÁNG 8, SEP, THÁNG 10, THÁNG 11, DEC) ĐI 

Lưu ý rằng đối với N phân vùng, sẽ luôn có N-1 ranh giới. Cần phải cẩn thận khi xác định Nhóm tệp đầu tiên trong Sơ đồ phân vùng. Ranh giới đầu tiên được liệt kê trong Hàm phân vùng sẽ nằm giữa Nhóm tệp thứ nhất và thứ hai, do đó giá trị ranh giới này (20190201) sẽ nằm trong phân vùng thứ hai (FEB). Ngoài ra, thực sự có thể đặt tất cả phân vùng trong một nhóm tệp duy nhất nhưng chúng tôi đã chọn các nhóm tệp riêng biệt trong trường hợp này.

Bẩn thỉu bàn tay của chúng ta

Vì vậy, hãy đi sâu vào nhiệm vụ chuyển đổi các phân vùng!

Điều đầu tiên chúng ta cần làm là xác định chính xác cách dữ liệu của chúng ta được phân phối giữa các phân vùng để chúng ta có thể biết mình muốn chuyển sang phân vùng nào. Thông thường, chúng tôi sẽ chuyển sang phân vùng cũ nhất.

 - Liệt kê 3:Kiểm tra phân phối dữ liệu trong các phân vùng --USE POST_OFFICE_HISTORYGOSELECT $ PARTITION.POSTTRANPARTFUNC (DATETIME_TRAN_LOCAL) AS [PARTITION NUMBER], MIN (DATETIME_TRAN_LOCAL) AS [MIN DATE], MAX (DATETIME_TRAN_LATEAL), AS [MAX (DATETIME_TRAN_LATE]) ĐẾM (*) NHƯ [ROWS IN PARTITION] TỪ DBO.POST_TRAN_TAB - BẢNG GÓP ĐƯỢC ĐỐI TÁC BỞI $ PARTITION.POSTTRANPARTFUNC (DATETIME_TRAN_LOCAL) ĐƠN HÀNG THEO [PARTITION NUMBER] ĐI 

Hình 1 Đầu ra của Liệt kê 3

Hình 1 cho chúng ta thấy kết quả đầu ra của truy vấn trong Liệt kê 3. Phân vùng cũ nhất là Phân vùng 2 chứa các hàng từ năm 2017. Chúng tôi xác minh điều này với truy vấn trong Liệt kê 4. Liệt kê 4 cũng cho chúng ta thấy Nhóm tệp nào chứa dữ liệu trong Phân vùng 2.

 - Liệt kê 4:Kiểm tra Nhóm tệp được liên kết với phân vùng --USE POST_OFFICE_HISTORYGOSELECT PS.NAME AS PSNAME, DDS.DESTINATION_ID AS PARTITIONNUMBER, FG.NAME AS FILEGROUPNAMEFROM (((CÁC BIỂU TƯỢNG NHƯ T INNER THAM GIA SYS.INDEXES AS ON (T.OBJECT_ID =I.OBJECT_ID)) INNER JOIN SYS.PARTITION_SCHEMES AS PS ON (I.DATA_SPACE_ID =PS.DATA_SPACE_ID)) INNER JOIN SYS.DESTINATION_DATA_SPACES AS DDS ON (PS.DATA_SPACE_ID =DDS.PARTITION_SCHEME_ID SYS) INNER JOIN. FILEGROUPS NHƯ FG TRÊN DDS.DATA_SPACE_ID =FG.DATA_SPACE_IDWHERE (T.NAME ='POST_TRAN_TAB') VÀ (I.INDEX_ID IN (0,1)) VÀ DDS.DESTINATION_ID =$ PARTITION.POSTTRANPARTFUNC ('20171108'); 

Hình 1 Đầu ra của Liệt kê 3

Hình 2 Đầu ra của Liệt kê 4

Liệt kê 4 cho chúng ta thấy rằng nhóm tệp được liên kết với Phân vùng 2 là NOV . Để chuyển sang Phân vùng 2, chúng ta cần một bảng lịch sử là một bản sao của bảng trực tiếp nhưng nằm trên cùng một nhóm tệp với phân vùng mà chúng ta định chuyển ra. Vì chúng ta đã có bảng này, tất cả những gì chúng ta cần là tạo lại nó trên Nhóm tệp mong muốn. Bạn cũng cần tạo lại chỉ mục được phân nhóm. Hãy lưu ý rằng chỉ mục được phân nhóm này có cùng định nghĩa với chỉ mục được phân nhóm trên bảng post_tran_tab và cũng nằm trên cùng một nhóm tệp với post_tran_tab_hist bảng.

 - Liệt kê 5:Tạo lại Bảng Lịch sử - Tạo lại Bảng Lịch sử --USE [post_office_history] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGODROP TABLE [dbo]. [post_tran_tab_hist] GOCREATE TABLE [dbo] post_tran_tab_hist] ([tran_nr] [bigint] NOT NULL, [tran_type] [char] (2) NULL, [tran_reversed] [char] (2) NULL, [batch_nr] [int] NULL, [message_type] [char] (4 ) NULL, [source_node_name] [varchar] (12) NULL, [system_trace_audit_nr] [char] (6) NULL, [Payment_currency_code] [char] (3) NULL, [chìm_node_name] [varchar] (30) NULL, [chìm_node_currency_code] [char] (3) NULL, [to_account_id] [varchar] (30) NULL, [pan] [varchar] (19) NOT NULL, [pan_encrypted] [char] (18) NULL, [pan_reference] [char] (70 ) NULL, [datetime_tran_local] [datetime] NOT NULL, [tran_amount_req] [float] NOT NULL, [tran_amount_rsp] [float] NOT NULL, [tran_cash_req] [float] NOT NULL, [tran_cash_rsp] [float] NOT NULL, [datetime_tran_gmt ] [char] (10) NULL, [merchant_type] [char] (4) NULL, [pos_entry_mode] [char] (3) NULL, [pos_condition_code] [char] (2) NULL, [acquiring_inst_id_code] [varchar] (11) NULL, [query_reference_nr] [char] (12) NULL, [auth_id_rsp] [char] (6) NULL, [ rsp_code_rsp] [char] (2) NULL, [service_restrict_code] [char] (3) NULL, [terminal_id] [char] (8) NULL, [terminal_owner] [varchar] (25) NULL, [card_acceptor_id_code] [char] ( 15) NULL, [card_acceptor_name_loc] [char] (40) NULL, [from_account_id] [varchar] (28) NULL, [auth_reason] [char] (1) NULL, [auth_type] [char] (1) NULL, [message_reason_code ] [char] (4) NULL, [datetime_req] [datetime] NULL, [datetime_rsp] [datetime] NULL, [from_account_type] [char] (2) NULL, [to_account_type] [char] (2) NULL, [insert_date] [datetime] NOT NULL, [tran_postilion_originated] [int] NOT NULL, [card_product] [varchar] (20) NULL, [card_seq_nr] [char] (3) NULL, [deadline_date] [char] (4) NULL, [srcnode_cash_approved ] [float] NOT NULL, [tran_completed] [char] (2) NULL) ON [NOV] GOSET ANSI_PADDING OFFGO-- Tạo lại Chỉ mục theo cụm --USE [post_office_history] ĐI TẠO CHỈ SỐ ĐÃ ĐÓNG CỬA [IX_Datetime_Local] BẬT [dbo]. [Post_tran_tab_hist] ([datetime_tran_local] ASC, [tran_nr] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB =OFF, IGN_EXISTING, OFFLINE =OFF, IGN_EXISTING, OFFLINE =OFF, IGN =OFFLINE , ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [NOV] GO 

Chuyển sang phân vùng cuối cùng bây giờ là lệnh một dòng. Việc đếm cả hai bảng trước và sau khi thực hiện lệnh một dòng này sẽ đảm bảo rằng chúng ta có tất cả dữ liệu mong muốn.

Hình 3 Bảng post_tran_tab_hist nằm trên Nhóm tệp NOV

 - Liệt kê 6:Chuyển sang phân vùng cuối cùngSELECT COUNT (*) FROM 'POST_TRAN_TAB'; SELECT COUNT (*) FROM 'POST_TRAN_TAB_HIST'; SỬ DỤNG [POST_OFFICE_HISTORY] BẢNG MỤC TIÊU POST_TRAN_TAB CHUYỂN ĐỔI PHẦN 2 ĐỂ POST_TRAN_TAB_HISTGOS ' POST_TRAN_TAB '; CHỌN COUNT (*) TỪ' POST_TRAN_TAB_HIST '; 

Vì chúng tôi đã chuyển sang phân vùng cuối cùng, chúng tôi không cần ranh giới nữa. Chúng tôi hợp nhất hai phạm vi trước đó được chia theo ranh giới đó bằng cách sử dụng lệnh trong Liệt kê 7. Chúng tôi tiếp tục cắt bớt bảng lịch sử như được hiển thị trong Liệt kê 8. Chúng tôi đang làm điều này bởi vì đây là toàn bộ điểm:xóa dữ liệu cũ mà chúng tôi không còn cần nữa.

 - Liệt kê 7:Hợp nhất phạm vi phân vùng-- Hợp nhất phạm viUSE [POST_OFFICE_HISTORY] GOALTER PARTITION FUNCTION POSTTRANPARTFUNC () MERGE RANGE ('20171101'); - Xác nhận phạm vi được hợp nhất [POST_OFFICE_HISTORY] GOSELECT * TỪ SYS.PARTAL_RESANGE> 

Hình 4 Hợp nhất ranh giới

 - Liệt kê 8:Cắt bớt Bảng Lịch sửUSE [post_office_history] GOTRUNCATE TABLE post_tran_tab_hist; ĐI 

Hình. 5 Số hàng cho cả hai bảng trước khi cắt ngắn

Hãy lưu ý rằng số hàng trong bảng lịch sử giống hệt với số hàng trước đó trong Phân vùng 2 như được hiển thị trong Hình 1. Bạn cũng có thể đi xa hơn bằng cách khôi phục không gian trống trong nhóm tệp thuộc phần cuối cùng. vách ngăn. Điều này sẽ hữu ích nếu bạn cần không gian này cho dữ liệu mới sẽ nằm trên phân vùng trước đó. Bước này có thể không cần thiết nếu bạn cảm thấy mình có nhiều không gian trong môi trường của mình.

 - Liệt kê 9:Khôi phục dung lượng trên hệ điều hành - Xác định rằng tệp đã bị dọn sạchUSE [post_office_history] GOSELECT DF.FILE_ID, DF.NAME, DF.PHYSICAL_NAME, DS.NAME, DS.TYPE, DF.STATE_DESC TỪ SYS .DATABASE_FILES DFJOIN SYS.DATA_SPACES DS TRÊN DF.DATA_SPACE_ID =DS.DATA_SPACE_ID; 

Hình 7 Tệp sang ánh xạ nhóm tệp

 - Thu nhỏ tệp xuống 2GBUSE [post_office_history] GODBCC SHRINKFILE (N'post_office_history_part_11 ', 2048) ĐI-- Từ hệ điều hành xác nhận dung lượng trống trên đĩaSELECT DISTINCT DB_NAME (S.DATABASE_ID) AS DATABASE_NAME, S.DATABASE_ID, S. VOLUME_MOUNT_POINT--, S.VOLUME_ID, S.LOGICAL_VOLUME_NAME, S.FILE_SYSTEM_TYPE, S.TOTAL_BYTES / 1024/1024/1024 AS [TOTAL_SIZE (GB)], S.AVAILABLE_BYTES / 1024/1024/1024 AS [FREE_SPACE (GB)], LEFT ((ROUND (((S.AVAILABLE_BYTES * 1.0) /S.TOTAL_BYTES), 4) * 100), 4) NHƯ PERCENT_FREEFROM SYS.MASTER_FILES NHƯ FCROSS ÁP DỤNG SYS.DM_OS_VOLUME_STATS (F.DATABASE_ID, F.FILE DB_NAME) NHƯ SWHERE (S.DATABASE_ID) ='POST_OFFICE_HISTORY'; 

Hình 8 Dung lượng trống trên Hệ điều hành

Kết luận

Trong bài viết này, chúng tôi đã giới thiệu cho các bạn về quy trình chuyển đổi các phân vùng từ một bảng được phân vùng. Đây là một cách rất hiệu quả để quản lý tăng trưởng dữ liệu nguyên bản trong SQL Server. Các công nghệ tiên tiến hơn như Cơ sở dữ liệu kéo dài có sẵn trong các phiên bản SQL Server hiện tại.

Tài liệu tham khảo

Isakov, V. (2018). Bài kiểm tra tham khảo 70-764 Quản trị cơ sở hạ tầng cơ sở dữ liệu SQL. Giáo dục Pearson

Bảng và chỉ mục được phân vùng trong SQL Server


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ảnh chụp nhanh cơ sở dữ liệu SQL Server -2

  2. Mệnh đề WHERE IS NULL, IS NOT NULL hoặc NO WHERE tùy thuộc vào giá trị tham số SQL Server

  3. Xuất dữ liệu truy vấn SQL sang Excel

  4. Xóa SCHEMABINDING khỏi một hàm do người dùng xác định trong SQL Server

  5. Chuyển đổi một tập hợp các hàng thành các cột trong SQL Server 2000