Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замена домена на живой БД / 10 сообщений из 10, страница 1 из 1
07.10.2013, 13:59:33
    #38418879
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
Вопросительный вопрос:

допустимо ли делать замену домена со сменой базового типа?

т.е.
varchar(100) -> blob subtype text
integer -> varchar(20)

и тому подобное.

сервер делает это без проблем. чревато ли боком?
...
Рейтинг: 0 / 0
07.10.2013, 14:06:41
    #38418892
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
pastor,

не желательно. Лучше через временный столбец. Хотя именно при таких заменах по идее проблем быть не должно. Меняешь как через системные таблицы или через ALTER COLUMN?
...
Рейтинг: 0 / 0
07.10.2013, 14:23:34
    #38418914
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
Симонов Денис,

Думаешь я это делаю по доброй воле? :(

системные таблицы.
2.5.2
...
Рейтинг: 0 / 0
07.10.2013, 14:37:07
    #38418936
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
pastor,

для второго случая всё можно сделать без системных таблиц

Код: sql
1.
2.
3.
4.
5.
6.
RECREATE TABLE T1 (
  MYFIELD INTEGER
);

ALTER TABLE T1
ALTER MYFIELD TYPE VARCHAR(20);



Все нормально проходит. Вот наоборот не пройдёт.

Код: sql
1.
2.
ALTER TABLE T1
ALTER MYFIELD TYPE INTEGER;



Код: plaintext
1.
2.
This operation is not defined for system tables.
unsuccessful metadata update.
Cannot change datatype for column MYFIELD from a character type to a non-character type.

И правильно делает.

А вот для смену на блоб не работает, хотя по идее ничего мешать этому не должно.

Код: sql
1.
2.
3.
4.
5.
6.
RECREATE TABLE T1 (
  MYFIELD VARCHAR(20)
);

ALTER TABLE T1
ALTER MYFIELD TYPE BLOB SUB_TYPE TEXT;



Код: plaintext
1.
2.
This operation is not defined for system tables.
unsuccessful metadata update.
Cannot change datatype for column MYFIELD.  Changing datatype is not supported for BLOB or ARRAY columns.
...
Рейтинг: 0 / 0
16.12.2013, 21:52:17
    #38502770
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
Я вот тоже хочу спросить.

Выяснил, что писать:
Код: sql
1.
Alter table MyTable alter column MyColumn type Integer not null

нехорошо, ибо:
1) синтаксис оператора не допускает not null, придётся сначала создать not null домен и после type указывать его;
2) если MyColumn было символьным, то получим шиш, как сказано выше "Cannot change datatype for column from a character type to a non-character type" ;

Если воспользоваться классическим способом и создавать временный столбец нужного типа, потом копировать в него данные из старого с приведением типа, потом грохнуть старый столбец и переименовать новый в старый - да, никаких проблем, сейчас так и делаю, но alter column type настолько влёт заменяет integer на varchar (миллион записей - за какие-то жалкие 0ms, по сравнению с 8s "классики"), что очень хочется воспользоваться этим скороходом по максимуму.

Подскажите, пожалуйста, как именно работает alter column type, откуда такая скорость? И где вообще можно почитать про ограничения на использование alter column type (плюс понять, почему он менее безопасен)?
...
Рейтинг: 0 / 0
16.12.2013, 22:27:19
    #38502799
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
MrCat,

вот здесь немного объясняется

http://www.ibase.ru/devinfo/metaver.htm

Синтаксис назначения для доменов и полей not null/null будет в FB3. Однако когда устанавливаешь not null, если в таблице будут данные, то скорость уже не будет большой, т.к. надо проверить все записи.
...
Рейтинг: 0 / 0
17.12.2013, 16:49:00
    #38503918
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
Ясно. Alter column меняет не записи, а формат. При вычитке записи и "разборе на поля", используется последний формат таблицы, и сырые данные записи трактуются в соответствии с ним. Т.е. меняются не данные, а правила трактовки. Теперь понятно, почему не рекомендуется, и насколько сие ограничено.

Удивительно, но я не вижу временнЫх затрат на приведение типа.
скрипты для проверки увеличения временнЫх затрат на фетч записей с изменённым типом
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create domain dom_test_chr char(12) not null;
create domain dom_test_int integer;

create table speedtest(
  test integer);

set term ^ ;
execute block
as
declare variable i Integer;
begin
    i = 1000000;
    while (i > 0) do
    begin
        insert into speedtest(test)
        values (:i);

        i = :i - 1;
    end
end^
set term ; ^
commit;

set STATs on;
select max(test) from speedtest;
set STATs off;
commit;


перед запуском второго скрипта я перезапускаю сервер, чтобы вычистить кэш. Наверное, есть более изящный способ очистить кэш, но я его не знаю.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
alter table speedtest alter column test type dom_test_int;
commit;

set STATs on;
select max(test) from speedtest;
set STATs off;
commit;

drop table speedtest;

drop domain dom_test_chr;
drop domain dom_test_int;



Оба окружённых set STAT запроса выполняются за 0,8 секунд, при почти равной прочей статистике. Второй работает даже чуть быстрее. Получается, что сервер не несёт дополнительных расходов на преобразование типа при фетче, но такого ведь не может быть! Подскажите, пожалуйста, где я неправ?
...
Рейтинг: 0 / 0
17.12.2013, 16:58:10
    #38503933
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
MrCatгде я неправ?
Ты неправ в оценке процента затрат на преобразование данных в общей трудоёмкости выборки
данных. Он упорно стремится к нулю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.12.2013, 16:58:57
    #38503937
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
'от я баклан, меняю int на int! Если во втором скрипте проставить замену на _chr домен, то времена получаются около 0,42 и 0,59 секунд соответственно, т.е. затраты на приведение типа есть. Лады, большое спасибо за помощь!
...
Рейтинг: 0 / 0
17.12.2013, 17:15:42
    #38503970
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замена домена на живой БД
И правда, полученная мной разница во времени скорее обусловлена разной сложностью сравнения текстовых и числовых данных. Спасибо, буду иметь в виду, что преобразование типа "на лету" - дешёвая операция.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замена домена на живой БД / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]