Kokkuvõte
Enne seda värskendust ei toetata paralleelseid päringuplaane DML-toimingute puhul, mis viitavad mälu optimeeritud tabelitele või tabelimuutujatele, isegi kui need pole DML-toimingu sihtmärk. Lausetel INSERT, UPDATE, DELETE ja MERGE oleks alati jadaplaan, kui leidub viiteid mälu optimeeritud tabelitele või tabelimuutujatele isegi juhtudel, kui paralleelseid plaane toetatakse traditsiooniliste kettapõhiste tabelite ja tabelimuutujatega.
See värskendus lisab tuge paralleelplaanide ja paralleelse kontrolli mälu optimeeritud tabelite ja tabelimuutujate DML-toimingutes, mis viitavad mälu optimeeritud tabelitele või tabelimuutujatele, kui need ei ole DML-toimingu sihtmärk. INSERT-, UPDATE-, DELETE- ja MERGE-laused, mis sisaldavad mälu optimeeritud tabeli või tabelimuutuja muutmist, jäävad järjestikusteks.
Järgmised kolm nõuet on järgmised, et lubada paralleelsed plaanid DML-lausete jaoks, mis viitavad mälu optimeeritud tabelitele või tabelimuutujatele:
Veenduge, et andmebaas kasutaks ühilduvustaset 130. See on paralleelplaanide ja mälu optimeeritud tabelite eeltingimus.
Installige seda parandust sisaldav teenusevärskendus. Vt jaotist "Lisateave".
Selle värskenduse lubamiseks on kaks võimalust.
- Kui soovite lubada ainult selle värskenduse, lülitage jälituslipp 9939 sisse. See suvand on soovitatav kõigile klientidele, kes kasutavad mälu optimeeritud tabeleid või tabelimuutujaid ja kes ei kasuta allpool suvandit 3b.
- Lubage SQL Server päringu optimeerija kiirparandused. Seda saate teha jälituslipu 4199, andmebaasiulatuses konfiguratsiooni või päringuvihje kaudu. Lisateavet leiate artiklist SQLServeri päringu optimeerija kiirparanduste jälituse lipu 4199 hooldusmudel.
Lahendus
See probleem on lahendatud järgmistes SQL Server koondvärskendustes.
koondvärskendus 5 SQL Server 2016 jaoks
SQL Server 2016 SP1 koondvärskendus 3
Teave SQL Server koondvärskenduste kohta.
Iga uus koondvärskendus SQL Server sisaldab kõiki kiirparandusi ja kõiki turbeparandusi, mis olid kaasatud eelmise koondvärskenduse. Vaadake uusimaid SQL Server koondvärskendusi.
Uusim koondvärskendus SQL Server 2016 jaoks
Lisa: Paranduse näide
Järgmine Transact-SQL-i skript illustreerib DML-toimingu paralleelset plaani kettapõhises tabelis, mis viitab mälu optimeeritud tabelile. Kui see värskendus on rakendatud, tagastab skript sama toimingu jaoks kaks päringuplaani. Esimene on ilma jälitusliputa 9939 ja see on jadana. Teine on lubatud jälituslipuga 9939 ja on paralleelne.
-- 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
Viited
Siit leiate teavet microsofti tarkvaravärskenduste terminoloogia kohta.