logo
Книга по БД(Вальке А

5.11.5. Сортировка и поиск по коротким полям. Классификаторы

Сортировка (т.е. использование раздела ORDER BY в операторе SELECT) требует очень больших времЕнных затрат. Особенно это касается больших таблиц. Сортировка, выполняемая по проиндексированным полям, происходит существенно быстрее, чем по непроиндексированным. Если же сортировка все же проводится по полям, для которых нет индекса, то лучше для сортировки использовать короткие поля (типа INTEGER, SMALLINT), нежели длинные (например, символьные). В условии WHERE операторов также предпочтительнее использовать короткие поля. Например, оператор

SELECT address FROM companies WHERE name=”АО Рога и Копыта”

будет в среднем выполняться дольше, нежели оператор

SELECT address FROM companies WHERE company_id=105

Это правило можно распространить и на использование классификаторов. Классификатор - это специально введенная таблица, в которой хранится набор возможных значений какого-либо атрибута. Предположим, для каждой фирмы требуется хранить ее тип (госпредприятие, ООО, АОЗТ и т.д.). Набор типов предприятия ограничен. В принципе, в таблице companies нетрудно предусмотреть на этот случай специальное символьное поле:

CREATE TABLE companies( . . . . . type CHAR(20) )

Сортировка и поиск по полю CHAR(20) nбудет происходить значительно медленне, чем по полю INTEGER. К тому же, если записей в таблице companies много, то использование поля INTEGER как ссылки на классификатор с типами предприятий вместо непосредственного задания этого значения в таблице даст экономию памяти. Поэтому более грамотным решением, на наш взгляд, является создание специального классификатора (таблицы types):

CREATE TABLE types ( type_id SERIAL UNIQUE, name CHAR(40) )

и введение в таблицу companies ссылки (внешнего ключа) на этот классификатор:

CREATE TABLE companies( . . . . . type INTEGER )

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

SELECT name, address FROM companies WHERE type = (SELECT type_id FROM types WHERE name = “ООО”)