FB 2.0.3. consistency check при создании индекса

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

FB 2.0.3. consistency check при создании индекса

Сообщение CyberMax » 04 дек 2007, 07:54

Возможно, данный случай есть в трекере.
Таблица:

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

CREATE TABLE SOME_TABLE (
    ID    INTEGER NOT NULL,
    NAME  VARCHAR(50) NOT NULL)
Запись:

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

INSERT INTO SOME_TABLE (ID, NAME)
    VALUES (1, 'Здесь 17 символов')
Меняем длину поля NAME c 50 до 10 символов. При открытии таблицы сервер пишет о переполнении (что естественно), а при создании индекса по полю NAME:
"internal gds software consistency check (can't continue after bugcheck).".

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: FB 2.0.3. consistency check при создании индекса

Сообщение hvlad » 04 дек 2007, 10:17

CyberMax писал(а):Возможно, данный случай есть в трекере.
Таблица:

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

CREATE TABLE SOME_TABLE (
    ID    INTEGER NOT NULL,
    NAME  VARCHAR(50) NOT NULL)
Запись:

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

INSERT INTO SOME_TABLE (ID, NAME)
    VALUES (1, 'Здесь 17 символов')
Меняем длину поля NAME c 50 до 10 символов. При открытии таблицы сервер пишет о переполнении (что естественно), а при создании индекса по полю NAME:
"internal gds software consistency check (can't continue after bugcheck).".
Ибо нехрен лазить в системных таблицах грязными руками

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 04 дек 2007, 10:24

А есть возможности менять домен поля DDL-ными средствами, не извращаясь с временным полем?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 04 дек 2007, 10:36

CyberMax писал(а):А есть возможности менять домен поля DDL-ными средствами, не извращаясь с временным полем?
Нет
А зачем ? Зачем вообще уменьшать р-р varchar поля ???

Я могу предположить ровно одну причину, но вряд ли её здесь назовут

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 04 дек 2007, 10:42

hvlad писал(а):
CyberMax писал(а):А есть возможности менять домен поля DDL-ными средствами, не извращаясь с временным полем?
Нет
А зачем ? Зачем вообще уменьшать р-р varchar поля ???

Я могу предположить ровно одну причину, но вряд ли её здесь назовут
Уменьшить р-р индексов, р-р БД? :)

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 04 дек 2007, 10:56

stix-s писал(а):
hvlad писал(а): А зачем ? Зачем вообще уменьшать р-р varchar поля ???

Я могу предположить ровно одну причину, но вряд ли её здесь назовут
Уменьшить р-р индексов, р-р БД? :)
Не угадал.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 04 дек 2007, 12:17

hvlad писал(а):
stix-s писал(а):
hvlad писал(а): А зачем ? Зачем вообще уменьшать р-р varchar поля ???

Я могу предположить ровно одну причину, но вряд ли её здесь назовут
Уменьшить р-р индексов, р-р БД? :)
Не угадал.
Глупость я сморозил, ни фига таким образом р-р не сэкономишь :(

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 04 дек 2007, 12:44

hvlad писал(а):Зачем вообще уменьшать р-р varchar поля ???
Например, если обновленные бизнес-правила ограничивают длину varchar-поля меньшей длиной.

Да и дело-то не в смене длины varchar, а в концепции :). Легальной команды смены домена не дали, но разрешили (или закрыли глаза на нее?) возможность менять его путем применения проктологических инструментов в виде IBE :roll:.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 04 дек 2007, 13:04

CyberMax писал(а):
hvlad писал(а):Зачем вообще уменьшать р-р varchar поля ???
Например, если обновленные бизнес-правила ограничивают длину varchar-поля меньшей длиной.
Вотпусть бизнес-правила и ограничивают. При чём тут физика хранения
CyberMax писал(а):Да и дело-то не в смене длины varchar, а в концепции :). Легальной команды смены домена не дали, но разрешили (или закрыли глаза на нее?) возможность менять его путем применения проктологических инструментов в виде IBE :roll:.
RTFM: ALTER TABLE ALTER COLUMN

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 04 дек 2007, 13:39

Почитал. Этот момент проскочил мимо внимания.
Кстати, Влад, есть какие-нибудь гарантированные побочные явления, когда длина varchar-поля меняется в меньшую сторону через вот такую правку систаблиц? И могут ли в будущем сделать проверку при ALTER COLUMN varchar-поля в сторону уменьшения длины на невыход фактических длин строк поля за указанные пределы и принятия изменения в случае положительного результата?

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 04 дек 2007, 13:51

Вроде и сейчас это можно сделать:
Стартанули снапшот, проверили длинны, если блоьше - откатились, меньше alter table... + commit.
В чём проблемы?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 04 дек 2007, 13:54

