Đây là bài viết thứ hai trong loạt bài viết về SQL Server In-Memory OLTP.
Bài viết giới thiệu - SQL Server In-Memory OLTP, đã giới thiệu ngắn gọn các khái niệm cơ bản về công cụ Hekaton mới. Trong phần này, chúng ta sẽ tập trung vào thực hành. Để cụ thể hơn, chúng ta sẽ xem cách tạo cơ sở dữ liệu và bảng được tối ưu hóa trong bộ nhớ, cũng như cách đánh giá chúng với sự trợ giúp của T-SQL.
Điều kiện tiên quyết để bắt đầu sử dụng cơ sở dữ liệu được tối ưu hóa cho bộ nhớ
OLTP trong bộ nhớ được tự động cài đặt với phiên bản Doanh nghiệp hoặc Nhà phát triển 64 bit của SQL Server 2014 hoặc SQL Server 2016. Phiên bản SQL Server 32 bit không cung cấp các thành phần OLTP trong bộ nhớ.
Do đó, nếu bạn đã cài đặt phiên bản SQL Server dành cho nhà phát triển 64 bit trên máy tính của mình, bạn có thể bắt đầu tạo cơ sở dữ liệu và cấu trúc dữ liệu để lưu trữ dữ liệu được tối ưu hóa bộ nhớ mà không cần thiết lập bổ sung.
Mỗi cơ sở dữ liệu sẽ chứa các bảng được tối ưu hóa bộ nhớ phải chứa một nhóm tệp MEMORY_OPTIMIZED_DATA. Nhóm tệp này chứa một hoặc một số vùng chứa. Mỗi vùng chứa đều lưu trữ dữ liệu và / hoặc tệp delta. SQL Server sử dụng các tệp này để khôi phục các bảng được tối ưu hóa bộ nhớ. Các vùng chứa có thể được đặt trên các mảng đĩa khác nhau,
tương tự như các nhóm tệp FILESTREAM.
Cú pháp để tạo nhóm tệp được tối ưu hóa bộ nhớ gần giống như đối với nhóm tệp FILESTREAM truyền thống, với một số điểm khác biệt:
- Chỉ có thể tạo một nhóm tệp được tối ưu hóa bộ nhớ cho cơ sở dữ liệu.
- Tùy chọn CONTAINS MEMORY_OPTIMIZED_DATA phải được chỉ định rõ ràng.
Bạn có thể tạo nhóm tệp trong quá trình tạo cơ sở dữ liệu:
CREATE DATABASE InMemoryDemo ON PRIMARY ( NAME = N'InMemoryDemo', FILENAME = N'D:\Data\InMemoryOLTPDemo.mdf' ), FILEGROUP IMOFG CONTAINS MEMORY_OPTIMIZED_DATA ( NAME = N'InMemoryDemo_Data', FILENAME = N'D:\IMOFG\InMemoryDemo_Data.mdf' )
Ngoài ra, bạn có thể thêm nhóm tệp MEMORY_OPTIMIZED_DATA vào cơ sở dữ liệu hiện có, sau đó thêm tệp vào nhóm tệp đó.
-- Adding the containers ALTER DATABASE DemoDB ADD FILE ( NAME = 'DemoDB_Mod', FILENAME = 'D:\Data\DemoDB_Mod' ) TO FILEGROUP DemoDB_Mod
Bên trong, OLTP trong bộ nhớ sử dụng cơ chế phát trực tuyến dựa trên công nghệ FILESTREAM, được điều chỉnh tốt cho truy cập I / O tuần tự.
Tạo bảng tối ưu hóa bộ nhớ
Bây giờ, chúng tôi có mọi thứ chúng tôi cần để bắt đầu tạo các đối tượng Tối ưu hóa bộ nhớ. Hãy tạo một bảng Tối ưu hóa bộ nhớ.
Cú pháp để tạo bảng được tối ưu hóa trong bộ nhớ rất giống với cú pháp để tạo bảng dựa trên đĩa. Tuy nhiên, có một số tiện ích mở rộng và hạn chế:
- Mệnh đề MEMORY_OPTIMIZED =ON xác định một bảng là được tối ưu hóa trong bộ nhớ.
- Các bảng được tối ưu hóa trong bộ nhớ không hỗ trợ tất cả các kiểu dữ liệu mà bảng truyền thống hỗ trợ. Các loại dữ liệu sau không được hỗ trợ:
- datetimeoffset
- địa lý
- hình học
- phân cấp
- lộn xộn
- XML
- sql_variant
- Các loại do người dùng xác định
Có thể tạo bảng tối ưu hóa bộ nhớ với các giá trị độ bền sau:SCHEMA_AND_DATA hoặc SCHEMA_ONLY. SCHEMA_AND_DATA là giá trị mặc định.
Trong trường hợp bạn chỉ định SCHEMA_ONLY, tất cả các thay đổi đối với bảng sẽ không được ghi lại và dữ liệu bảng không được lưu trữ trên đĩa.
Mỗi bảng được tối ưu hóa bộ nhớ phải chứa ít nhất một chỉ mục. Lưu ý rằng ràng buộc PRIMARY KEY mặc nhiên tạo ra một chỉ mục. Một bảng được tối ưu hóa cho bộ nhớ lâu bền luôn yêu cầu ràng buộc KHÓA CHÍNH.
CREATE TABLE dbo.Person ( [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED ,[City] VARCHAR(32) NULL ,[Country] VARCHAR(32) NULL ,[State_Province] VARCHAR(32) NULL ,[LastModified] DATETIME NOT NULL ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
Сcác chỉ mục tổng hợp có thể được thêm vào khi tất cả các cột đã được tạo:
CREATE TABLE dbo.Person ( [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED ,[City] VARCHAR(32) NULL ,[Country] VARCHAR(32) NULL ,[State_Province] VARCHAR(32) NULL ,[LastModified] DATETIME NOT NULL ,INDEX T1_INDX_C1C2 NONCLUSTERED ([Name], [City]) ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
Khi bạn tạo bảng được tối ưu hóa trong bộ nhớ, công cụ OLTP trong bộ nhớ sẽ tạo các quy trình DML để có thể truy cập bảng đó. Nó tải các quy trình dưới dạng tệp DLL. Đối với một hoạt động cụ thể, SQL Server gọi một tệp DLL bắt buộc.
Thay đổi bảng và chỉ mục
Không thể thay đổi bảng trước SQL Server 2016. Để thực hiện thay đổi giản đồ, bạn phải thả và tạo lại bảng trong bộ nhớ.
Trong bản phát hành mới của SQL Server, ALTER TABLE được hỗ trợ một phần.
SQL Server 2016 cung cấp cho bạn khả năng thực hiện các hoạt động ngoại tuyến:thêm và bớt (sửa đổi) cột, chỉ mục và ràng buộc. Ngoài ra, giờ đây có thể làm việc với các bảng trong bộ nhớ bằng cách sử dụng trình thiết kế bảng SSMS hoặc trình chỉnh sửa bảng dbForge Studio cho SQL Server.
Lưu ý rằng ALTER TABLE yêu cầu xây dựng lại bảng. Đó là lý do tại sao bạn cần chắc chắn rằng bạn có đủ bộ nhớ trước khi chạy thao tác này. Trong quá trình xây dựng lại, mọi hàng đơn lẻ đều được lắp lại vào bảng mới và bảng sẽ không khả dụng khi thao tác ALTER đang được thực hiện.
Bạn có thể đưa ra nhiều thay đổi cho một bảng và kết hợp chúng thành một câu lệnh ALTER TABLE. Bạn có thể THÊM cột, chỉ mục và ràng buộc và bạn có thể XÓA cột, chỉ mục và ràng buộc. Lưu ý rằng bạn không thể kết hợp các lệnh ADD và DROP với nhau trong một BẢNG ALTER duy nhất.
-- index operations -- change hash index bucket count ALTER TABLE dbo.TableName ALTER INDEX IX_Name REBUILD WITH (BUCKET_COUNT = 131072); GO -- add index ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName); GO -- drop index ALTER TABLE dbo.TableName DROP INDEX IX_Name; GO -- add multiple indexes ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName), INDEX IX_Name2 NONCLUSTERED (ColName2); GO -- Add a new column and an index ALTER TABLE dbo.TableName ADD Date DATETIME, INDEX IX_Name NONCLUSTERED (ColName); GO -- Drop a column ALTER TABLE dbo.TableName DROP COLUMN ColName; GO
Loại bảng và biến bảng
SQL Server 2016 cung cấp cho bạn khả năng tạo các loại bảng được tối ưu hóa bộ nhớ mà bạn có thể sử dụng trong khi xác định biến bảng:
CREATE TYPE TypeName AS TABLE ( Col1 SMALLINT NOT NULL, Col2 INT NOT NULL, Col3 INT NOT NULL, Col4 INT NOT NULL, INDEX IX_Col1 NONCLUSTERED HASH (Col1) WITH (BUCKET_COUNT = 131072), INDEX IX_Col1 NONCLUSTERED (Col2)) WITH (MEMORY_OPTIMIZED = ON); GO DECLARE @VariableName TypeName; GO
Biến này chỉ được lưu trữ trong bộ nhớ. Các loại bảng và bảng được tối ưu hóa trong bộ nhớ sử dụng các cấu trúc dữ liệu giống nhau, vì vậy việc truy cập dữ liệu sẽ hiệu quả hơn so với các biến bảng dựa trên đĩa.
Để biết thêm chi tiết, vui lòng tham khảo bài đăng trên blog MSDN sau:Cải thiện hiệu suất bảng tạm và biến bảng bằng cách sử dụng tối ưu hóa bộ nhớ
Tóm tắt
OLTP trong bộ nhớ là một công nghệ tương đối non trẻ được thiết kế để hoạt động với các hệ thống OLTP rất lớn và rất bận rộn hỗ trợ hàng trăm hoặc thậm chí hàng nghìn người dùng đồng thời. Nó được giới thiệu trong SQL Server 2014 và phát triển trong SQL Server 2016.
Đồng thời, công nghệ này có một số hạn chế và hạn chế.
Không phải tất cả các tính năng và kiểu dữ liệu T-SQL đều được hỗ trợ bởi bộ nhớ- các bảng được tối ưu hóa, các bảng như vậy không được chứa các hàng vượt quá 8060 byte và cũng không hỗ trợ lưu trữ
ROW-OVERFLOW và LOB. Bạn không thể thay đổi bảng và chỉ mục (trong SQL Server 2014) sau khi bảng được tạo.
Mặc dù vậy, chúng tôi hy vọng rằng các phiên bản tiếp theo của In-Memory OLTP sẽ có ít hạn chế hơn!
Cũng đọc:
Sử dụng chỉ mục trong bảng được tối ưu hóa bộ nhớ máy chủ SQL