KB4013877 – Update ermöglicht DML-Abfrageplan im SQL Server 2016 das parallele Abfragen speicheroptimierter Tabellen

Gilt für
SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

Zusammenfassung

Vor diesem Update werden parallele Abfragepläne für DML-Vorgänge, die auf speicheroptimierte Tabellen oder Tabellenvariablen verweisen, nicht unterstützt, auch wenn sie nicht das Ziel des DML-Vorgangs sind. INSERT-, UPDATE-, DELETE- und MERGE-Anweisungen verfügen immer über einen seriellen Plan, wenn auf speicheroptimierte Tabellen oder Tabellenvariablen verwiesen wird, auch in Fällen, in denen parallele Pläne mit herkömmlichen datenträgerbasierten Tabellen und Tabellenvariablen unterstützt werden.

Dieses Update fügt Unterstützung für parallele Pläne und parallele Scans von speicheroptimierten Tabellen und Tabellenvariablen in DML-Operationen hinzu, die auf speicheroptimierte Tabellen oder Tabellenvariablen verweisen, sofern diese nicht das Ziel des DML-Vorgangs sind. INSERT-, UPDATE-, DELETE- und MERGE-Anweisungen, die eine Änderung einer speicheroptimierten Tabelle oder Tabellenvariablen beinhalten, sind weiterhin seriell.

Im Folgenden finden Sie die drei Voraussetzungen, um parallele Pläne für DML-Anweisungen zu aktivieren, die auf speicheroptimierte Tabellen oder Tabellenvariablen verweisen:

  1. Stellen Sie sicher, dass die Datenbank den Kompatibilitätsgrad 130 verwendet. Dies ist Voraussetzung für parallele Pläne mit speicheroptimierten Tabellen.

  2. Installieren Sie ein Dienstupdate, das diesen Fix enthält. Weitere Informationen finden Sie im Abschnitt "Weitere Informationen".

  3. Aktivieren Sie dieses Update auf eine von zwei Arten:

    1. Aktivieren Sie das Ablaufverfolgungsflag 9939, um nur dieses Update zu aktivieren. Diese Option wird allen Kunden empfohlen, die speicheroptimierte Tabellen oder Tabellenvariablen verwenden und die Option 3b (siehe unten) noch nicht verwenden.
    2. Aktivieren Sie SQL Server Abfrageoptimierer-Hotfixes. Dies können Sie über das Ablaufverfolgungsflag 4199, eine datenbankbezogene Konfiguration oder einen Abfragehinweis erreichen. Weitere Informationen finden Sie unter Wartungsmodell für das Hotfix-Ablaufverfolgungsflag 4199 des SQLServer-Abfrageoptimierers.

Lösung

Dieses Problem wurde in den folgenden kumulativen Updates für SQL Server behoben:

Kumulatives Update 5 für SQL Server 2016

Kumulatives Update 3 für SQL Server 2016 SP1

Informationen zu kumulativen Updates für SQL Server:

Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und Sicherheitsfixes, die im vorherigen kumulativen Update enthalten waren. Sehen Sie sich die neuesten kumulativen Updates für SQL Server an:

Neuestes kumulative Update für SQL Server 2016

Anhang: Beispiel für die Korrektur

Das folgende Transact-SQL-Skript veranschaulicht einen parallelen Plan für einen DML-Vorgang auf einer datenträgerbasierten Tabelle, die auf eine speicheroptimierte Tabelle verweist. Wenn dieses Update angewendet wird, gibt das Skript zwei Abfragepläne für denselben Vorgang zurück. Die erste ist spurlos Flag 9939 und wird seriell sein. Die zweite ist mit aktiviertem Ablaufverfolgungsflag 9939 und wird parallel sein.


-- 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

Referenzmaterial

Erfahren Sie mehr über die Terminologie , die Microsoft zum Beschreiben von Softwareupdates verwendet.