Вопрос

Я работаю в рефакторинге базы данных (SQL Server 2008) схемы и собирать аргументы для изменения NCHAR(1) столбцы (которые сохраняют Y|N ценности) to BIT. Отказ Все понимают, что это необходимо и не знают, почему это происходит, но это изменение влияет на производственную базу данных, поэтому требуются весомые аргументы. Стол сохраняет адрес каталога (до 1 м записи).

Первый аргумент, который я нашел - каждый nchar fields. Возьмите 2 байта, каждый 8 битные поля - 1 байт (следующий 8 - дополнительный 1 байт).

Что дальше? Может быть, некоторые индексы проблемы производительности?

Это было полезно?

Решение

Битовое поле помогает вашей логике, автоматически обеспечивая то, что в настоящее время неявное бизнес-правило (т. Е. Этот столбец может содержать только «y» или «n»). Если вы применяете это правило программно, вы можете сохранить, устраняя это накладные расходы. Индексирование битовой колонны самостоятельно имеет небольшое значение из-за низкой кардинальности, но он может быть полезен как часть композитного индекса.

Смотрите также:

Другие советы

Я бы не стеснялся предоставить любые аргументы за такое изменение, если у вас не было веской причины сделать это изменение. Т.е. вы должны сбалансировать стоимость изменения в том, что вы бы лично сделали / предпочитали, против стоимости фактически реализации ее и преимущества.

Вы проверили, действительно ли использование NCHAR (1) болит производительность или падаешь в ловушку преждевременной оптимизации? Вы говорите только около 1 миллиона записей здесь.

Для незначительного хранения / стоимости IO вы думаете, что вы несете, рассмотрим общие часы человека для изменения, повторного тестирования и обновления системы * почасовой ставки против стоимости просто покупки более быстрого диска. Я подозреваю, что диск будет гораздо более дешевым, а также на пользу каждого аспекта системы.

Одна общая причина найти NCHAR (1) вместо бита, это то, что Oracle не поддерживает тип бита. Если у вас был разработчик Oracle или Oracle, или база данных, которая использовалась для запуска на Oracle, вы будете видеть это много. В SQL Server действительно нет необходимости в этом.

Тем не менее, я обнаружил, что большинство мест, где у меня есть битовое поле (или nchar (1) в Oracle), что я В самом деле ХОЧ - это DateTime, которое указывает не так много значение флага, но именно, когда он стал правдой. Это не всегда в этом случае, но когда я думаю о старом коде, я написал, я догадаю, что 4 из 5 раз я использовал немного поля, я должен был использовать DateTime.

Создайте битовое поле, добавьте компьютерный столбец, который эмулирует NCHAR (1) на данный момент.

Что не использовать nchar:

  • Y против y против некоторые unicode Y
  • Накладные расходы на проверку y или n
  • Не является «истинным» o «false» (например, не будет отображаться напрямую к .NET Boolean)
  • Y а также N английский. Ja / nein, oui / nont etc

Вы не должны индексировать это в любом случае, так что сводится к эффективному хранению и использованию. бит

  • меньший
  • Safeype Safe (например, не требуется проверки)
  • Карты к клиенту смысл напрямую
  • Независимо от региона

Сказать, что мы используем небольшое «когда-то» поле «когда-либо» в качестве заменителя для «истинного» поля. Null = активный.

Если вы используете LINQ2SQL или Framework Entity A BIT колонна переводится в bool, но NCHAR(1) будет переводить в string.

Используется ли поле широко в запросах Where fld = 'Y'?

Если это так, я бы рассмотрел проведение теста, чтобы увидеть, следует ли изменять его, чтобы его бит воздействовать на производительность.

Изменение его сейчас только потому, что он должен быть битовым полем, поскольку вы храните логические значения на таблице 1 м + записи, не похоже на хорошую идею для меня, и я иду с ответом @ Andrew's.

Используйте бит:

  • Логическое представление / выраженность намерения - поскольку булевы не всегда выражаются последовательно, как Yes or No, что тогда означало бы, что вы также должны быть несовместимыми в моделировании битов, либо неинтекости, например, True/False (T/F), On/Off (?O/F), Open/Closed(O/C) и т.п.

  • Собственная целостность - ненужным битом может быть ограничен только только 0 or 1. Отказ Если вы не добавите ограничения, ваш *char(1) может быть Y,N, X или .

  • Биты могут быть упакованы, Так что могло иметь меньшее хранение.

  • Re: Performance: индексирование колонн (или немногих состояний) столбцов обычно является отходом, если не существует высокая селективность 0 или 1 в данных. В этом случае Отфильтрованный индекс На селективное значение было бы хорошей идеей.

(Мигрировал из Удаленный ответ здесь)

У меня было несколько случаев, когда мы хотели немного поля, но не могли знать, что никогда не будет необходимость в третьей или четвертой ценности в этой области. Поэтому мы структурировали его как строковое поле, содержащее Y или N. Конечно, мы сделали это только в очень уникальных ситуациях.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top