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

Phân vùng ngân sách

Năm ngoái, tôi đã trình bày một giải pháp để mô phỏng các tạp chí thứ hai có thể đọc được của Nhóm Khả dụng mà không cần đầu tư vào Phiên bản Doanh nghiệp. Không phải để ngăn mọi người mua Phiên bản Doanh nghiệp, vì có rất nhiều lợi ích bên ngoài AG, nhưng còn hơn thế nữa đối với những người không có cơ hội mua Phiên bản Doanh nghiệp ngay từ đầu:

  • Sách thứ hai có thể đọc được trên ngân sách

Tôi cố gắng trở thành một người ủng hộ không ngừng cho khách hàng Standard Edition; nó gần như là một trò đùa đang chạy rằng chắc chắn - với số lượng tính năng mà nó có trong mỗi bản phát hành mới - toàn bộ phiên bản đó đang trên con đường ngừng sử dụng. Trong các cuộc họp riêng với Microsoft, tôi đã thúc đẩy các tính năng cũng được đưa vào Standard Edition, đặc biệt là với các tính năng có lợi hơn nhiều cho các doanh nghiệp nhỏ so với các tính năng có ngân sách phần cứng không giới hạn.

Khách hàng của Enterprise Edition được hưởng các lợi ích về khả năng quản lý và hiệu suất do phân vùng bảng mang lại, nhưng tính năng này không có sẵn trong Standard Edition. Gần đây tôi nảy ra một ý tưởng rằng có một cách để đạt được ít nhất một số ưu điểm của phân vùng trên bất kỳ ấn bản nào và nó không liên quan đến các chế độ xem được phân vùng. Điều này không có nghĩa là các khung nhìn được phân vùng không phải là một lựa chọn khả thi đáng xem xét; chúng được mô tả tốt bởi những người khác, bao gồm Daniel Hutmacher (Chế độ xem được phân vùng so với phân vùng bảng) và Kimberly Tripp (Bảng phân vùng v. Chế độ xem được phân vùng – Tại sao chúng vẫn còn xung quanh?). Ý tưởng của tôi chỉ đơn giản hơn một chút để thực hiện.

Người hùng mới của bạn:Chỉ mục được lọc

Bây giờ, tôi biết, tính năng này là một từ gồm bốn chữ cái đối với một số người; trước khi tiếp tục, bạn nên hài lòng với các chỉ mục đã lọc, hoặc ít nhất là nhận thức được những hạn chế của chúng. Một số bài đọc để cung cấp cho bạn một số cân bằng hợp lý trước khi tôi cố gắng bán cho bạn trên chúng:

  • Tôi nói về một số thiếu sót trong Cách các chỉ mục được lọc có thể là một tính năng mạnh mẽ hơn và chỉ ra nhiều mục Kết nối để bạn bình chọn;
  • Paul White (@SQL_Kiwi) nói về các vấn đề điều chỉnh trong Hạn chế của Trình tối ưu hóa với Chỉ mục được Lọc và cả về Tác dụng phụ không mong muốn của việc Thêm Chỉ mục được Lọc; và,
  • Jes Borland (@grrl_geek) cho chúng tôi biết Bạn có thể (và không thể) làm gì với các chỉ mục đã lọc.

Đọc tất cả những cái đó? Và bạn vẫn ở đây? Tuyệt vời.

