Tóm tắt
Trước bản cập nhật này, kế hoạch truy vấn song song không được hỗ trợ cho các thao tác DML tham chiếu đến các bảng hoặc biến bảng được tối ưu hóa cho bộ nhớ, ngay cả khi chúng không phải là đích của thao tác DML. Câu lệnh INSERT, UPDATE, DELETE và MERGE sẽ luôn có kế hoạch tuần tự nếu có bất kỳ tham chiếu nào đến bảng hoặc biến bảng được tối ưu hóa cho bộ nhớ, ngay cả trong trường hợp các kế hoạch song song được hỗ trợ với bảng và biến bảng dựa trên đĩa truyền thống.
Bản cập nhật này bổ sung hỗ trợ cho các kế hoạch song song và quét song song các bảng và biến bảng được tối ưu hóa cho bộ nhớ trong các thao tác DML tham chiếu đến bảng hoặc biến bảng được tối ưu hóa cho bộ nhớ, miễn là chúng không phải là mục tiêu của thao tác DML. Câu lệnh INSERT, UPDATE, DELETE và MERGE liên quan đến sửa đổi biến bảng hoặc bảng được tối ưu hóa cho bộ nhớ tiếp tục là câu lệnh theo trình tự.
Sau đây là ba yêu cầu để bật các kế hoạch song song cho các câu lệnh DML tham chiếu đến các biến bảng hoặc bảng được tối ưu hóa cho bộ nhớ:
Hãy đảm bảo rằng cơ sở dữ liệu sử dụng mức tương thích 130. Đây là điều kiện tiên quyết cho các kế hoạch song song với bảng được tối ưu hóa bộ nhớ.
Cài đặt bản cập nhật dịch vụ có bao gồm bản sửa lỗi này. Xem mục "Xem thêm thông tin".
Bật bản cập nhật này theo một trong hai cách:
- Bật cờ theo dõi 9939 để chỉ bật bản cập nhật này. Tùy chọn này được đề xuất cho tất cả khách hàng sử dụng bảng hoặc biến số bảng được tối ưu hóa bộ nhớ và những khách hàng chưa sử dụng tùy chọn 3b bên dưới.
- Bật hotfix trình tối ưu hóa truy vấn SQL Server. Bạn có thể thực hiện điều này thông qua cờ theo dõi 4199, cấu hình trong phạm vi cơ sở dữ liệu hoặc gợi ý truy vấn. Để biết thêm thông tin, hãy xem mô hình dịch vụ hotfix cờ theo dõi 4199 của trình tối ưu hóa truy vấn SQLServer.
Giải pháp
Sự cố này đã được khắc phục trong các bản cập nhật tích lũy sau đây dành cho SQL Server:
Bản cập nhật tích lũy 5 cho SQL Server 2016
Cập nhật tích lũy 3 cho SQL Server 2016 SP1
Giới thiệu về các bản cập nhật tích lũy cho SQL Server:
Mỗi bản cập nhật tích lũy mới dành cho SQL Server chứa tất cả các bản sửa lỗi nóng và bản sửa lỗi bảo mật được tích hợp trong bản cập nhật tích lũy trước đó. Xem các bản cập nhật tích lũy mới nhất cho SQL Server:
Bản cập nhật tích lũy mới nhất cho SQL Server 2016
Phụ lục: Ví dụ về bản sửa lỗi
Tập lệnh Transact-SQL sau đây minh họa kế hoạch song song cho thao tác DML trên bảng dựa trên đĩa tham chiếu đến bảng được tối ưu hóa bộ nhớ. Với bản cập nhật này được áp dụng, tập lệnh sẽ trả về hai kế hoạch truy vấn cho cùng một thao tác. Đầu tiên là cờ 9939 không dấu vết và sẽ là tuần tự. Thứ hai là với cờ theo dõi 9939 được bật và sẽ song song.
-- make sure that you connect to a database that has a memory-optimized filegroup with at least one container
-- the following script creates such a filegroup and container if it does not exist:
-- https://raw.githubusercontent.com/Microsoft/sql-server-samples/master/samples/features/in-memory/t-sql-scripts/enable-in-memory-oltp.sql
-- make sure DB compat level 130 is used
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130
GO
DROP PROCEDURE IF EXISTS dbo.[InsertSalesOrder_Native_Batch]
DROP TABLE IF EXISTS dbo.SalesOrder_MemOpt
GO
CREATE TABLE dbo.SalesOrder_MemOpt (
order_id INT IDENTITY NOT NULL,
order_date DATETIME NOT NULL,
order_status TINYINT NOT NULL,
amount FLOAT NOT NULL,
CONSTRAINT PK_SalesOrderID PRIMARY KEY NONCLUSTERED HASH (order_id) WITH (BUCKET_COUNT = 10000)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY);
GO
-- Natively compiled proc
-- Create Natively compiled procedure to speed up inserts.
CREATE PROCEDURE [dbo].[InsertSalesOrder_Native_Batch]
@order_status TINYINT=1, @amount FLOAT=100, @OrderNum INT=100
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS
BEGIN ATOMIC
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = 'us_english')
DECLARE @counter AS INT = 1;
WHILE @counter <= @OrderNum
BEGIN
INSERT INTO dbo.SalesOrder_MemOpt
VALUES (getdate(), @order_status, @amount);
SET @counter = @counter + 1;
END
END;
GO
-- Insert sample data
EXECUTE dbo.[InsertSalesOrder_Native_Batch] 1, 100, 500000;
GO 10
SET SHOWPLAN_XML ON
GO
-- Insert into a temp table from memory-optimized table
-- Without the trace flag, this is serial. Inspect the query plan to verify it is serial.
SELECT * INTO #temp FROM SalesOrder_MemOpt
GO
SET SHOWPLAN_XML OFF
GO
-- enable parallel plan for DML with references to memory-optimized tables
DBCC TRACEON (9939)
GO
SET SHOWPLAN_XML ON
GO
-- Verify the query plan is parallel.
SELECT * INTO #temp FROM SalesOrder_MemOpt
GO
SET SHOWPLAN_XML OFF
GO
DBCC TRACEOFF (9939)
GO
Tham khảo
Tìm hiểu về thuật ngữ mà Microsoft sử dụng để mô tả các bản cập nhật phần mềm.