Страница 1 из 2

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

Добавлено: 04 дек 2007, 07:54
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).".

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

Добавлено: 04 дек 2007, 10:17
hvlad
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).".
Ибо нехрен лазить в системных таблицах грязными руками

Добавлено: 04 дек 2007, 10:24
CyberMax
А есть возможности менять домен поля DDL-ными средствами, не извращаясь с временным полем?

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

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

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

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

Добавлено: 04 дек 2007, 10:56
hvlad
stix-s писал(а):
hvlad писал(а): А зачем ? Зачем вообще уменьшать р-р varchar поля ???

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

Добавлено: 04 дек 2007, 12:17
stix-s
hvlad писал(а):
stix-s писал(а):
hvlad писал(а): А зачем ? Зачем вообще уменьшать р-р varchar поля ???

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

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

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

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

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

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

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

Добавлено: 04 дек 2007, 14:05
CyberMax
Внесете в трекер?

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

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

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

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

select CAST(FIELD as NEWFIELDTYPE) from TABLE

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

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

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

Добавлено: 05 дек 2007, 09:46
kdv
Чем мешают удаленные записи?
версионность. ты хоть не прикидывайся.

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

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

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

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

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