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

Я использую статические классы в качестве средства определить "дополнительную функциональность", которую объект данного типа мог использовать под определенным контекстом. Обычно они оказываются служебными классами.

Кроме этого, я думаю, что "Используют статический класс в качестве единицы организации по методам, не связанным с конкретными объектами". опишите вполне хорошо их намеченное использование.

33
задан abatishchev 5 March 2016 в 07:20
поделиться

6 ответов

GUID проблематичны как кластерные ключи из-за высокого случайность. Эта проблема была рассмотрена Полом Рэндалом в последней колонке вопросов и ответов журнала Technet Magazine: Я хотел бы использовать GUID в качестве ключа кластеризованного индекса, но другие утверждают, что это может привести к проблемам с производительностью индексов. Верно ли это, и если да, то можете ли вы объяснить, почему?

Теперь имейте в виду, что речь идет именно о кластерных индексах. Вы говорите, что хотите использовать столбец как «ID», но неясно, имеете ли вы в виду его как кластерный ключ или просто первичный ключ. Обычно они перекрываются, поэтому я предполагаю, что вы хотите использовать их как кластерный индекс. Причины, по которым это плохой выбор, объясняются в ссылке на упомянутую выше статью.

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

Существует множество городских легенд, связанных с использованием GUID, которые осуждают их на основе их размера (16 bytes) по сравнению с int (4 байта) и обещают ужасную гибель производительности, если они будут использоваться. Это немного преувеличено. Ключ размера 16 может быть очень эффективным ключом в правильно спроектированной модели данных. Хотя верно то, что размер в 4 раза больше, чем int, приводит к большему количеству нелистовых страниц с меньшей плотностью в индексах, это не является серьезной проблемой для подавляющего большинства таблиц. Структура b-дерева представляет собой естественно хорошо сбалансированное дерево, и глубина обхода дерева редко является проблемой, поэтому поиск значения на основе ключа GUID, а не ключа INT, аналогичен по производительности. Обход конечной страницы (то есть сканирование таблицы) не смотрит на нелистовые страницы, и влияние размера GUID на размер страницы обычно довольно мало, поскольку сама запись значительно больше, чем введенные дополнительные 12 байтов. по GUID. Так что я бы послушался совета, основанного на том, что «16 байт против 4» с довольно большой долей скепсиса. Проанализируйте индивидуально в каждом конкретном случае и решите, имеет ли влияние размер реальную разницу: сколько других столбцов находится в таблице (т.е. какое влияние оказывает размер GUID на конечных страницах) и сколько ссылок используют его (т.е. сколько других таблиц увеличится из-за того, что они должны хранить внешний ключ большего размера).

Я вызываю все эти детали в своего рода импровизированной защите GUID, потому что они получают в последнее время много плохой прессы, и некоторые из них незаслуженно. У них есть свои достоинства, и они незаменимы в любой распределенной системе (в тот момент, когда вы говорите о перемещении данных, будь то репликация, структура синхронизации или что-то еще). Я видел, как плохие решения принимались на основе плохой репутации GUID, когда их избегали без должного рассмотрения. Но это правда, , если вам нужно использовать GUID в качестве кластеризованного ключа, убедитесь, что вы решили проблему случайности: по возможности используйте последовательные направляющие .

И, наконец, чтобы ответить на ваш вопрос: if у вас нет конкретной причины использовать идентификаторы GUID, используйте INT.

52
ответ дан 27 November 2019 в 17:56
поделиться

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

Статья Кимберли Л. Триппа

  • Против: Пробел, не строго монотонный, разделение страниц, закладки / RID и т. Д.
  • Для: э ...
3
ответ дан 27 November 2019 в 17:56
поделиться

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

8
ответ дан 27 November 2019 в 17:56
поделиться

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

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

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

6
ответ дан 27 November 2019 в 17:56
поделиться

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

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

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

4
ответ дан 27 November 2019 в 17:56
поделиться

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

2
ответ дан 27 November 2019 в 17:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: