Миграция IB6 -> FB2

Запросы, планы, оптимизация запросов, ...

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

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Миграция IB6 -> FB2

Сообщение Vas » 17 май 2006, 15:45

Здравствуйте !

Недавно попробовал ФБ2, и его скорость очень приятно удивила (на некоторых селектах выигрышь в 3 раза)
Какие поджидают грабли при переносе базы из IB6 под FB2.
Пока наткнулся на 2

1. Имена объектов (таблицы, тригеры, процедуры) не больше 27 символов
2. Разный синтаксис группировок
IB: GROUP BY FILED1, FIELD2
FB: GROUP BY АГРЕГАТ(FILED1), АГРЕГАТ(FIELD2)

Добавьте список, пожалуйста.

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Сообщение Vas » 17 май 2006, 15:47

Добавлю еще, что диалект 1.

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

Сообщение kdv » 17 май 2006, 16:39

по поводу синтаксиса группировок - все то же самое. Другое дело, что FB 2.0 как и FB 1.0 и 1.5 более жестко относится к некорректным запросам, которые ранее допускались во всей линейке IB. Поэтому некоторые запросы, разумеется, будут давать ошибку на FB. И такие запросы надо исправлять.
насчет имен объектов до 27 символов - это что-то новое, надо будет проверить.

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

Сообщение dimitr » 17 май 2006, 16:56

kdv писал(а):насчет имен объектов до 27 символов - это что-то новое, надо будет проверить
это чтобы RDB$SECURITY_CLASS не обрезался и гранты не глючили

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Сообщение Vas » 17 май 2006, 23:47

Еще такой вопрос по поводу группировок: я, вроде, заметил, что процедура с таким некорректным с точки зрения ФБ ( и корректным с т.з. ИБ ) запросом вполне нормально создается (т.е. поднимается из бэкапа), но при вызове дает какие-то странные ошибки. Можно ли это проконтролировать при ресторе из ФБ ?
Насчет 27-ми символов - в интербейсе их, по-моему 61.
И всё-таки, на что еще обратить внимание при переходе ? Где еще проглючить может ?

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

Сообщение dimitr » 18 май 2006, 00:38

1. странные ошибки - это что? Процитировать никак?
2. при ресторе ты ничего не проконтролируешь. Код будет работать как раньше. При пересоздании объектов могут быть ошибки.
3. 61 символ - в IB7. Ты же выше говорил про IB6?

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Сообщение Vas » 18 май 2006, 15:16

1. К сожалению ФБ пока снес, а ошибки не записал
2. А как автоматически пересоздать кучу процедур, связанных между собой ? ИБ эксперт умеет ? Может достаточно перекомпилять ?
3. Ошибся, извините. База под ИБ7 крутится, но ничего ИБ7-специфик в ней нет ( кроме нескольких очень длинных имен ). Синтаксис целиком совместим с 6-кой.

Slava Ekimov
Сообщения: 44
Зарегистрирован: 26 окт 2004, 14:30

Сообщение Slava Ekimov » 19 май 2006, 16:03

dimitr писал(а):
kdv писал(а):насчет имен объектов до 27 символов - это что-то новое, надо будет проверить
это чтобы RDB$SECURITY_CLASS не обрезался и гранты не глючили
Кстати, по этому поводу.
Вчера только выяснили практическим путем это ограничение.
Я со времен 5.6 помню, что объекты могут быть 32 символа. (или 31? не помню точно)
И нигде не написано про урезание до 27.
Сейчас специально искал - нету.
Очень хочется поругаться, но на кого не знаю.

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

Сообщение dimitr » 19 май 2006, 16:24

31 символ. Но борманы так криво реализовали секьюрность, что длина более 27 может привести к куче проблем с правами. Потому мы воткнули ограничение. Оно временное, в скором времени мы переделаем все по-человечески. Было ли документировано - честно говоря, не помню. Очень может быт, что и нет.

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

