এই প্রশ্নটি অনুক্রমিক এবং অ-অনুক্রমিক জিইউডিগুলির সাথে তুলনা করার পরে , আমি ইনসার্টের পারফরম্যান্স 1 এর সাথে তুলনা করার চেষ্টা করেছি) একটি জিইউডি প্রাথমিক কী সহ newsequentialid()
একটি টেবিল এবং ধারাবাহিকভাবে একটি আইএনটি প্রাথমিক কী দিয়ে একটি টেবিলটি ধারাবাহিকভাবে আরম্ভ করা হয়েছিল identity(1,1)
। আমি প্রত্যাশা করবো যে সংখ্যার ছোট প্রস্থের কারণে পরবর্তীগুলি দ্রুততর হবে এবং এটি অনুক্রমিক জিইউডির তুলনায় ক্রমিক পূর্ণসংখ্যার উত্পাদনও সহজ বলে মনে হয়। তবে আমার আশ্চর্যের বিষয় হল, টেস্টের পূর্ণসংখ্যা কী সহ টেক্সটের INSERTs সিক্যুয়াল জিইউডি টেবিলের চেয়ে উল্লেখযোগ্যভাবে ধীর ছিল।
এটি পরীক্ষার জন্য গড় সময় ব্যবহার (এমএস) দেখায়:
NEWSEQUENTIALID() 1977
IDENTITY() 2223
কেউ কি এই ব্যাখ্যা করতে পারেন?
নিম্নলিখিত পরীক্ষাটি ব্যবহার করা হয়েছিল:
SET NOCOUNT ON
CREATE TABLE TestGuid2 (Id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWSEQUENTIALID() PRIMARY KEY,
SomeDate DATETIME, batchNumber BIGINT, FILLER CHAR(100))
CREATE TABLE TestInt (Id Int NOT NULL identity(1,1) PRIMARY KEY,
SomeDate DATETIME, batchNumber BIGINT, FILLER CHAR(100))
DECLARE @BatchCounter INT = 1
DECLARE @Numrows INT = 100000
WHILE (@BatchCounter <= 20)
BEGIN
BEGIN TRAN
DECLARE @LocalCounter INT = 0
WHILE (@LocalCounter <= @NumRows)
BEGIN
INSERT TestGuid2 (SomeDate,batchNumber) VALUES (GETDATE(),@BatchCounter)
SET @LocalCounter +=1
END
SET @LocalCounter = 0
WHILE (@LocalCounter <= @NumRows)
BEGIN
INSERT TestInt (SomeDate,batchNumber) VALUES (GETDATE(),@BatchCounter)
SET @LocalCounter +=1
END
SET @BatchCounter +=1
COMMIT
END
DBCC showcontig ('TestGuid2') WITH tableresults
DBCC showcontig ('TestInt') WITH tableresults
SELECT batchNumber,DATEDIFF(ms,MIN(SomeDate),MAX(SomeDate)) AS [NEWSEQUENTIALID()]
FROM TestGuid2
GROUP BY batchNumber
SELECT batchNumber,DATEDIFF(ms,MIN(SomeDate),MAX(SomeDate)) AS [IDENTITY()]
FROM TestInt
GROUP BY batchNumber
DROP TABLE TestGuid2
DROP TABLE TestInt
আপডেট: একটি টিএমপি টেবিলের উপর ভিত্তি করে সন্নিবেশ সম্পাদনের জন্য স্ক্রিপ্টটি পরিবর্তন করা, যেমন ফিল স্যান্ডলার, মিচ হুইট এবং মার্টিনের নীচের উদাহরণগুলির মতো আমিও দেখতে পেয়েছি যে পরিচয়টি যেমন হওয়া উচিত তত দ্রুত। তবে এটি সারিগুলি সন্নিবেশ করার প্রচলিত উপায় নয় এবং আমি এখনও বুঝতে পারি না কেন পরীক্ষাটি প্রথমে ভুল হয়েছিল: এমনকি আমি আমার মূল উদাহরণ থেকে GETDATE () বাদ দিলেও পরিচয় () এখনও ধীরে ধীরে ধীর। সুতরাং দেখে মনে হচ্ছে যে NEWSEQUENTIALID () কে অস্থায়ী টেবিলে সন্নিবেশ করানোর জন্য সারিগুলি প্রস্তুত করা এবং এই টেম্প টেবিলটি ব্যবহার করে ব্যাচ-সন্নিবেশ হিসাবে অনেকগুলি সন্নিবেশ সম্পাদন করা হল পরিচয় () কে আউটপরম করার একমাত্র উপায়। সর্বোপরি, আমি মনে করি না যে আমরা ঘটনার কোনও ব্যাখ্যা পেয়েছি এবং পরিচয় () এখনও বেশিরভাগ ব্যবহারিক ব্যবহারের জন্য ধীর বলে মনে হচ্ছে। কেউ কি এই ব্যাখ্যা করতে পারেন?
INT IDENTITY
IDENTITY
জন্য কোনও টেবিল লক লাগবে না। ধারণাগতভাবে আমি দেখতে পেয়েছি আপনি এটি MAX (id) + 1 নিচ্ছেন বলে আশা করতে পারেন, কিন্তু বাস্তবে পরবর্তী মানটি সঞ্চিত রয়েছে। এটি পরবর্তী জিইউইডি খুঁজে পাওয়ার চেয়ে দ্রুত হওয়া উচিত।