KB4013877 - Η ενημέρωση επιτρέπει στο σχέδιο ερωτήματος DML να σαρώνει παράλληλα πίνακες βελτιστοποιημένους για μνήμη στο SQL Server 2016

Ισχύει για
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

Σύνοψη

Πριν από αυτήν την ενημέρωση, τα σχέδια παράλληλων ερωτημάτων δεν υποστηρίζονται για λειτουργίες DML που αναφέρονται σε πίνακες ή μεταβλητές πίνακα βελτιστοποιημένης μνήμης, ακόμα και αν δεν αποτελούν τον στόχο της λειτουργίας DML. Οι προτάσεις INSERT, UPDATE, DELETE και MERGE θα έχουν πάντα ένα σειριακό σχέδιο εάν υπάρχει οποιαδήποτε αναφορά σε πίνακες ή μεταβλητές πίνακα βελτιστοποιημένης μνήμης, ακόμη και για περιπτώσεις στις οποίες τα παράλληλα σχέδια υποστηρίζονται με παραδοσιακούς πίνακες και μεταβλητές πίνακα που βασίζονται σε δίσκο.

Αυτή η ενημέρωση προσθέτει υποστήριξη για παράλληλα σχέδια και παράλληλη σάρωση πινάκων και μεταβλητών πίνακα βελτιστοποιημένης μνήμης σε λειτουργίες DML που αναφέρονται σε πίνακες ή μεταβλητές πίνακα βελτιστοποιημένης μνήμης, εφόσον δεν αποτελούν τον στόχο της λειτουργίας DML. Οι προτάσεις INSERT, UPDATE, DELETE και MERGE που περιλαμβάνουν τροποποίηση ενός πίνακα ή μιας μεταβλητής πίνακα βελτιστοποιημένης μνήμης εξακολουθούν να είναι σειριακές.

Ακολουθούν οι τρεις απαιτήσεις για την ενεργοποίηση παράλληλων σχεδίων για προτάσεις DML που αναφέρονται σε πίνακες ή μεταβλητές πίνακα βελτιστοποιημένης μνήμης:

  1. Βεβαιωθείτε ότι η βάση δεδομένων χρησιμοποιεί το επίπεδο συμβατότητας 130. Αυτό αποτελεί προαπαιτούμενο για παράλληλα σχέδια με πίνακες βελτιστοποιημένης μνήμης.

  2. Εγκαταστήστε μια ενημέρωση υπηρεσίας που περιλαμβάνει αυτήν την επιδιόρθωση. Ανατρέξτε στην ενότητα "Περισσότερες πληροφορίες".

  3. Ενεργοποιήστε αυτήν την ενημέρωση με έναν από τους εξής δύο τρόπους:

    1. Ενεργοποιήστε τη σημαία παρακολούθησης 9939 για να ενεργοποιήσετε μόνο αυτήν την ενημέρωση. Αυτή η επιλογή συνιστάται για όλους τους πελάτες που χρησιμοποιούν πίνακες ή μεταβλητές πίνακα με βελτιστοποίηση μνήμης και που δεν χρησιμοποιούν ήδη την επιλογή 3β παρακάτω.
    2. Ενεργοποιήστε SQL Server επείγουσες επιδιορθώσεις βελτιστοποίησης ερωτήματος. Αυτό μπορείτε να το κάνετε μέσω της σημαίας παρακολούθησης 4199, μιας ρύθμισης παραμέτρων σε επίπεδο βάσης δεδομένων ή μέσω μιας υπόδειξης ερωτήματος. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα Μοντέλο συντήρησης SQLServer query optimizer hotfix trace flag 4199.

Επίλυση

Αυτό το πρόβλημα διορθώνεται στις ακόλουθες αθροιστικές ενημερώσεις για SQL Server:

Αθροιστική ενημερωμένη έκδοση 5 για SQL Server 2016

Αθροιστική ενημερωμένη έκδοση 3 για SQL Server 2016 SP1

Πληροφορίες σχετικά με τις συγκεντρωτικές ενημερώσεις για SQL Server:

Κάθε νέα αθροιστική ενημερωμένη έκδοση για SQL Server περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις ενημερώσεις κώδικα ασφαλείας που συμπεριλήφθηκαν με την προηγούμενη αθροιστική ενημερωμένη έκδοση. Δείτε τις πιο πρόσφατες αθροιστικές ενημερώσεις για SQL Server:

Τελευταία αθροιστική ενημέρωση για το SQL Server 2016

Παράρτημα: Παράδειγμα της επιδιόρθωσης

Η ακόλουθη δέσμη ενεργειών Transact-SQL απεικονίζει ένα παράλληλο σχέδιο για μια λειτουργία DML σε έναν πίνακα που βασίζεται σε δίσκο που αναφέρεται σε έναν πίνακα βελτιστοποιημένο για μνήμη. Με την εφαρμογή αυτής της ενημέρωσης, η δέσμη ενεργειών θα επιστρέψει δύο σχέδια ερωτήματος για την ίδια λειτουργία. Η πρώτη είναι χωρίς σημαία παρακολούθησης 9939 και θα είναι σειριακή. Η δεύτερη είναι με ενεργοποιημένη τη σημαία παρακολούθησης 9939 και θα είναι παράλληλη.


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

Παραπομπές

Ενημερωθείτε σχετικά με την ορολογία που χρησιμοποιεί η Microsoft για να περιγράφει τις ενημερώσεις λογισμικού.