March 4, 2010

CHAR(x) или VARCHAR(x) или VARCHAR или TEXT

Выдержка из CHAR(x) vs. VARCHAR(x) vs. VARCHAR vs. TEXT с select * from depesz;

Оригинальная статья исключительно полно отвечает на один из самых часто задаваемых вопросов о PostgreSQL - Что лучше/быстрее/компактнее CHAR(x) или VARCHAR(x) или VARCHAR или TEXT? Не буду приводить в этом посте полный перевод, а только лишь пару выдержек, т.к., скорее всего, подавляющее большинство читателей заинтересует только ответ без исследования.

Выводы из результатов тестирования:

  1. Скорость create table, load data и create index - одинаковый результат для всех типов.

  2. Поиск по полям этих типов тоже показал одинаковую скорость.

  3. Для типов с ограничением по размеру, если вы не исключаете возможность его изменения в дальнейшем, то имеет смысл использовать TEXT+DOMAIN, т.к. в этом случае будет ShareLock, а не AccessExclusiveLock на таблицу.

  4. Если хотите ругаться на превышение размера триггером или CHECK констрейнтом, CHECK даст выигрыш скорости примерно в 2 раза.


Заключение автора статьи (depesz-а):

  • char(n) - занимает слишком много места когда имеем дела со значениями короче n, также может приводить к не ожиданным ошибкам из-за дополнения пробелами в конце, плюс проблемы с изменением ограничения размера.

  • varchar(n) - проблематично менять ограничение размера на "живой" базе.

  • varchar – тоже что и text.

  • text – по моему мнению победитель, над (n) типами потому что у него нет их проблем, и над varchar т.к. своё собственное имя.


Мой же выбор - text, и CHECK, если нужно ограничить размер.

5 comments:

Anonymous said...

А что значит "использовать TEXT+DOMAIN"?

grayhemp said...

@antage,

CREATE DOMAIN depesz_text as text;
ALTER DOMAIN depesz_text ADD CONSTRAINT max_length CHECK ( length(value) <= 16 );

MarketDigest said...

Такое впечатление, что char(), varchar() добавлены только для обеспечения совместимости с другими СУБД и упрощения переноса баз данных (например из MySQL).

Anonymous said...

Как мне говорили, на поле::text нельзя сделать индекс.

grayhemp said...

Можно, не верьте им :)

Post a Comment