وب سایت سید حامد واحدی | Seyedhamed Vahedi Website

مقایسه انواع داده ای INT و GUID در SQL Server از نظر کارایی و دیسک


هر یک از انواع داده ای INT و GUID طرفداران خاصی دارد که بعضا متعصبانه بر مناسب بودن نوع داده ای مورد نظر خود اصرار می کنند. بدیهی است که باید بررسی انجام شود تا مزایا و معایب هر یک مشخص شود.
Books Online خود SQL Server معایب زیر را برای نوع داده Uniqueidentifier لیست می کند:
- مقادیر طولانی و مبهم هستند که تایپ توسط کاربر را دشوار می کند و همچنین حفظ کردن آن دشوار است.
- مقادیر تصادفی هستند و نمی توان به الگویی دست یافت که برای کاربر قابل معنی باشد.
- هیچ راهی برای تعیین دنباله مقادیر Uniqueidentifier وجود ندارد. برنامه هایی که ارزش افزایشی کلید مورد نیاز است قابل نیاز است، کاربرد ندارد.
- اندازه نوع داده uniqueidentifier بزرگتر از سایر انواع داده و 16 بایت است. بدیهی است که ایندکس های Uniqueidentifier کندتر از ایندکس های نوع int خواهند بود.
- اگر از تابع NEWID استفاده می کنید، GUID های تصادفی ایجاد می شود که دارای دامنه بزرگی است اما احتمال برخورد GUID ها وجود دارد. که برای اطمینان از عدم تکرار از تابع NewSequentialID استفاده می کنند. این تابع از شماره شناسایی کارت شبکه و شماره منحصر به فرد از ساعت CPU استفاده می کند که احتمال برخورد GUID تقریبا غیرممکن می شود.

برای بررسی کارایی، از مثالی با نوع داده های مختلف GUID و BIGINT و INT استفاده می کنیم؛ لذا از دستورات زیر برای ایجاد جداول استفاده می کنیم:
create table tblGUID (RecID uniqueidentifier default newid(), Record varchar(255), ModifiedTime datetime, SessionID int)

create table tblSeqGUID (RecID uniqueidentifier default newsequentialid(), Record varchar(255), ModifiedTime datetime, SessionID int)

create table tblINT (RecID bigint identity(1,1), Record varchar(255),ModifiedTime datetime, SessionID int)

create table tblBigINT (RecID int identity(1,1), Record varchar(255),ModifiedTime datetime, SessionID int)

ایندکس Clustered برای هر 4 جدول فوق روی فیلد RecID می سازیم و سپس 1 میلیون رکورد در هر جدول Insert می کنیم. مدت زمان صرف شده برای ورود اطلاعات به شرح زیر است:
tblGUID: 22 seconds

tblSeqGUID: 16 seconds

tblBIGINT: 23 seconds

tblINT: 23 seconds
و همچنین وضعیت دیسک بصورت زیر خواهد بود:
Object Name Index Name Pages Average Record Size Extents Average Page Density Logical Fragmentation Extent Fragmentation
tblGUID cidx_tblGUID 9608 51.89 1209.00 69.27 99.14 0.25
tblSeqGUID cidx_tblSeqGUID 6697 51.89 845.00 99.39 0.76 0.12
tblBigINT cidx_tblBigINT 5671 43.89 714.00 99.95 0.48 0.14
tblINT cidx_tblINT 5194 39.89 653.00 99.62 0.37 0.15

اگر به داده ها نگاه کنید، خواهید دید که GUID های تصادفی 99% fragmentation منطقی در جدول دارد که به دلیل ماهیت تصادفی تولید GUID هاست. ضمنا به دلیل نیاز به فضای بیشتر توسط GUID نسبت به INT تعداد صفحات جدول نیز بیشتر خواهد بود.
مجددا 10000 رکورد جدید Insert می کنیم؛ مدت زمان صرف شده برای ورود اطلاعات به شرح زیر است:
tblGuid : 23 seconds (10 ms to 1120 ms)

tblSeqGuid : 0 seconds (3 ms to 10 ms)

tblBigINT : 0 seconds (3 ms to 13 ms)

tblINT : 0 seconds (3 ms to 20 ms)

خلاصه نتیجه بصورت زیر است:
Criteria GUIDs Seq. GUIDs BIGINT INT
Storage 16 bytes 16 bytes 8 bytes 4 bytes
Insert/Update performance Slowest Comparable but the index keys are larger in size. For wider tables, this would be slower than Integer values. Faster than sequential GUIDs Fastest
Hotspot contention Very rare Yes Yes Highest, due to smaller size of RIDs
Fragmentation/Page Splits High Minimal Minimal Minimal
JOIN Performance/SORT operations Least performance (Rank 4 = Least performance) Better than random GUIDs due lesser fragmentation (Rank: 3) High performance (Rank: 2) High Performance (Rank: 1)
Logical reads Rank 4=Highest Rank 3 Rank 2 Rank 1=Least
Merging data across servers Beneficial Beneficial Difficult Difficult
Uniqueness Rare chance of duplicates Globally unique. Virtually no chance of collisions Limited by range of BIGINT Limited by range of INT

منبع: MSDN
سید حامد واحدی سید حامد واحدی     16 بهمن 1394