Сообщение dimitr » 13 июн 2006, 14:33

Slava Ekimov писал(а):Вчера только выяснили практическим путем это ограничение.
А я вчера таки решил проверить сам. И нифига не увидел, без проблем создав таблицу и процедуру с именем длиной в 31 символ :-) Пробовал на 1.5.3 и 2.0 - результат идентичен.

В общем, покажите мне дорогу к этой грабле :-)

Slava Ekimov
Сообщения: 44
Зарегистрирован: 26 окт 2004, 14:30

Сообщение Slava Ekimov » 14 июн 2006, 13:28

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

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

Сообщение dimitr » 14 июн 2006, 14:36

понятно. А то я подумал, что в 2.0 мы еще и создавать объекты длинее 27 символов запретили :-) Первый пост этой ветки на это указывает.

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Сообщение Vas » 21 сен 2006, 15:49

dimitr писал(а):А то я подумал, что в 2.0 мы еще и создавать объекты длинее 27 символов запретили :-) Первый пост этой ветки на это указывает.
Создавать (CREATE PROCEDURE и т.д.) я не пробовал, но из бэкапа процедуру с длинным именем двойка поднимать отказывается.

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Сообщение Vas » 21 сен 2006, 16:16

Сейчас внимательнее посмотрел свой вопрос, и понял, что про группировки неправильно спросил.
Там вот как на самом деле:
1. Работает в ИБ, не работает в ФБ
group by field1
ORDER BY field1
2. Работает в ФБ, не работает в ИБ
group by field1
ORDER BY АГРЕГАТ(field1)
Вот так вот.

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

Сообщение dimitr » 21 сен 2006, 23:12

Vas писал(а):1. Работает в ИБ, не работает в ФБ
group by field1
ORDER BY field1
недоговариваешь или брешешь. Полный запрос покажи.

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Сообщение Vas » 22 сен 2006, 13:06

dimitr писал(а):
Vas писал(а):1. Работает в ИБ, не работает в ФБ
group by field1
ORDER BY field1
недоговариваешь или брешешь. Полный запрос покажи.
Блин, точно набрехал. Имелось ввиду
group by field1
ORDER BY FIELD2

т.е. по другому полю сортировка.

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

Сообщение dimitr » 22 сен 2006, 13:17

и это правильно. Ибо чревато белибердой.

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

Сообщение kdv » 22 сен 2006, 15:44

и это правильно. Ибо чревато белибердой.
типа

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

select id, count(field)
group by id
order by field
?

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Сообщение Vas » 03 окт 2006, 16:48

Еще одно отличие. Датабаза - стандартный EMPLOYEE

Исходный запрос работает на обоих серверах без проблем:

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

select * from
department d
join department d1 on d.head_dept=d1.dept_no
left join employee emp on emp.emp_no=d.mngr_no
Теперь немного модифицируем его, перенеся джойн во вхерю. интербейс отрабатывает нормально, фаерберд выдает ошибку

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

select * from
department d,
 department d1
left join employee emp on emp.emp_no=d.mngr_no
where d.head_dept=d1.dept_no
Ошибка:
"The cursor identified in the update or delete statement is not positioned on a row.
No current record for fetch operation."

Офтопик
IBExpert'овцы! верните CTRL-C в MessageBox, а то руками набивать замучался

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

Сообщение Merlin » 03 окт 2006, 18:09

Vas писал(а):интербейс отрабатывает нормально, фаерберд выдает ошибку

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

select * from
department d,
 department d1
left join employee emp on emp.emp_no=d.mngr_no
where d.head_dept=d1.dept_no
Ошибка:
"The cursor identified in the update or delete statement is not positioned on a row.
No current record for fetch operation."
И правильно делает.
Vas писал(а): Офтопик
IBExpert'овцы! верните CTRL-C в MessageBox, а то руками набивать замучался
И все побежали искать Хвастунова.

Ответить