अनुक्रमिक और गैर-अनुक्रमिक GUID की तुलना करने वाले इस प्रश्न को पूछने के बाद , मैंने 1 पर INSERT प्रदर्शन की तुलना करने की कोशिश की) एक GUID प्राथमिक कुंजी के साथ क्रमिक रूप से newsequentialid()
तालिका, और 2) एक INT प्राथमिक कुंजी प्रारंभिक क्रमिक रूप से तालिका identity(1,1)
। मैं पूर्णांकों की छोटी चौड़ाई के कारण उत्तरार्द्ध को सबसे तेज़ होने की उम्मीद करूंगा, और अनुक्रमिक GUID की तुलना में अनुक्रमिक पूर्णांक उत्पन्न करना भी सरल लगता है। लेकिन मेरे आश्चर्य के लिए, पूर्णांक कुंजी के साथ तालिका पर INSERTs क्रमिक GUID तालिका की तुलना में काफी धीमा थे।
यह परीक्षण चलाने के लिए औसत समय उपयोग (एमएस) दिखाता है:
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
अद्यतन: स्क्रिप्ट को संशोधित करने के लिए, TEMP तालिका के आधार पर सम्मिलन करने के लिए, जैसे फिल सैंडलर, मिच गेहूं और मार्टिन द्वारा उदाहरण में, मुझे यह भी पता चलता है कि IDENTITY जितनी तेज होनी चाहिए। लेकिन यह पंक्तियों को सम्मिलित करने का पारंपरिक तरीका नहीं है, और मुझे अभी भी समझ में नहीं आया है कि पहले प्रयोग गलत क्यों हुआ: भले ही मैं अपने मूल उदाहरण से GETDATE () को छोड़ देता हूं, IDENTITY () अभी भी धीमा है। तो ऐसा लगता है कि IDENTITY () आउटपरफॉर्म NEWSEQUENTIALID () बनाने का एकमात्र तरीका अस्थायी तालिका में सम्मिलित करने के लिए पंक्तियों को तैयार करना है और इस अस्थायी तालिका का उपयोग करके बैच-सम्मिलित के रूप में कई सम्मिलन करना है। सब सब में, मुझे नहीं लगता कि हमने घटना के बारे में स्पष्टीकरण पाया है, और पहचान () अभी भी सबसे व्यावहारिक चरणों के लिए धीमी लगती है। क्या कोई इसे समझा सकता है?
INT IDENTITY
IDENTITY
टेबल लॉक की आवश्यकता नहीं होती है। वैचारिक रूप से मैं देख सकता था कि आप इसे MAX (id) + 1 लेने की उम्मीद कर सकते हैं, लेकिन वास्तव में अगला मूल्य संग्रहीत है। यह वास्तव में अगला GUID खोजने से अधिक तेज़ होना चाहिए।