ใช่ SQL Server สามารถอ่านค่าของคอลัมน์หนึ่งจากแถว "รุ่นเก่า" ในบางกรณีและค่าของคอลัมน์อื่นจากรุ่น "ใหม่" ของแถว
ติดตั้ง:
CREATE TABLE Person
(
Id INT PRIMARY KEY,
Name VARCHAR(100),
Surname VARCHAR(100)
);
CREATE INDEX ix_Name
ON Person(Name);
CREATE INDEX ix_Surname
ON Person(Surname);
INSERT INTO Person
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY @@SPID),
'Jonny1',
'Jonny1'
FROM master..spt_values v1,
master..spt_values v2
ในการเชื่อมต่อครั้งแรกให้รันสิ่งนี้:
WHILE ( 1 = 1 )
BEGIN
UPDATE Person
SET Name = 'Jonny2',
Surname = 'Jonny2'
UPDATE Person
SET Name = 'Jonny1',
Surname = 'Jonny1'
END
ในการเชื่อมต่อที่สองเรียกใช้สิ่งนี้:
DECLARE @Person TABLE (
Id INT PRIMARY KEY,
Name VARCHAR(100),
Surname VARCHAR(100));
SELECT 'Setting intial Rowcount'
WHERE 1 = 0
WHILE @@ROWCOUNT = 0
INSERT INTO @Person
SELECT Id,
Name,
Surname
FROM Person WITH(NOLOCK, INDEX = ix_Name, INDEX = ix_Surname)
WHERE Id > 30
AND Name <> Surname
SELECT *
FROM @Person
หลังจากทำงานประมาณ 30 วินาทีฉันจะได้รับ:
SELECT
แบบสอบถามจะดึงคอลัมน์จากดัชนีคลัสเตอร์มากกว่าดัชนีคลัสเตอร์ (แม้ว่าเนื่องจากคำแนะนำ)
คำสั่งการปรับปรุงได้รับแผนการปรับปรุงที่กว้างขวาง ...
... และอัปเดตดัชนีตามลำดับดังนั้นจึงเป็นไปได้ที่จะอ่านค่า "ก่อน" จากดัชนีหนึ่งและ "หลัง" จากดัชนีอื่น
นอกจากนี้ยังเป็นไปได้ที่จะเรียกคืนค่าคอลัมน์เดียวกันสองเวอร์ชัน
ในการเชื่อมต่อครั้งแรกให้รันสิ่งนี้:
DECLARE @A VARCHAR(MAX) = 'A';
DECLARE @B VARCHAR(MAX) = 'B';
SELECT @A = REPLICATE(@A, 200000),
@B = REPLICATE(@B, 200000);
CREATE TABLE T
(
V VARCHAR(MAX) NULL
);
INSERT INTO T
VALUES (@B);
WHILE 1 = 1
BEGIN
UPDATE T
SET V = @A;
UPDATE T
SET V = @B;
END
จากนั้นในวินาทีให้เรียกใช้สิ่งนี้:
SELECT 'Setting intial Rowcount'
WHERE 1 = 0;
WHILE @@ROWCOUNT = 0
SELECT LEFT(V, 10) AS Left10,
RIGHT(V, 10) AS Right10
FROM T WITH (NOLOCK)
WHERE LEFT(V, 10) <> RIGHT(V, 10);
DROP TABLE T;
ทันทีนี้กลับผลลัพธ์ต่อไปนี้สำหรับฉัน
+------------+------------+
| Left10 | Right10 |
+------------+------------+
| BBBBBBBBBB | AAAAAAAAAA |
+------------+------------+