Не создается индекс по полю VARCHAR(254)

Администирование клиентской и серверной части InterBase, Firebird, Yaffil. Настройка файла конфигурации и т.п.

Модераторы: kdv, Alexey Kovyazin

Ответить
Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Не создается индекс по полю VARCHAR(254)

Сообщение Дмитрий » 22 дек 2014, 18:22

Доброго дня!
Имеем Interbase 2009, размер страницы БД 16384, в таблице codepage win1251, collate win1251.
В таблице есть поле FULL_NAME VARCHAR(254). По этому полю пытаюсь создать индекс. В результате получаю сообщение "key size exceeds implementation restriction for index". Вроде как размер индекса не должен быть больше 1/4 размера страницы БД? Или я ошибаюсь? В чем проблема?
P.S. Максимальный размер поля, по которому мне удалось создать индекс, VARCHAR(136).

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Не создается индекс по полю VARCHAR(254)

Сообщение kdv » 22 дек 2014, 22:43

Вроде как размер индекса не должен быть больше 1/4 размера страницы БД?
В Firebird - с версии 2.0. В InterBase - с версии XE.

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Re: Не создается индекс по полю VARCHAR(254)

Сообщение Дмитрий » 23 дек 2014, 09:40

kdv писал(а):
Вроде как размер индекса не должен быть больше 1/4 размера страницы БД?
В Firebird - с версии 2.0. В InterBase - с версии XE.
А в версии 2009?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Не создается индекс по полю VARCHAR(254)

Сообщение kdv » 23 дек 2014, 12:02

версия XE появилась позже 2009. Я удивлен, что нужно об этом сообщать :-)

на всякий случай
http://www.ibase.ru/devinfo/allversions.htm

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Re: Не создается индекс по полю VARCHAR(254)

Сообщение Дмитрий » 23 дек 2014, 12:35

kdv писал(а):версия XE появилась позже 2009. Я удивлен, что нужно об этом сообщать :-)
Да это я знаю, не совсем тупой :-) Вопрос был о максимальном размере текстового поля, по которому можно построить индекс в Interbase 2009!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Не создается индекс по полю VARCHAR(254)

Сообщение kdv » 23 дек 2014, 15:12

надо было конкретизировать :-)
пока не стало 1/4 размера страницы, всегда было, например для win1251 (это двухбайтовый чарсет) - 252 байта без collate, 84 байта с collate, и тут размер страницы не влияет.
Обращаю внимание, что символы могут состоять из нескольких байт, например, в UTF8 (поддерживается и в ИБ, и в ФБ) с этим делом еще хуже, т.е. нужно макс. размер делить на 4, в том числе даже если размер ключа 1/4 страницы в новых версиях.

www.ibase.ru/devinfo/ibrusfaq.htm
www.ibase.ru/unicode_faq.html

если используется utf8 да еще с collate, то размер символа в ключе получается 6 байт, а не 4.
http://www.sql.ru/forum/892796/pagesize ... ar-169-why

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Re: Не создается индекс по полю VARCHAR(254)

Сообщение Дмитрий » 23 дек 2014, 16:20

Что-то я совсем запутался... У меня win1251 c collate. Опытным путем подобрал размер поля varchar(136). Индекс создался, backup восстанавливается, все хорошо. Вот эти 136 символов я никак не могу увязать ни с 252-я байтами, ни с 84-я. Где я ошибаюсь? Тогда по логике, с collate и win1251 у меня максимальный размер поля в индексе должен быть 84 символа, а у меня 136?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Не создается индекс по полю VARCHAR(254)

Сообщение kdv » 23 дек 2014, 17:13

collate win1251 - это нонсенс. upper работает только в collate pxw_cyrl, а коллэйт win1251 "пустой". Поэтому его надо убирать.
максимальный размер поля в индексе должен быть 84 символа, а у меня 136?
84 - для collate pxw_cyrl. поскольку вы влепили пустопорожний коллэйт win1251, у вас 136. А могло бы быть и 252, если уберете коллэйт. Откуда вы его взяли, кстати? я не припомню, чтобы кто-нибудь когда-либо советовал этот коллэйт использовать.

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Re: Не создается индекс по полю VARCHAR(254)

Сообщение Дмитрий » 25 дек 2014, 11:26

поскольку вы влепили пустопорожний коллэйт win1251, у вас 136. А могло бы быть и 252, если уберете коллэйт. Откуда вы его взяли, кстати? я не припомню, чтобы кто-нибудь когда-либо советовал этот коллэйт использовать.
Я его не указывал. Он отображается при создании поля в IBExpert-е. Однкао, если посмотреть скрипт, то там будет

Код: Выделить всё

FULL_NAME     VARCHAR(252)
а если коллэйт указать, то будет

Код: Выделить всё

FULL_NAME     VARCHAR(252)  COLLATE PXW_CYRL
Отсюда делаю вывод, что коллэйт WIN1251 просто отображается в интерфейсе IBExpert-а, а фактически он не указан. Тогда не ясно, почему по полю размером в 137 символов индекс уже не строится.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Не создается индекс по полю VARCHAR(254)

Сообщение kdv » 25 дек 2014, 14:51

вы где-то говорите неправду.
Только что на IB 2009 сделал:
1. создал базу в win1251
2. создал таблицу со столбцом name1 varchar(252)
3. создал индекс по name1

Код: Выделить всё

CREATE TABLE X (
    ID     INTEGER NOT NULL,
    NAME1  VARCHAR(252));

ALTER TABLE X ADD CONSTRAINT PK_X PRIMARY KEY (ID);
CREATE INDEX BYNAME1 ON X (NAME1);
никаких ошибок.

p.s. рекомендую проверять такие вещи самостоятельно, на пустой базе, это занимает 1-2 минуты вашего времени, не чужого.

Ответить