स्मृति-अनुकूलित तालिकाओं के साथ SQL सर्वर 2016 का गलत व्यवहार


13

कृपया निम्नलिखित SQL क्वेरी पर एक नज़र डालें:

CREATE TYPE dbo.IN_MEMORY_TABLE_TYPE AS TABLE
(
  source_col INT NULL,
  target_col INT not NULL
  INDEX ix_InMemoryTable NONCLUSTERED (target_col)
)
WITH (MEMORY_OPTIMIZED = ON)
GO

DECLARE
  @t dbo.IN_MEMORY_TABLE_TYPE

INSERT @t
(
  source_col,
  target_col
)
VALUES
  (10, 0),
  (0, 0)

UPDATE r1
SET
  target_col = -1
FROM @t r1
WHERE EXISTS
      (
        SELECT *
        FROM @t r2
        WHERE r2.source_col > 0
      )

SELECT *
FROM @t

GO
DROP TYPE dbo.IN_MEMORY_TABLE_TYPE

SQL सर्वर 2014 (12.0.4100.1 X64) पर इसे निष्पादित करते समय UPDATEक्वेरी में अपेक्षित के रूप में कार्य करता है और निम्न मान्य रिटर्न वापस आ जाता है:

source_col | target_col
----------------------
10 | -1
0 | -1

हालाँकि, SQL Server 2016 (13.0.4001.0 X64) पर निष्पादित करते समय सभी पंक्तियों को अद्यतन नहीं किया जाता है और निम्नलिखित को लौटा दिया जाता है:

source_col | target_col
----------------------
10 | -1
0 | 0

यह मेरे लिए एक बग जैसा दिखता है, क्या यह आपको ऐसा लगता है?


हाँ, यह एक बग है। SQL 2017 CTP 2.1 पर इसका परीक्षण किया गया है और यह SQL 2016 पर जैसा करता है वैसा ही व्यवहार करता है।
डीन सावोविक

जवाबों:


12

हाँ यह एक बग है, जो केवल बी-ट्री इंडेक्स एक्सेस पद्धति और एक असंबंधित स्व-जुड़ाव के साथ, टेबल चर को प्रभावित करता है।

सरलीकृत repro का उपयोग कर DELETE:

CREATE TYPE dbo.IN_MEMORY_TABLE_TYPE AS TABLE
(
    col integer NOT NULL INDEX i NONCLUSTERED (col)
)
WITH (MEMORY_OPTIMIZED = ON);
GO
DECLARE @T AS dbo.IN_MEMORY_TABLE_TYPE;

INSERT @T (col)
VALUES (1), (2), (3), (4), (5);

DELETE T
FROM @T AS T
WHERE EXISTS 
(
    SELECT 1
    FROM @T AS T2
    WHERE T2.col = 1 -- Vary this number 1-5
);

SELECT T.col FROM @T AS T;
GO
DROP TYPE dbo.IN_MEMORY_TABLE_TYPE;

दोषपूर्ण योजना

उपरोक्त योजना में नोट अपेक्षा से पहले की समाप्ति को हटाने के लिए पंक्तियों की खोज (केवल दो पंक्तियों को स्कैन से पढ़ा जाता है)। आम तौर पर इन-मेमोरी ओएलटीपी के लिए हैलोवीन प्रोटेक्शन को सही ढंग से संभाला जाता है, बस ऊपर उल्लेखित कारकों के संयोजन के साथ एक विशिष्ट मुद्दा प्रतीत होता है।


इस बग है तय में एसक्यूएल सर्वर 2016 SP1 CU5 और एसक्यूएल सर्वर 2017 CU1 :

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.