Тот факт, что вы используете GUID в качестве кластерного индекса, определенно отрицательно скажется на вашей производительности. Даже с NEWSEQUENTIALGUID GUID на самом деле не последовательны - они только частично. Их случайность по своей природе определенно приведет к более высокой фрагментации индекса и, следовательно, к менее оптимальному времени поиска.
Кроме того, если в качестве кластеризованного ключа у вас есть 16-байтовый GUID, он будет добавлен в любой некластеризованный индекс в этой таблице. Это может звучать не так уж плохо, но если у вас есть 10 миллионов. строк, 10 некластеризованных индексов, использование 16-байтового GUID против 4-байтового INT будет стоить вам 1,2 ГБ памяти, потраченной впустую - и не только на диск (что дешево), но и в память вашего сервера SQL (так как Сервер SQL всегда загружает целые 8 тыс. Страниц в 8 тыс. Блоков памяти, независимо от того, насколько они заполнены или пусты).
Я вижу смысл в использовании GUID в качестве первичного ключа - они почти на 100% гарантируют уникальность, привлекательны для разработчиков. НО: как кластерный ключ, это кошмар для вашей базы данных.
Моя лучшая практика: если мне действительно нужен GUID в качестве первичного ключа, я добавляю 4-байтовую INT IDENTITY в таблицу, которая затем служит кластеризованным ключом - результаты в этом случае намного лучше!
Если у вас есть некластеризованный первичный ключ, ваши запросы, использующие список идентификаторов GUID, будут такими же быстрыми, как если бы он был кластеризованным первичным ключом, и без использования GUID для кластеризованного ключа ваша таблица будет работать еще лучше в конец.
Узнайте больше о кластеризованном ключе и о том, почему так важно выбрать правильный в блоге Кимберли Триппса - Королеве индексации, и он может объяснить вещи гораздо лучше, чем я:
Марк