Число VS Варчар (2) Первичные ключи

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

STATUS (max 6)
AC --> Active
DE --> Deleted

COUNTRIES (total 30)
UK --> United Kingdom
IT --> Italy
GR --> Greece

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

В основной таблице приложения будут использоваться статус и страна (более одного раза, например, страна происхождения, страна назначения), и предполагается, что в год будет добавляться 600000 строк.

Итак, мой вопрос: будут ли эти ключи VARCHAR (2) влиять на производительность при запросе соединения трех таблиц. Первый будет значительно медленнее второго?

SELECT m.*,
       s.status_name,
       c.country_name
  FROM main m, status s, countries c
 WHERE m.status_cd = s.status_cd
   AND m.country_cd = c.country_cd
   AND m.status_cd = 'AC'
   AND m.country_cd = 'UK'

SELECT m.*,
       s.status_name,
       c.country_name
  FROM main m, status s, countries c
 WHERE m.status_cd = s.status_cd
   AND m.country_cd = c.country_cd
   AND m.status_cd = 1
   AND m.country_cd = 2

Уточнение:

Статус не двоичный («максимум 6» рядом с названием таблицы). Вероятно, значения будут такими:

* active
* deleted
* draft
* send
* replaced

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


person Community    schedule 27.11.2008    source источник
comment
Вы используете VARCHAR2 в Oracle или VARCHAR (2)? При использовании Oracle VARCHAR2 круглые скобки вводят в заблуждение. Если VARCHAR (2), то почему бы не CHAR (2), который обычно более эффективен.   -  person Jonathan Leffler    schedule 27.11.2008


Ответы (4)


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

Разница в производительности между соединениями с разными типами будет незначительной, а числовой код будет медленнее, так как данных для хранения «больше» (но все они настолько малы, что опять же незначительны).

Итак, придерживайтесь естественных кодов. Помимо всего прочего, SQL в первом примере более ясен; «Великобритания» и «AC» имеют гораздо большее значение, чем 1 и 2.

В СУБД, отличных от Oracle, вы, вероятно, использовали бы CHAR (2) как для значений статуса, так и для значений кода страны. Пользователи Oracle склонны использовать VARCHAR2 для всего; Я не уверен, есть ли штраф за использование вместо этого столбца CHAR (2), тем более что значения столбца имеют фиксированную длину. (Например, в Informix поле VARCHAR (2) - поле длиной до двух символов - будет хранить как 3 байта, длину (всегда 2 в вашем случае) и 2 байта данных. Напротив, CHAR (2 ) займет всего 2 байта.)

person Jonathan Leffler    schedule 27.11.2008
comment
В Oracle поля CHAR и VARCHAR хранятся на диске совершенно одинаково, за исключением того, что поле CHAR принудительно заполняется пробелом до указанной длины. - person Dracorat; 06.06.2012

Просмотрите эту ссылку. Итог: нет большой разницы в производительности между varchar и num. Так что вы должны выбрать то, что когда-либо имеет смысл для колонки. Здесь varchar, кажется, имеет больше смысла.

person anand.trex    schedule 27.11.2008

Если 'status' является (и всегда будет?) Бинарным активным / удаленным полем, зачем вообще возиться с таблицей. Похоже, нормализация доведена до непрактичной крайности.

Было бы определенно быстрее, не говоря уже о том, что проще было бы просто использовать поле tinyint (1) и записывать активное / удаленное состояние как 1 или 0.

Это полностью исключает одно из ваших объединений, что должно быть хорошо.

person philistyne    schedule 27.11.2008
comment
Поскольку в вопросе указано, что существует 6 кодов состояния, это не двоичное поле. - person Jonathan Leffler; 27.11.2008

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

person Coentje    schedule 27.11.2008