Оригинальная статья исключительно полно отвечает на один из самых часто задаваемых вопросов о PostgreSQL - Что лучше/быстрее/компактнее CHAR(x) или VARCHAR(x) или VARCHAR или TEXT? Не буду приводить в этом посте полный перевод, а только лишь пару выдержек, т.к., скорее всего, подавляющее большинство читателей заинтересует только ответ без исследования.
Выводы из результатов тестирования:
- Скорость create table, load data и create index - одинаковый результат для всех типов.
- Поиск по полям этих типов тоже показал одинаковую скорость.
- Для типов с ограничением по размеру, если вы не исключаете возможность его изменения в дальнейшем, то имеет смысл использовать TEXT+DOMAIN, т.к. в этом случае будет ShareLock, а не AccessExclusiveLock на таблицу.
- Если хотите ругаться на превышение размера триггером или CHECK констрейнтом, CHECK даст выигрыш скорости примерно в 2 раза.
Заключение автора статьи (depesz-а):
- char(n) - занимает слишком много места когда имеем дела со значениями короче n, также может приводить к не ожиданным ошибкам из-за дополнения пробелами в конце, плюс проблемы с изменением ограничения размера.
- varchar(n) - проблематично менять ограничение размера на "живой" базе.
- varchar – тоже что и text.
- text – по моему мнению победитель, над (n) типами потому что у него нет их проблем, и над varchar т.к. своё собственное имя.
Мой же выбор - text, и CHECK, если нужно ограничить размер.
5 comments:
А что значит "использовать TEXT+DOMAIN"?
@antage,
CREATE DOMAIN depesz_text as text;
ALTER DOMAIN depesz_text ADD CONSTRAINT max_length CHECK ( length(value) <= 16 );
Такое впечатление, что char(), varchar() добавлены только для обеспечения совместимости с другими СУБД и упрощения переноса баз данных (например из MySQL).
Как мне говорили, на поле::text нельзя сделать индекс.
Можно, не верьте им :)
Post a Comment