CyberMax писал(а):могут ли в будущем сделать проверку при ALTER COLUMN varchar-поля в сторону уменьшения длины на невыход фактических длин строк поля за указанные пределы и принятия изменения в случае положительного результата?
разве что с эксклюзивной блокировкой всей таблицы с момента ALTER и до коммита

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 04 дек 2007, 14:05

Внесете в трекер?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 04 дек 2007, 14:27

CyberMax писал(а):Кстати, Влад, есть какие-нибудь гарантированные побочные явления, когда длина varchar-поля меняется в меньшую сторону через вот такую правку систаблиц?
Сложно сказать. Надёжнее считать, что таки есть ;)
CyberMax писал(а):И могут ли в будущем сделать проверку при ALTER COLUMN varchar-поля в сторону уменьшения длины на невыход фактических длин строк поля за указанные пределы и принятия изменения в случае положительного результата?
А оно надо ?
Я, лично, предпочитаю заниматься чем-то реально полезным

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 04 дек 2007, 14:57

Особого удовольствия можно достичь, когда изменяемое хаком поле находится на одном из концов ФК :wink:

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

Сообщение kdv » 04 дек 2007, 17:07

CyberMax писал(а):И могут ли в будущем сделать проверку при ALTER COLUMN varchar-поля в сторону уменьшения длины на невыход фактических длин строк поля за указанные пределы и принятия изменения в случае положительного результата?
Tonal писал(а):Стартанули снапшот, проверили длинны, если блоьше - откатились, меньше alter table... + commit.
В чём проблемы?
объясняю двадцатый раз:

1. в базе может быть туча записей не видимых конкретной транзакции
2. индекс всегда при создании "видит" все версии
3. штатного уменьшения размера строки в сервере нет.
4. про столбцы с зависимостями, индексами и т.п. я вообще умолчу.
5. если делать проверку, то делать для любых преобразований типов из типа А в тип Б, а не только на длину строки. Т.е. вместо вас, задумчивых девелоперов, это должен делать сервер? А если там будет 500 тысяч версий, скажем, удаленных другой транзакцией? Ах, они же "удаленные"? Ой, а почему мне сервер через два часа после alter выдал отлуп?

select CAST(FIELD as NEWFIELDTYPE) from TABLE

мойте руки ПЕРЕД едой. А не во время и не после.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 05 дек 2007, 02:37

kdv писал(а):4. про столбцы с зависимостями, индексами и т.п. я вообще умолчу.
Но ведь сервер не дает изменить тип поля, если на него есть ссылки?
kdv писал(а):2. индекс всегда при создании "видит" все версии
Если нет существующих записей с данными, выходящими за пределы размерности - то индекс создается без проблем.
kdv писал(а):5. если делать проверку, то делать для любых преобразований типов из типа А в тип Б, а не только на длину строки.
Не соглашусь. Например, преобразование из SmallInt в Integer, из Integer в BigInt, а также Varchar(10) в Varchar(50), то есть в сторону увеличения - в настоящее время разрешено, а вот обратно - запрещено, по причине того, что неизвестно - будет ли потеря данных из-за усечения, или нет.

Чем мешают удаленные записи?

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

Сообщение kdv » 05 дек 2007, 09:46

Чем мешают удаленные записи?
версионность. ты хоть не прикидывайся.

короче, граждане, в сад. при изменении типа данных вы сами должны:

1. проверить конвертируемость на cast, для всех записей (fetchall)
2. убедиться что в данный момент нет застрявшей транзакции, которая чего-то модифицировала в противоречии с пунктом 1
3. если перед этим было массовое удаление или модификация записей, вы должны понимать что запрос п.1 может привести к сборке мусора (и лучше если приведет, чем оставит какие-нибудь древние версии с нарушением пункта 1)

то есть, фактически это делается в монопольном режиме.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 05 дек 2007, 09:57

kdv писал(а):1. проверить конвертируемость на cast, для всех записей (fetchall)
2. убедиться что в данный момент нет застрявшей транзакции, которая чего-то модифицировала в противоречии с пунктом 1
3. если перед этим было массовое удаление или модификация записей, вы должны понимать что запрос п.1 может привести к сборке мусора (и лучше если приведет, чем оставит какие-нибудь древние версии с нарушением пункта 1)
то есть, фактически это делается в монопольном режиме.
Фактически, с этим прекрасно может справиться и сервер. Выходит, вопрос только в том, надо ли это разработчикам и пользователям?

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

Сообщение kdv » 05 дек 2007, 10:48

Фактически, с этим прекрасно может справиться и сервер.
не может. вернее, теоретически может, но с учетом вероятности отлупа и вероятности прочесывания больших объемов данных, я бы не идеализировал возможность возложения этих задач на сервер.

Ответить