Подтвердить что ты не робот

INT vs Уникальный идентификатор для поля ID в базе данных

Я создаю новую базу данных для веб-сайта с использованием SQL Server 2005 (возможно, SQL Server 2008 в ближайшем будущем). В качестве разработчика приложений я видел множество баз данных, которые используют integer (или bigint и т.д.) Для поля ID таблицы, которое будет использоваться для отношений. Но в последнее время я также видел базы данных, которые используют unique identifier (GUID) для поля ID.

Мой вопрос: имеет ли преимущество преимущество над другим? Поля integer будут быстрее для запросов и присоединения и т.д.?

ОБНОВЛЕНИЕ: Чтобы это было ясно, это для первичного ключа в таблицах.

4b9b3361

Ответ 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.

Ответ 2

GUID будет занимать больше места и быть медленнее, чем int, даже если вы используете функцию newsequentialid(). Если вы собираетесь выполнять репликацию или использовать структуру синхронизации, вам в значительной степени придется использовать guid.

Ответ 3

INT - это 4 байта, BIGINTs - 8 байтов, а GUIDS - 16 байт. Чем больше места требуется для представления данных, тем больше ресурсов требуется для его обработки - дискового пространства, памяти и т.д. Таким образом, (а) они медленнее, но (б) это, вероятно, имеет значение только в том случае, если объем является проблемой (миллионы строк или тысяч транзакций в очень и очень малое время.)

Преимущество GUID заключается в том, что они (в значительной степени) уникальны на глобальном уровне. Создайте направляющую, используя соответствующий алгоритм (и SQL Server xxxx будет использовать соответствующий алгоритм), и никакие два гида никогда не будут похожи друг на друга - независимо от того, сколько компьютеров вы их генерируете, независимо от того, как часто. (Это не применяется после 72 лет использования - я забываю детали.)

Если вам нужны уникальные идентификаторы, сгенерированные на нескольких серверах, GUID могут оказаться полезными. Если вам нужно mondo perforance и менее 2 миллиардов значений, ints, вероятно, прекрасны. Наконец и, возможно, самое главное, если ваши данные имеют естественные ключи, придерживайтесь их и забывайте суррогатные значения.

Ответ 4

если вы положительно, обязательно должны иметь уникальный идентификатор, а затем GUID. Если вы когда-либо собираетесь сливаться, синхронизировать, копировать, вы, вероятно, должны использовать GUID.

Для менее надежных вещей значение int должно быть достаточным в зависимости от того, насколько большой будет рост таблицы.

Как и в большинстве случаев, правильный ответ - это зависит.

Ответ 5

Используйте их для репликации и т.д., не в качестве первичных ключей.

Статья Kimberly L Tripp

  • Против: Пространство, не строго монотонное, разбиение страниц, закладка /RID и т.д.
  • Для: er...

Ответ 6

Полностью согласился с JBrooks. Я хочу сказать, что когда ваша таблица большая и вы используете selects с JOINS, особенно с производными таблицами, использование GUID может значительно снизить производительность.