При проектирането на базата данни често използваме guid или int като основен ключ, и според придобитите знания винаги сме смятали, че int е по-ефективен като основен ключ, но е невъзможно без внимателно тестване
Обяснете причината. Случи се, че по време на оптимизацията на базата данни днес се сблъсках с този проблем, затова направих тест.
Тестова среда:
Настолен компютър Pentiun(R) 4 CPU 3.06GHz Win XP professional 1.5G DDR RAM SQL Server 2005 Личен
Процес на тестване:
Първо, създайте тестова база данни, Test
Резултатите от теста са следните:
Както беше споменато по-горе, ефективността на използването на int като първичен ключ се подобрява в сравнение с използването на guid като основен ключ, особено когато има заявка за връзка и изтриване на записи.
Освен това, в заявката за данни с основния ключ в GUID днес, таймаутът на заявката се случваше многократно поради вложене на няколко резултата от подзаявка. Затова съм за използването на int като основен ключ и не съм съгласен с guid като основен ключ. Горните гледни точки представляват лични мнения и всеки е добре дошъл да изрази своето мнение и да обясни предимствата и недостатъците на guid и int като основен ключ.
Последващи тестове:
След като братята ми напомняха, днес към две подтаблици е добавен неклъстерен индекс:
СЪЗДАВАНЕ НА НЕКЛЪСТЕРИРАНИ ИНДЕКСНИ Index_Detail_Guid на Test_Guid_Detail(Guid) СЪЗДАВАНЕ НА НЕКЛЪСТЕРИРАН ИНДЕКСЕН Index_Detail_id на Test_Int_Detail(id) След това проведох вътрешно запитване за връзка и установих, че както каза @Xu Шаося, ефективността наистина не е достатъчно очевидна, за да показва над 50%, а всъщност само около 23% подобрение, което все пак е приемливо.
Затова се препоръчва
1. В системи, които често трябва да извършват миграция на данни, се препоръчва използването на Guid. А добавянето на неклъстерни индекси към съответните външни ключови полета, тоест полета, използвани за заявки за съединяване, е от голяма полза за подобряване на производителността. Полето на условието where може да се добави и при подходящо за неклъстерирани индекси.
2. При използване на Guid тип като първичен ключ, типът данни трябва да бъде уникален идентификатор и не забравяйте да анулирате "агрегатния индекс" на първичния ключ
3. За системи, които не се нуждаят от миграция, или за малки системи, все още е много удобно да се използва int като първичен ключ и има известно подобрение в ефективността.
|