KB4013877 - Actualizarea permite planului de interogare DML să scaneze în paralel tabelele cu interogare optimizată pentru memorie în SQL Server 2016

Se aplică la
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

Rezumat

Înainte de această actualizare, planurile de interogare în paralel nu erau acceptate pentru operațiunile DML care fac referire la tabele optimizate pentru memorie sau la variabile de tabel, chiar dacă acestea nu sunt ținta operațiunii DML. Instrucțiunile INSERT, UPDATE, DELETE și MERGE au întotdeauna un plan serial dacă există vreo referință la tabele optimizate pentru memorie sau variabile de tabel, chiar și pentru cazurile în care planurile paralele sunt acceptate cu tabelele tradiționale bazate pe disc și cu variabilele de tabel.

Această actualizare adaugă suport pentru planurile paralele și scanarea în paralel a tabelelor și variabilelor de tabel optimizate pentru memorie în operațiunile DML care fac referire la tabele optimizate pentru memorie sau la variabile de tabel, atât timp cât acestea nu sunt ținta operațiunii DML. Instrucțiunile INSERT, UPDATE, DELETE și MERGE care implică modificarea unui tabel optimizat pentru memorie sau a unei variabile de tabel continuă să fie seriale.

Mai jos sunt cele trei cerințe pentru a permite planurile paralele pentru instrucțiunile DML care fac referire la tabele optimizate pentru memorie sau la variabile de tabel:

  1. Asigurați-vă că baza de date utilizează nivelul de compatibilitate 130. Aceasta este o condiție necesară pentru planurile paralele cu tabele optimizate pentru memorie.

  2. Instalați o actualizare de serviciu care include această remediere. Consultați secțiunea "Mai multe informații".

  3. Activați această actualizare într-unul dintre următoarele două moduri:

    1. Activați semnalizarea de urmărire 9939 pentru a activa doar această actualizare. Această opțiune este recomandată tuturor clienților care utilizează tabele optimizate pentru memorie sau variabile de tabel și care nu utilizează deja opțiunea 3b, de mai jos.
    2. Activați remedierile rapide ale instrumentului de optimizare a interogărilor SQL Server. Puteți face acest lucru prin semnalizarea de urmărire 4199, o configurație din domeniul bazei de date sau un indiciu de interogare. Pentru mai multe informații, consultați SQLServer optimizator interogare semnalizare de urmărire rapidă 4199 model de servicii.

Rezolvare

Această problemă este remediată în următoarele actualizări cumulative pentru SQL Server:

Actualizarea cumulativă 5 pentru SQL Server 2016

Actualizarea cumulativă 3 pentru SQL Server 2016 SP1

Despre actualizările cumulative pentru SQL Server:

Fiecare actualizare cumulativă nouă pentru SQL Server conține toate remedierile rapide și toate remedierile de securitate care au fost incluse cu actualizarea cumulativă anterioară. Consultați cele mai recente actualizări cumulative pentru SQL Server:

Cea mai recentă actualizare cumulativă pentru SQL Server 2016

Anexă: Exemplu de remediere

Următorul script Transact-SQL ilustrează un plan paralel pentru o operațiune DML pe un tabel bazat pe disc, care face referire la un tabel cu memorie optimizată. Cu această actualizare aplicată, scriptul va returna două planuri de interogare pentru aceeași operațiune. Prima este fără semnalizator 9939 și va fi serială. A doua este cu semnalizarea de urmărire 9939 activată și va fi paralelă.


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

Referințe

Aflați despre terminologia pe care o utilizează Microsoft pentru a descrie actualizările de software.