2015-04-26 7 views
8

Я не пытаюсь перезапустить UUID и серийные деления целочисленного ключа. Я знаю, что с обеих сторон есть действительные баллы. Я использую UUID как первичный ключ в нескольких моих таблицах.PostgreSQL Производительность UUID типа

  • Тип колонки: "uuidKey" text NOT NULL
  • индекс: CREATE UNIQUE INDEX grand_pkey ON grand USING btree ("uuidKey")
  • первичного ключа: ADD CONSTRAINT grand_pkey PRIMARY KEY ("uuidKey");

Вот мой первый вопрос; с PostgreSQL 9.4 есть ли преимущество в производительности для установки типа столбца в UUID?

В документации http://www.postgresql.org/docs/9.4/static/datatype-uuid.html описывается UUID, но есть ли какие-либо преимущества помимо безопасности типа для использования этого типа вместо text? В документации по типам символов это означает, что char(n) не имеет никакого преимущества перед text в PostgreSQL.

Подсказка: Там нет разницы в производительности между этими тремя типами, кроме от увеличения дискового пространства при использовании пустого мягкого типа, а через несколько циклов дополнительного процессора, чтобы проверить длину при хранении в длина- ограниченный столбец. Хотя характер (n) имеет преимущества в некоторых других системах баз данных, в PostgreSQL нет такого преимущества ; на самом деле символ (n) обычно является самым медленным изиз-за его дополнительных затрат на хранение. В большинстве случаев вместо этого следует использовать текст или символ.

Я не беспокоюсь о дискового пространства, мне просто интересно, стоит ли мне сравнивать тесты UUID и текстовых столбцов?

Второй вопрос, хеш против индексов b-дерева. Нет смысла сортировать ключи UUID, так что у b-tree есть какие-либо другие преимущества по сравнению с хэш-индексом?

+0

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

+0

Возможно, я указал его в неправильном порядке. Индекс был автоматически создан с помощью ограничения первичного ключа. – adamek

+0

По-видимому, согласно документам (во время этого комментария 9.4 является последней стабильной версией), что использование хэш-индексов не рекомендуется: http://www.postgresql.org/docs/9.4/static/indexes -types.html –

ответ

14

A UUID - это значение в 16 байт. То же, что и text, составляет 32 байта. Размеры хранилища:

select 
    pg_column_size('a0eebc999c0b4ef8bb6d6bb9bd380a11'::text) as text_size, 
    pg_column_size('a0eebc999c0b4ef8bb6d6bb9bd380a11'::uuid) as uuid_size; 
text_size | uuid_size 
-----------+----------- 
     36 |  16 

Меньшие столы ведут к более быстрым операциям.