หลังจากที่ถามนี้คำถามเปรียบเทียบลำดับและ guid ของที่ไม่ใช่ลำดับผมพยายามที่จะเปรียบเทียบประสิทธิภาพ INSERT เมื่อวันที่ 1) ตารางที่มีคีย์หลัก 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 เช่นในตัวอย่างโดย Phil Sandler, Mitch Wheat และ Martin ด้านล่างฉันพบว่าตัวตนนั้นเร็วกว่าที่ควรจะเป็น แต่นั่นไม่ใช่วิธีการทั่วไปของการแทรกแถวและฉันก็ยังไม่เข้าใจว่าทำไมการทดสอบผิดพลาดในตอนแรก: แม้ว่าฉันจะละเว้น GETDATE () จากตัวอย่างดั้งเดิมของฉัน IDENTITY () ก็ยังช้ากว่า ดังนั้นดูเหมือนว่าวิธีเดียวที่จะทำให้ IDENTITY () มีประสิทธิภาพเหนือกว่า NEWSEQUENTIALID () คือการเตรียมแถวที่จะแทรกในตารางชั่วคราวและทำการแทรกหลาย ๆ ครั้งเป็นชุดแทรกโดยใช้ตารางอุณหภูมินี้ โดยรวมแล้วฉันไม่คิดว่าเราจะพบคำอธิบายเกี่ยวกับปรากฏการณ์และตัวตน () ยังดูเหมือนว่าจะช้าลงสำหรับการใช้งานจริงมากที่สุด มีใครอธิบายเรื่องนี้ได้บ้าง
INT IDENTITY
IDENTITY
ไม่จำเป็นต้องล็อคตาราง แนวคิดฉันเห็นคุณอาจคาดหวังว่ามันจะใช้ MAX (id) + 1 แต่ในความเป็นจริงแล้วค่าถัดไปจะถูกเก็บไว้ จริง ๆ แล้วควรจะเร็วกว่าการค้นหา GUID ถัดไป