Ответ 1
GUID являются проблематичными как кластерные ключи из-за высокой случайности. Этот вопрос был рассмотрен Полом Рэндалом в последнем журнале Technet Q & Столбец: Я хотел бы использовать GUID как кластерный индексный ключ, но остальные утверждая, что это может привести к проблемам производительности с индексами. Это правда, и если да, можете ли вы объяснить, почему?
Теперь имейте в виду, что обсуждение посвящено особенностям кластеризованных. Вы говорите, что хотите использовать столбец как "ID", что неясно, если вы имеете в виду его как кластеризованный ключ или только первичный ключ. Обычно два перекрываются, поэтому я предполагаю, что вы хотите использовать его как кластерный индекс. Причины, по которым это плохой выбор, объясняются в ссылке на упомянутую выше статью.
Для некластеризованных индексов у GUID все еще есть некоторые проблемы, но не такие большие, как когда они являются самым левым кластеризованным ключом таблицы. Опять же, случайность GUID вводит разрывы страниц и фрагментацию, будь то только на некластеризованном уровне индекса (гораздо меньшая проблема).
Есть много городских легенд, окружающих использование GUID, которые осуждают их на основе их размера (16 байт) по сравнению с int (4 байта) и обещают ужасную производительность, если они используются. Это немного преувеличено. Ключ размером 16 может быть очень четким ключом по-прежнему на правильно разработанной модели данных. Хотя верно, что в 4 раза больше, чем int, это приводит к более низким плотним нелистовым страницам в индексах, это не представляет реальной проблемы для подавляющего большинства таблиц. Структура b-дерева представляет собой естественно сбалансированное дерево, и глубина обхода дерева редко возникает, поэтому поиск значения, основанного на ключе GUID, в отличие от ключа INT, аналогичен по производительности. Обход листовой страницы (т.е. Сканирование таблицы) не относится к страницам, отличным от листа, и влияние размера GUID на размер страницы обычно невелико, так как сама запись значительно больше, чем добавленные дополнительные 12 байт по GUID. Поэтому я бы посоветовал услышать совет, основанный на "16 байт против 4" с довольно большим зерном соли. Проанализируйте каждый случайный случай и решите, имеет ли значение влияние размера: сколько других столбцов находится в таблице (т.е. Сколько воздействия имеет размер GUID на страницах листа) и сколько ссылок использует его (т.е. сколько других таблиц будет увеличиваться из-за того, что им нужно хранить большой внешний ключ).
Я выхожу из всех этих деталей в своеобразную временную защиту GUID, потому что в последнее время они получают много плохих новостей, а некоторые - незаслуженно. Они имеют свои достоинства и незаменимы в любой распределенной системе (момент, когда вы говорите о движении данных, будь то через репликацию или структуру синхронизации или что-то еще). Я видел, как плохое решение принималось на основе плохой репутации GUID, когда их избегали без надлежащего рассмотрения. Но верно, , если вам нужно использовать GUID как кластерный ключ, убедитесь, что вы обращаетесь к проблеме случайности: используйте последовательные подсказки, когда это возможно.
И наконец, чтобы ответить на ваш вопрос: , если у вас нет конкретной причины использовать GUID, используйте INTs.