হ্যাঁ, এসকিউএল সার্ভার, কিছু পরিস্থিতিতে সারিটির "পুরাতন" সংস্করণ থেকে একটি কলামের মান এবং সারিটির "নতুন" সংস্করণ থেকে অন্য কলামের মান পড়তে পারে।
সেটআপ:
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
QUERY (নির্দেশ কারণে যদিও) ক্লাস্টার সূচক বদলে অ ক্লাস্টার ইনডেক্স থেকে কলাম পুনরুদ্ধার করছে।
আপডেট বিবৃতিটি একটি বিস্তৃত আপডেট পরিকল্পনা পেয়েছে ...
... এবং সূচকে ধারাবাহিকভাবে আপডেট করে যাতে এক সূচক থেকে "পূর্বে" মানগুলি এবং অন্যের "পরে" পড়া সম্ভব হয়।
একই কলাম মানটির দুটি পৃথক সংস্করণ পুনরুদ্ধার করাও সম্ভব।
প্রথম সংযোগে, এটি চালান:
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 |
+------------+------------+