TL; DR của điều này là bạn có thể sử dụng các chỉ mục đã lọc để giữ tất cả "dữ liệu nóng" của mình trong một cấu trúc vật lý riêng biệt và thậm chí trên phần cứng cơ bản riêng biệt (bạn có thể có sẵn ổ SSD hoặc ổ PCIe nhanh, nhưng nó có thể ' t giữ toàn bộ bảng).

Một ví dụ nhanh

Có nhiều trường hợp sử dụng trong đó một phần dữ liệu được truy vấn thường xuyên hơn nhiều so với phần còn lại - hãy nghĩ đến việc một cửa hàng bán lẻ quản lý đơn đặt hàng, một tiệm bánh lên lịch giao bánh cưới hoặc một sân vận động bóng đá đo lường dữ liệu tham dự và giảm giá. Trong những trường hợp này, hầu hết hoặc tất cả hoạt động truy vấn hàng ngày liên quan đến dữ liệu "hiện tại".

Hãy giữ nó đơn giản; chúng tôi sẽ tạo một cơ sở dữ liệu với một bảng Đơn hàng rất hẹp:

 TẠO CƠ SỞ DỮ LIỆU PoorManPartition; ĐI SỬ DỤNG PoorManPartition; ĐI TẠO BẢNG Dbo.Orders (OrderID INT IDENTITY (1,1) PRIMARY KEY, OrderDate DATE NOT NULL DEFAULT SYSUTCDATETIME (), OrderTotal DECIMAL (8,2) -, .. .các cột khác ...); 

Bây giờ, giả sử bạn có đủ dung lượng trên bộ nhớ nhanh của mình để lưu giữ dữ liệu trong một tháng (với nhiều khoảng trống để tính đến tính thời vụ và tăng trưởng trong tương lai). Chúng tôi có thể thêm một nhóm tệp mới và đặt một tệp dữ liệu vào ổ đĩa nhanh.

 ALTER DATABASE PoorManPartition THÊM FILEGROUP HotData; ĐI ALTER DATABASE PoorManPartition ADD FILE (Name =N'HotData ', FileName =N'Z:\ folder \ HotData.mdf', Size =100MB, FileGrowth =25MB) TO FILEGROUP HotData; 

Bây giờ, hãy tạo chỉ mục được lọc trên nhóm tệp HotData của chúng tôi, nơi bộ lọc bao gồm mọi thứ từ đầu tháng 11 năm 2015 và các cột phổ biến liên quan đến truy vấn dựa trên thời gian nằm trong danh sách khóa hoặc bao gồm:

 TẠO INDEX FilteredIndex TRÊN dbo.Orders (OrderDate) BAO GỒM (OrderTotal) WHERE OrderDate> ='20151101' AND OrderDate <'20151201' TRÊN HotData; 

Chúng ta có thể chèn một vài hàng và kiểm tra kế hoạch thực thi để đảm bảo rằng trên thực tế, các truy vấn được bao phủ có thể sử dụng chỉ mục:

 CHÈN dbo.Orders (OrderDate) VALUES ('20151001'), ('20151103'), ('20151127'); ĐI CHỌN index_id, hàng TỪ sys.partitions WHERE object_id =OBJECT_ID (N'dbo.Orders '); / * Kết quả:index_id lines -------- ---- 1 3 2 2 * / SELECT OrderID, OrderDate, OrderTotal FROM dbo.Orders WHERE OrderDate> ='20151102' AND OrderDate <'20151106';  

Kế hoạch thực thi kết quả, chắc chắn, sử dụng chỉ mục được lọc (ngay cả khi vị từ bộ lọc trong truy vấn không khớp chính xác với định nghĩa chỉ mục):

Bây giờ, ngày 1 tháng 12 đã đến và đã đến lúc hoán đổi dữ liệu tháng 11 của chúng tôi và thay thế dữ liệu đó bằng tháng 12. Chúng tôi chỉ có thể tạo lại chỉ mục đã lọc bằng một vị từ bộ lọc mới và sử dụng DROP_EXISTING tùy chọn:

 TẠO INDEX FilteredIndex TRÊN dbo.Orders (OrderDate) BAO GỒM (OrderTotal) WHERE OrderDate> ='20151201' AND OrderDate <'20160101' WITH (DROP_EXISTING =ON) ON HotData; 

Bây giờ, chúng ta có thể thêm một vài hàng nữa, kiểm tra thống kê phân vùng và chạy truy vấn trước đó và một truy vấn mới để kiểm tra các chỉ mục được sử dụng:

 CHÈN dbo.Orders (OrderDate) VALUES ('20151202'), ('20151205'); ĐI CHỌN index_id, hàng TỪ sys.partitions WHERE object_id =OBJECT_ID (N'dbo.Orders '); / * Kết quả:index_id lines -------- ---- 1 5 2 2 * / SELECT OrderID, OrderDate, OrderTotal FROM dbo.Orders WHERE OrderDate> ='20151102' AND OrderDate <'20151106'; CHỌN ID Order, OrderDate, OrderTotal TỪ dbo.Orders WHERE OrderDate> ='20151202' AND OrderDate <'20151204'; 

Trong trường hợp này, chúng tôi nhận được bản quét chỉ mục theo nhóm với truy vấn tháng 11:

(Nhưng điều đó sẽ khác nếu chúng ta có một chỉ mục riêng biệt, không được lọc với OrderDate làm khóa.)

Và tôi sẽ không hiển thị lại nó, nhưng với truy vấn tháng 12, chúng tôi nhận được tìm kiếm chỉ mục được lọc giống như trước đây.

Bạn cũng có thể duy trì nhiều chỉ mục, một chỉ mục cho tháng hiện tại, một chỉ mục cho tháng trước, v.v. và bạn chỉ có thể quản lý chúng một cách riêng biệt (ví dụ:vào ngày 1 tháng 12, bạn chỉ bỏ chỉ mục từ tháng 10 và để lại chỉ mục của tháng 11) . Bạn cũng có thể duy trì nhiều chỉ mục trong khoảng thời gian ngắn hơn hoặc dài hơn (hiện tại và tuần trước, hiện tại và quý trước), v.v. Giải pháp này khá linh hoạt.

Do những hạn chế của các chỉ mục được lọc, tôi sẽ không cố gắng đẩy đây là một giải pháp hoàn hảo, cũng không phải là một sự thay thế hoàn toàn cho các chế độ xem phân vùng bảng hoặc phân vùng. Ví dụ:chuyển phân vùng ra ngoài là một thao tác siêu dữ liệu, trong khi tạo lại chỉ mục với DROP_EXISTING có thể có nhiều lần ghi nhật ký (và vì bạn không sử dụng Phiên bản Doanh nghiệp, nên không thể chạy trực tuyến). Bạn cũng có thể thấy rằng các chế độ xem được phân vùng sẽ nhanh hơn - cần nhiều công việc hơn để duy trì các bảng vật lý riêng biệt và các ràng buộc làm cho chế độ xem được phân vùng có thể thực hiện được, nhưng lợi nhuận về mặt hiệu suất truy vấn có thể tốt hơn trong một số trường hợp.

Tự động hóa

Hành động tạo lại chỉ mục có thể được tự động hóa khá dễ dàng bằng cách sử dụng một công việc đơn giản như thế này mỗi tháng một lần (hoặc bất kỳ kích thước cửa sổ "hot" nào của bạn):

 DECLARE @sql NVARCHAR (MAX), @dt DATE =DATEADD (DAY, 1-DAY (GETDATE ()), GETDATE ()); SET @sql =N'CREATE INDEX FilteredIndex ON dbo.Orders (OrderDate) BAO GỒM (OrderTotal) WHERE OrderDate> ='' '+ CONVERT (CHAR (8), @dt, 112) + N' '' WITH (DROP_EXISTING =ON ) BẬT HotData; '; EXEC PoorManPartition.sys.sp_executesql @sql; 

Bạn cũng có thể tạo nhiều chỉ mục trước nhiều tháng, giống như tạo trước các phân vùng trong tương lai - sau cùng, các chỉ mục trong tương lai sẽ không chiếm bất kỳ dung lượng nào cho đến khi có dữ liệu liên quan đến các vị từ của chúng. Và bạn chỉ có thể loại bỏ các chỉ mục đang phân đoạn dữ liệu cũ hơn mà bây giờ bạn muốn không còn nữa.

Nhận thức rõ ràng

Tất nhiên, sau khi tôi hoàn thành bài viết này, tôi đã bắt gặp một bài viết khác của Kimberly Tripp mà bạn nên đọc trước khi tiếp tục với bất cứ điều gì tôi đang ủng hộ ở đây (và tôi đã đọc trước khi bắt đầu):

  • Làm thế nào về Chỉ mục được lọc thay vì Phân vùng?

Vì nhiều lý do, Kimberly ủng hộ nhiều hơn các dạng xem được phân vùng để triển khai một cái gì đó tương tự như phân vùng trong Standard Edition; tuy nhiên, đối với một số trường hợp nhất định, việc sử dụng các chỉ mục đã lọc vẫn khiến tôi đủ tò mò để tiếp tục thử nghiệm của mình. Một trong những lĩnh vực mà các chỉ mục được lọc có thể có lợi là khi dữ liệu "nóng" của bạn có nhiều tiêu chí - không chỉ theo ngày mà còn theo các thuộc tính khác (có thể bạn muốn truy vấn nhanh đối với tất cả các đơn đặt hàng từ tháng này dành cho một cấp cụ thể của khách hàng hoặc cao hơn một số tiền nhất định).

Tiếp theo…

Trong một bài đăng trong tương lai, tôi sẽ chơi với khái niệm này trên một hệ thống cao cấp hơn, với một số khối lượng và khối lượng công việc trong thế giới thực. Tôi muốn khám phá sự khác biệt về hiệu suất giữa giải pháp này, chỉ mục bao phủ không được lọc, chế độ xem được phân vùng và bảng được phân vùng. Bên trong máy ảo trên máy tính xách tay chỉ có sẵn SSD có thể sẽ không mang lại các thử nghiệm thực tế hoặc công bằng trên quy mô lớ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. Cách tìm giá trị trung bình của một cột số trong SQL

  2. Mức cô lập đọc lặp lại

  3. Hiểu đối chiếu cấp độ cơ sở dữ liệu và tác động của việc thay đổi nó cho một cơ sở dữ liệu

  4. Mô hình Cơ sở dữ liệu cho Khảo sát Trực tuyến. Phần 3

  5. Hướng dẫn cơ bản của bạn để tham gia SQL:CROSS JOIN - Phần 3