Как стать автором
Обновить

Сравнение заполнения данными баз данных Firebird 5 и PostgreSQL 17

Уровень сложностиСредний
Время на прочтение25 мин
Количество просмотров977

Задача: создать одинаковые таблицы с определенными типами данных, заполнить одинаковыми данными в количестве 1 млн строк, сравнить размеры таблицы и базы данных.

Создаем две базы данных Firebird и PostgreSQL в кодировке UTF8.

Для сравнения выберем следующие типы данных:

  • boolean

  • char

  • varchar

  • date

  • integer

  • numeric

  • float

  • time

  • time with timezone

  • timestamp

  • timestamp with timezone

Для char и varcher выберем длину 50 и 200 символов, numeric длину 15 и точность 10. Таблицы создаем шириной 12 полей + суррогатный ключ integer.

Создаем таблицы и заполняем данными:

Тип данных boolean

CREATE TABLE T_BOOL_12 (
    ID         INTEGER GENERATED BY DEFAULT AS IDENTITY,
    T_BOOL_1   BOOLEAN,
    T_BOOL_2   BOOLEAN,
    T_BOOL_3   BOOLEAN,
    T_BOOL_4   BOOLEAN,
    T_BOOL_5   BOOLEAN,
    T_BOOL_6   BOOLEAN,
    T_BOOL_7   BOOLEAN,
    T_BOOL_8   BOOLEAN,
    T_BOOL_9   BOOLEAN,
    T_BOOL_10  BOOLEAN,
    T_BOOL_11  BOOLEAN,
    T_BOOL_12  BOOLEAN
);

Данные заполняются запросами до достижения 1 млн строк

INSERT INTO T_BOOL_12 (T_BOOL_1, T_BOOL_2, T_BOOL_3, T_BOOL_4, T_BOOL_5, T_BOOL_6, T_BOOL_7, T_BOOL_8, T_BOOL_9, T_BOOL_10, T_BOOL_11, T_BOOL_12)
VALUES (TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE);
INSERT INTO T_BOOL_12 (T_BOOL_1, T_BOOL_2, T_BOOL_3, T_BOOL_4, T_BOOL_5, T_BOOL_6, T_BOOL_7, T_BOOL_8, T_BOOL_9, T_BOOL_10, T_BOOL_11, T_BOOL_12)
VALUES (FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);

Тип данных char(200)

CREATE TABLE T_CHAR_12_200 (
    ID       INTEGER GENERATED BY DEFAULT AS IDENTITY,
    CHAR_1   CHAR(200),
    CHAR_2   CHAR(200),
    CHAR_3   CHAR(200),
    CHAR_4   CHAR(200),
    CHAR_5   CHAR(200),
    CHAR_6   CHAR(200),
    CHAR_7   CHAR(200),
    CHAR_8   CHAR(200),
    CHAR_9   CHAR(200),
    CHAR_10  CHAR(200),
    CHAR_11  CHAR(200),
    CHAR_12  CHAR(200)
);

Данные заполняются запросом до достижения 1 млн строк (запрос укорочен)

INSERT INTO T_CHAR_12_200 (CHAR_1, CHAR_2, CHAR_3, CHAR_4, CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9, CHAR_10, CHAR_11, CHAR_12) VALUES ('C++ is a horrible language.It''s made more horrible by the fact that a lot of substandard programmers use it,to the point where it''s much much easier to generate total and utter crap with it.Torvalds.',...);

Тип данных char(50)

CREATE TABLE T_CHAR_12_50 (
    ID       INTEGER GENERATED BY DEFAULT AS IDENTITY,
    CHAR_1   CHAR(50),
    CHAR_2   CHAR(50),
    CHAR_3   CHAR(50),
    CHAR_4   CHAR(50),
    CHAR_5   CHAR(50),
    CHAR_6   CHAR(50),
    CHAR_7   CHAR(50),
    CHAR_8   CHAR(50),
    CHAR_9   CHAR(50),
    CHAR_10  CHAR(50),
    CHAR_11  CHAR(50),
    CHAR_12  CHAR(50)
);

Данные заполняются запросом до достижения 1 млн строк (запрос укорочен)

INSERT INTO T_CHAR_12_50 (CHAR_1, CHAR_2, CHAR_3, CHAR_4, CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9, CHAR_10, CHAR_11, CHAR_12) VALUES ( 'Talk is cheap . Show me the code. Linus Torvalds.', ...);

Тип данных date

CREATE TABLE T_DATE_12 (
    ID         INTEGER GENERATED BY DEFAULT AS IDENTITY,
    T_DATE_1   DATE,
    T_DATE_2   DATE,
    T_DATE_3   DATE,
    T_DATE_4   DATE,
    T_DATE_5   DATE,
    T_DATE_6   DATE,
    T_DATE_7   DATE,
    T_DATE_8   DATE,
    T_DATE_9   DATE,
    T_DATE_10  DATE,
    T_DATE_11  DATE,
    T_DATE_12  DATE
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_DATE_12 (IT_DATE_1, T_DATE_2, T_DATE_3, T_DATE_4, T_DATE_5, T_DATE_6, T_DATE_7, T_DATE_8, T_DATE_9, T_DATE_10, T_DATE_11, T_DATE_12) VALUES ('1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001', '1-JAN-2001');

Тип данных integer

CREATE TABLE T_INT12 (
    ID      INTEGER GENERATED BY DEFAULT AS IDENTITY,
    INT_1   INTEGER,
    INT_2   INTEGER,
    INT_3   INTEGER,
    INT_4   INTEGER,
    INT_5   INTEGER,
    INT_6   INTEGER,
    INT_7   INTEGER,
    INT_8   INTEGER,
    INT_9   INTEGER,
    INT_10  INTEGER,
    INT_11  INTEGER,
    INT_12  INTEGER
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_INT12 (INT_1, INT_2, INT_3, INT_4, INT_5, INT_6, INT_7, INT_8, INT_9, INT_10, INT_11, INT_12) VALUES (314159265, 314159265, 314159265, 314159265, 314159265, 314159265, 314159265, 314159265, 314159265, 314159265, 314159265, 314159265);

Тип данных numeric

CREATE TABLE T_NUM_12 (
    ID        INTEGER GENERATED BY DEFAULT AS IDENTITY,
    T_NUM_1   NUMERIC(15,10),
    T_NUM_2   NUMERIC(15,10),
    T_NUM_3   NUMERIC(15,10),
    T_NUM_4   NUMERIC(15,10),
    T_NUM_5   NUMERIC(15,10),
    T_NUM_6   NUMERIC(15,10),
    T_NUM_7   NUMERIC(15,10),
    T_NUM_8   NUMERIC(15,10),
    T_NUM_9   NUMERIC(15,10),
    T_NUM_10  NUMERIC(15,10),
    T_NUM_11  NUMERIC(15,10),
    T_NUM_12  NUMERIC(15,10)
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_NUM_12 (T_NUM_1, T_NUM_2, T_NUM_3, T_NUM_4, T_NUM_5, T_NUM_6, T_NUM_7, T_NUM_8, T_NUM_9, T_NUM_10, T_NUM_11, T_NUM_12) VALUES (3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535, 3.1415926535);

Тип данных real (float)

CREATE TABLE T_REAL_12 (
    ID         INTEGER GENERATED BY DEFAULT AS IDENTITY,
    T_REAL_1   FLOAT,
    T_REAL_2   FLOAT,
    T_REAL_3   FLOAT,
    T_REAL_4   FLOAT,
    T_REAL_5   FLOAT,
    T_REAL_6   FLOAT,
    T_REAL_7   FLOAT,
    T_REAL_8   FLOAT,
    T_REAL_9   FLOAT,
    T_REAL_10  FLOAT,
    T_REAL_11  FLOAT,
    T_REAL_12  FLOAT
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_REAL_12 (T_REAL_1, T_REAL_2, T_REAL_3, T_REAL_4, T_REAL_5, T_REAL_6, T_REAL_7, T_REAL_8, T_REAL_9, T_REAL_10, T_REAL_11, T_REAL_12) VALUES (3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257, 3.14159274101257);

Тип данных time

CREATE TABLE T_TIME_12 (
    ID         INTEGER GENERATED BY DEFAULT AS IDENTITY,
    T_TIME_1   TIME,
    T_TIME_2   TIME,
    T_TIME_3   TIME,
    T_TIME_4   TIME,
    T_TIME_5   TIME,
    T_TIME_6   TIME,
    T_TIME_7   TIME,
    T_TIME_8   TIME,
    T_TIME_9   TIME,
    T_TIME_10  TIME,
    T_TIME_11  TIME,
    T_TIME_12  TIME
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_TIME_12 (ID, T_TIME_1, T_TIME_2, T_TIME_3, T_TIME_4, T_TIME_5, T_TIME_6, T_TIME_7, T_TIME_8, T_TIME_9, T_TIME_10, T_TIME_11, T_TIME_12) VALUES (1, '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05');

Тип данных time with time zone

CREATE TABLE T_TIME_WTZ_12 (
    ID             INTEGER GENERATED BY DEFAULT AS IDENTITY,
    T_TIME_WTZ_1   TIME WITH TIME ZONE,
    T_TIME_WTZ_2   TIME WITH TIME ZONE,
    T_TIME_WTZ_3   TIME WITH TIME ZONE,
    T_TIME_WTZ_4   TIME WITH TIME ZONE,
    T_TIME_WTZ_5   TIME WITH TIME ZONE,
    T_TIME_WTZ_6   TIME WITH TIME ZONE,
    T_TIME_WTZ_7   TIME WITH TIME ZONE,
    T_TIME_WTZ_8   TIME WITH TIME ZONE,
    T_TIME_WTZ_9   TIME WITH TIME ZONE,
    T_TIME_WTZ_10  TIME WITH TIME ZONE,
    T_TIME_WTZ_11  TIME WITH TIME ZONE,
    T_TIME_WTZ_12  TIME WITH TIME ZONE
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_TIME_WTZ_12 (T_TIME_WTZ_1, T_TIME_WTZ_2, T_TIME_WTZ_3, T_TIME_WTZ_4, T_TIME_WTZ_5, T_TIME_WTZ_6, T_TIME_WTZ_7, T_TIME_WTZ_8, T_TIME_WTZ_9, T_TIME_WTZ_10, T_TIME_WTZ_11, T_TIME_WTZ_12) VALUES ('5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05', '5:05:05');

Тип данных timestamp

CREATE TABLE T_TSTAMP_12 (
    ID           INTEGER GENERATED BY DEFAULT AS IDENTITY,
    T_TSTAMP_1   TIMESTAMP,
    T_TSTAMP_2   TIMESTAMP,
    T_TSTAMP_3   TIMESTAMP,
    T_TSTAMP_4   TIMESTAMP,
    T_TSTAMP_5   TIMESTAMP,
    T_TSTAMP_6   TIMESTAMP,
    T_TSTAMP_7   TIMESTAMP,
    T_TSTAMP_8   TIMESTAMP,
    T_TSTAMP_9   TIMESTAMP,
    T_TSTAMP_10  TIMESTAMP,
    T_TSTAMP_11  TIMESTAMP,
    T_TSTAMP_12  TIMESTAMP
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_TSTAMP_12 (T_TSTAMP_1, T_TSTAMP_2, T_TSTAMP_3, T_TSTAMP_4, T_TSTAMP_5, T_TSTAMP_6, T_TSTAMP_7, T_TSTAMP_8, T_TSTAMP_9, T_TSTAMP_10, T_TSTAMP_11, T_TSTAMP_12) VALUES ('1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00', '1-JAN-2001 00:00:00');

Тип данных timestamp with time zone

CREATE TABLE T_TSTAMP_WTZ_12 (
    ID               INTEGER GENERATED BY DEFAULT AS IDENTITY,
    T_TSTAMP_WTZ_1   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_2   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_3   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_4   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_5   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_6   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_7   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_8   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_9   TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_10  TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_11  TIMESTAMP WITH TIME ZONE,
    T_TSTAMP_WTZ_12  TIMESTAMP WITH TIME ZONE
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_TSTAMP_WTZ_12 (T_TSTAMP_WTZ_1, T_TSTAMP_WTZ_2, T_TSTAMP_WTZ_3, T_TSTAMP_WTZ_4, T_TSTAMP_WTZ_5, T_TSTAMP_WTZ_6, T_TSTAMP_WTZ_7, T_TSTAMP_WTZ_8, T_TSTAMP_WTZ_9, T_TSTAMP_WTZ_10, T_TSTAMP_WTZ_11, T_TSTAMP_WTZ_12) VALUES ('1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05', '1-JAN-2001 05:05:05');

Тип данных varcher(200)

CREATE TABLE T_VARCHAR_12_200 (
    ID          INTEGER GENERATED BY DEFAULT AS IDENTITY,
    VARCHAR_1   VARCHAR(200),
    VARCHAR_2   VARCHAR(200),
    VARCHAR_3   VARCHAR(200),
    VARCHAR_4   VARCHAR(200),
    VARCHAR_5   VARCHAR(200),
    VARCHAR_6   VARCHAR(200),
    VARCHAR_7   VARCHAR(200),
    VARCHAR_8   VARCHAR(200),
    VARCHAR_9   VARCHAR(200),
    VARCHAR_10  VARCHAR(200),
    VARCHAR_11  VARCHAR(200),
    VARCHAR_12  VARCHAR(200)
);

Данные заполняются запросом до достижения 1 млн строк (запрос укорочен)

INSERT INTO T_VARCHAR_12_200 (ID, VARCHAR_1, VARCHAR_2, VARCHAR_3, VARCHAR_4, VARCHAR_5, VARCHAR_6, VARCHAR_7, VARCHAR_8, VARCHAR_9, VARCHAR_10, VARCHAR_11, VARCHAR_12) VALUES (1, 'C++ is a horrible language.It''s made more horrible by the fact that a lot of substandard programmers use it,to the point where it''s much much easier to generate total and utter crap with it.Torvalds. ', ...');

Тип данных varchar(50)

CREATE TABLE T_VARCHAR_12_50 (
    ID          INTEGER GENERATED BY DEFAULT AS IDENTITY,
    VARCHAR_1   VARCHAR(50),
    VARCHAR_2   VARCHAR(50),
    VARCHAR_3   VARCHAR(50),
    VARCHAR_4   VARCHAR(50),
    VARCHAR_5   VARCHAR(50),
    VARCHAR_6   VARCHAR(50),
    VARCHAR_7   VARCHAR(50),
    VARCHAR_8   VARCHAR(50),
    VARCHAR_9   VARCHAR(50),
    VARCHAR_10  VARCHAR(50),
    VARCHAR_11  VARCHAR(50),
    VARCHAR_12  VARCHAR(50)
);

Данные заполняются запросом до достижения 1 млн строк

INSERT INTO T_VARCHAR_12_50 (ID, VARCHAR_1, VARCHAR_2, VARCHAR_3, VARCHAR_4, VARCHAR_5, VARCHAR_6, VARCHAR_7, VARCHAR_8, VARCHAR_9, VARCHAR_10, VARCHAR_11, VARCHAR_12) VALUES (1, 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ', 'Talk is cheap . Show me the code. Linus Torvalds. ');

В результате мы получаем две базы данных, заполненные одинаковыми данными. Сравним размер баз данных. Для получения размера базы данных Firebird воспользуемся утилитой isql, для PostgreSQL утилитой psql.

Размер базы данных Firebird:

Database: 'localhost:c:\DBASE\FB5\ETL3.FDB', User: SYSDBA
SQL> select (MON$PAGE_SIZE * MON$PAGES)/1048576 from MON$DATABASE;
DIVIDE
=============================================
7863

Размер базы данных PostgreSQL:

Список баз данных

Имя

Владелец

Кодировка

Провайдер локали

LC_COLLATE

LC_CTYPE

Размер

ETL3

postgres

UTF8

libc

C

C

7864 MB

Размер одинаковый. Проверим размер таблиц по разным типам данных. Для получения размера таблицы Firebird воспользуемся утилитой gstat, для получения размера таблицы PostgreSQL воспользуемся утилитой psql. Данные сведем в единую таблицу:

Размеры таблиц по типам данных

Таблица

PostgreSQL (MB)

Firebird (MB)

t_bool_12

42

53.63

t_char_12_200

2728

2604.25

t_char_12_50

651

679.38

t_date_12

81

99.63

t_int12

81

99.63

t_num_12

159

146.13

t_real_12

128

99.63

t_time_12

128

99.63

t_time_wtz_12

223

146.13

t_tstamp_12

128

146.13

t_tstamp_wtz_12

128

233.25

t_varchar_12_200

2728

2604.25

t_varchar_12_50

651

710.25

По таблице видно, что таблицы PostgreSQL, хранящие данные в целочисленных типах занимают меньше места, а Firebird данные с фиксированной и плавающей точкой и символьные типы.

Сравнение заполнения данными баз данных Firebird 5 и PostgreSQL 17 после обновления 25% и 50% всех таблиц

Задача: обновить данные в ранее созданных таблицах запросами, затрагивающих 25% и 50% строк. Сравниваем два ранее созданные базы данных.

Для Firebird: Размер базы данных до обновления данных 7863 MB Выполним скрипт со следующими запросами:

update T_VARCHAR_12_200 set 
    VARCHAR_1 = reverse(VARCHAR_1),VARCHAR_2 = reverse(VARCHAR_2),VARCHAR_3 = reverse(VARCHAR_3),
    VARCHAR_4 = reverse(VARCHAR_4),VARCHAR_5 = reverse(VARCHAR_5),VARCHAR_6 = reverse(VARCHAR_6),
    VARCHAR_7 = reverse(VARCHAR_7),VARCHAR_8 = reverse(VARCHAR_8),VARCHAR_9 = reverse(VARCHAR_9),
    VARCHAR_10 = reverse(VARCHAR_10),VARCHAR_11 = reverse(VARCHAR_11),VARCHAR_12 = reverse(VARCHAR_12)
where ID < 250001;

update T_VARCHAR_12_50 set 
    VARCHAR_1 = reverse(VARCHAR_1),VARCHAR_2 = reverse(VARCHAR_2),VARCHAR_3 = reverse(VARCHAR_3),
    VARCHAR_4 = reverse(VARCHAR_4),VARCHAR_5 = reverse(VARCHAR_5),VARCHAR_6 = reverse(VARCHAR_6),
    VARCHAR_7 = reverse(VARCHAR_7),VARCHAR_8 = reverse(VARCHAR_8),VARCHAR_9 = reverse(VARCHAR_9),
    VARCHAR_10 = reverse(VARCHAR_10),VARCHAR_11 = reverse(VARCHAR_11),VARCHAR_12 = reverse(VARCHAR_12)
where ID < 250001;

update T_CHAR_12_200 set 
    CHAR_1 = reverse(CHAR_1),CHAR_2 = reverse(CHAR_2),CHAR_3 = reverse(CHAR_3),
    CHAR_4 = reverse(CHAR_4),CHAR_5 = reverse(CHAR_5),CHAR_6 = reverse(CHAR_6),
    CHAR_7 = reverse(CHAR_7),CHAR_8 = reverse(CHAR_8),CHAR_9 = reverse(CHAR_9),
    CHAR_10 = reverse(CHAR_10),CHAR_11 = reverse(CHAR_11),CHAR_12 = reverse(CHAR_12)
where ID < 250001;

update T_CHAR_12_50 set 
    CHAR_1 = reverse(CHAR_1),CHAR_2 = reverse(CHAR_2),CHAR_3 = reverse(CHAR_3),
    CHAR_4 = reverse(CHAR_4),CHAR_5 = reverse(CHAR_5),CHAR_6 = reverse(CHAR_6),
    CHAR_7 = reverse(CHAR_7),CHAR_8 = reverse(CHAR_8),CHAR_9 = reverse(CHAR_9),
    CHAR_10 = reverse(CHAR_10),CHAR_11 = reverse(CHAR_11),CHAR_12 = reverse(CHAR_12)
where ID < 250001;

update T_INT12 set
    INT_1 = (INT_1-1000),INT_2 = INT_2-1000,INT_3 = INT_3-1000,INT_4 = INT_4-1000,
    INT_5 = INT_5-1000,INT_6 = INT_6-1000,INT_7 = INT_7-1000,INT_8 = INT_8-1000,
    INT_9 = INT_9-1000,INT_10 = INT_10-1000,INT_11 = INT_11-1000,INT_12 = INT_12-1000
where ID < 250001;

update T_DATE_12 set
    T_DATE_1 = DATEADD(365 day to T_DATE_1),T_DATE_2 = DATEADD(365 day to T_DATE_2),T_DATE_3 = DATEADD(365 day to T_DATE_3),
    T_DATE_4 = DATEADD(365 day to T_DATE_4),T_DATE_5 = DATEADD(365 day to T_DATE_5),T_DATE_6 = DATEADD(365 day to T_DATE_6),
    T_DATE_7 = DATEADD(365 day to T_DATE_7),T_DATE_8 = DATEADD(365 day to T_DATE_8),T_DATE_9 = DATEADD(365 day to T_DATE_9),
    T_DATE_10 = DATEADD(365 day to T_DATE_10),T_DATE_11 = DATEADD(365 day to T_DATE_11),T_DATE_12 = DATEADD(365 day to T_DATE_12)
where ID < 250001;

update T_BOOL_12 set
    T_BOOL_1 = T_BOOL_2,T_BOOL_2 = T_BOOL_1,T_BOOL_3 = T_BOOL_2,T_BOOL_4 = T_BOOL_1,T_BOOL_5 = T_BOOL_2,T_BOOL_6 = T_BOOL_1,
    T_BOOL_7 = T_BOOL_2,T_BOOL_8 = T_BOOL_1,T_BOOL_9 = T_BOOL_2,T_BOOL_10 = T_BOOL_1,T_BOOL_11 = T_BOOL_2,T_BOOL_12 = T_BOOL_1
where ID < 250001;

update T_REAL_12 set
    T_REAL_1 = T_REAL_1 - 10000,T_REAL_2 = T_REAL_2 - 10000,T_REAL_3 = T_REAL_2 - 10000,T_REAL_4 = T_REAL_4 - 10000,
    T_REAL_5 = T_REAL_5 - 10000,T_REAL_6 = T_REAL_6 - 10000,T_REAL_7 = T_REAL_7 - 10000,T_REAL_8 = T_REAL_8 - 10000,
    T_REAL_9 = T_REAL_9 - 10000,T_REAL_10 = T_REAL_10 - 10000,T_REAL_11 = T_REAL_11 - 10000,T_REAL_12 = T_REAL_12 - 10000
where ID < 250001;

update T_NUM_12 set
    T_NUM_1 = T_NUM_1 - 10000,T_NUM_2 = T_NUM_2 - 10000,T_NUM_3 = T_NUM_2 - 10000,T_NUM_4 = T_NUM_4 - 10000,
    T_NUM_5 = T_NUM_5 - 10000,T_NUM_6 = T_NUM_6 - 10000,T_NUM_7 = T_NUM_7 - 10000,T_NUM_8 = T_NUM_8 - 10000,
    T_NUM_9 = T_NUM_9 - 10000,T_NUM_10 = T_NUM_10 - 10000,T_NUM_11 = T_NUM_11 - 10000,T_NUM_12 = T_NUM_12 - 10000
where ID < 250001;

update T_TIME_12 set
   T_TIME_1 = DATEADD(minute,60, T_TIME_1),T_TIME_2 = DATEADD(minute,60, T_TIME_2),T_TIME_3 = DATEADD(minute,60, T_TIME_3),
   T_TIME_4 = DATEADD(minute,60, T_TIME_4),T_TIME_5 = DATEADD(minute,60, T_TIME_5),T_TIME_6 = DATEADD(minute,60, T_TIME_6),
   T_TIME_7 = DATEADD(minute,60, T_TIME_7),T_TIME_8 = DATEADD(minute,60, T_TIME_8),T_TIME_9 = DATEADD(minute,60, T_TIME_9),
   T_TIME_10 = DATEADD(minute,60, T_TIME_10),T_TIME_11 = DATEADD(minute,60, T_TIME_11),T_TIME_12 = DATEADD(minute,60, T_TIME_12)
where ID < 250001;

update T_TIME_WTZ_12 set
    T_TIME_WTZ_1 = DATEADD(minute,60, T_TIME_WTZ_1),T_TIME_WTZ_2 = DATEADD(minute,60, T_TIME_WTZ_2),T_TIME_WTZ_3 = DATEADD(minute,60, T_TIME_WTZ_3),
    T_TIME_WTZ_4 = DATEADD(minute,60, T_TIME_WTZ_4),T_TIME_WTZ_5 = DATEADD(minute,60, T_TIME_WTZ_5),T_TIME_WTZ_6 = DATEADD(minute,60, T_TIME_WTZ_6),
    T_TIME_WTZ_7 = DATEADD(minute,60, T_TIME_WTZ_7),T_TIME_WTZ_8 = DATEADD(minute,60, T_TIME_WTZ_8),T_TIME_WTZ_9 = DATEADD(minute,60, T_TIME_WTZ_9),
    T_TIME_WTZ_10 = DATEADD(minute,60, T_TIME_WTZ_10),T_TIME_WTZ_11 = DATEADD(minute,60, T_TIME_WTZ_11),T_TIME_WTZ_12 = DATEADD(minute,60, T_TIME_WTZ_12)
where ID < 250001;

update T_TSTAMP_12 set
    T_TSTAMP_1 = DATEADD(minute,60, T_TSTAMP_1),T_TSTAMP_2 = DATEADD(minute,60, T_TSTAMP_2),T_TSTAMP_3 = DATEADD(minute,60, T_TSTAMP_3),
    T_TSTAMP_4 = DATEADD(minute,60, T_TSTAMP_4),T_TSTAMP_5 = DATEADD(minute,60, T_TSTAMP_5),T_TSTAMP_6 = DATEADD(minute,60, T_TSTAMP_6),
    T_TSTAMP_7 = DATEADD(minute,60, T_TSTAMP_7),T_TSTAMP_8 = DATEADD(minute,60, T_TSTAMP_8),T_TSTAMP_9 = DATEADD(minute,60, T_TSTAMP_9),
    T_TSTAMP_10 = DATEADD(minute,60, T_TSTAMP_10),T_TSTAMP_11 = DATEADD(minute,60, T_TSTAMP_11),T_TSTAMP_12 = DATEADD(minute,60, T_TSTAMP_12)
where ID < 250001;

update T_TSTAMP_WTZ_12 set
    T_TSTAMP_WTZ_1 = DATEADD(minute,60, T_TSTAMP_WTZ_1),T_TSTAMP_WTZ_2 = DATEADD(minute,60, T_TSTAMP_WTZ_2),T_TSTAMP_WTZ_3 = DATEADD(minute,60, T_TSTAMP_WTZ_3),
    T_TSTAMP_WTZ_4 = DATEADD(minute,60, T_TSTAMP_WTZ_4),T_TSTAMP_WTZ_5 = DATEADD(minute,60, T_TSTAMP_WTZ_5),T_TSTAMP_WTZ_6 = DATEADD(minute,60, T_TSTAMP_WTZ_6),
    T_TSTAMP_WTZ_7 = DATEADD(minute,60, T_TSTAMP_WTZ_7),T_TSTAMP_WTZ_8 = DATEADD(minute,60, T_TSTAMP_WTZ_8),T_TSTAMP_WTZ_9 = DATEADD(minute,60, T_TSTAMP_WTZ_9),
    T_TSTAMP_WTZ_10 = DATEADD(minute,60, T_TSTAMP_WTZ_10),T_TSTAMP_WTZ_11 = DATEADD(minute,60, T_TSTAMP_WTZ_11),T_TSTAMP_WTZ_12 = DATEADD(minute,60, T_TSTAMP_WTZ_12)
where ID < 250001;

commit;

Размер базы данных Firebird после обновления 25% всех таблиц 8504 MB

Для PostgreSQL: Размер базы данных до обновления данных 7863 MB Выполним скрипт со следующими запросами:

update T_VARCHAR_12_200 set 
    VARCHAR_1 = reverse(VARCHAR_1),VARCHAR_2 = reverse(VARCHAR_2),VARCHAR_3 = reverse(VARCHAR_3),
    VARCHAR_4 = reverse(VARCHAR_4),VARCHAR_5 = reverse(VARCHAR_5),VARCHAR_6 = reverse(VARCHAR_6),
    VARCHAR_7 = reverse(VARCHAR_7),VARCHAR_8 = reverse(VARCHAR_8),VARCHAR_9 = reverse(VARCHAR_9),
    VARCHAR_10 = reverse(VARCHAR_10),VARCHAR_11 = reverse(VARCHAR_11),VARCHAR_12 = reverse(VARCHAR_12)
where ID < 250001;

update T_VARCHAR_12_50 set VARCHAR_1 = reverse(VARCHAR_1),VARCHAR_2 = reverse(VARCHAR_2),VARCHAR_3 = reverse(VARCHAR_3),
    VARCHAR_4 = reverse(VARCHAR_4),VARCHAR_5 = reverse(VARCHAR_5),VARCHAR_6 = reverse(VARCHAR_6),
    VARCHAR_7 = reverse(VARCHAR_7),VARCHAR_8 = reverse(VARCHAR_8),VARCHAR_9 = reverse(VARCHAR_9),
    VARCHAR_10 = reverse(VARCHAR_10),VARCHAR_11 = reverse(VARCHAR_11),VARCHAR_12 = reverse(VARCHAR_12)
where ID < 250001;

update T_CHAR_12_200 set 
    CHAR_1 = reverse(CHAR_1),CHAR_2 = reverse(CHAR_2),CHAR_3 = reverse(CHAR_3),
    CHAR_4 = reverse(CHAR_4),CHAR_5 = reverse(CHAR_5),CHAR_6 = reverse(CHAR_6),
    CHAR_7 = reverse(CHAR_7),CHAR_8 = reverse(CHAR_8),CHAR_9 = reverse(CHAR_9),
    CHAR_10 = reverse(CHAR_10),CHAR_11 = reverse(CHAR_11),CHAR_12 = reverse(CHAR_12)
where ID < 250001;

update T_CHAR_12_50 set
    CHAR_1 = reverse(CHAR_1),CHAR_2 = reverse(CHAR_2),CHAR_3 = reverse(CHAR_3),
    CHAR_4 = reverse(CHAR_4),CHAR_5 = reverse(CHAR_5),CHAR_6 = reverse(CHAR_6),
    CHAR_7 = reverse(CHAR_7),CHAR_8 = reverse(CHAR_8),CHAR_9 = reverse(CHAR_9),
    CHAR_10 = reverse(CHAR_10),CHAR_11 = reverse(CHAR_11),CHAR_12 = reverse(CHAR_12)
where ID < 250001;

update T_INT12 set
    INT_1 = (INT_1-1000),INT_2 = INT_2-1000,INT_3 = INT_3-1000,INT_4 = INT_4-1000,
    INT_5 = INT_5-1000,INT_6 = INT_6-1000,INT_7 = INT_7-1000,INT_8 = INT_8-1000,
    INT_9 = INT_9-1000,INT_10 = INT_10-1000,INT_11 = INT_11-1000,INT_12 = INT_12-1000
where ID < 250001;

update T_DATE_12 set
    T_DATE_1 = T_DATE_1 + INTERVAL '365 day',T_DATE_2 = T_DATE_2 + INTERVAL '365 day',T_DATE_3 = T_DATE_3 + INTERVAL '365 day',
    T_DATE_4 = T_DATE_4 + INTERVAL '365 day',T_DATE_5 = T_DATE_5 + INTERVAL '365 day',T_DATE_6 = T_DATE_6 + INTERVAL '365 day',
    T_DATE_7 = T_DATE_7 + INTERVAL '365 day',T_DATE_8 = T_DATE_8 + INTERVAL '365 day',T_DATE_9 = T_DATE_9 + INTERVAL '365 day',
    T_DATE_10 = T_DATE_10 + INTERVAL '365 day',T_DATE_11 = T_DATE_11 + INTERVAL '365 day',T_DATE_12 = T_DATE_12 + INTERVAL '365 day'
where ID < 250001;

update T_BOOL_12 set
    T_BOOL_1 = T_BOOL_2,T_BOOL_2 = T_BOOL_1,T_BOOL_3 = T_BOOL_2,T_BOOL_4 = T_BOOL_1,
    T_BOOL_5 = T_BOOL_2,T_BOOL_6 = T_BOOL_1,T_BOOL_7 = T_BOOL_2,T_BOOL_8 = T_BOOL_1,
    T_BOOL_9 = T_BOOL_2,T_BOOL_10 = T_BOOL_1,T_BOOL_11 = T_BOOL_2,T_BOOL_12 = T_BOOL_1
where ID < 250001;

update T_REAL_12 set
    T_REAL_1 = T_REAL_1 - 10000,T_REAL_2 = T_REAL_2 - 10000,T_REAL_3 = T_REAL_2 - 10000,T_REAL_4 = T_REAL_4 - 10000,
    T_REAL_5 = T_REAL_5 - 10000,T_REAL_6 = T_REAL_6 - 10000,T_REAL_7 = T_REAL_7 - 10000,T_REAL_8 = T_REAL_8 - 10000,
    T_REAL_9 = T_REAL_9 - 10000,T_REAL_10 = T_REAL_10 - 10000,T_REAL_11 = T_REAL_11 - 10000,T_REAL_12 = T_REAL_12 - 10000
where ID < 250001;

update T_NUM_12 set
    T_NUM_1 = T_NUM_1 - 10000,T_NUM_2 = T_NUM_2 - 10000,T_NUM_3 = T_NUM_2 - 10000,T_NUM_4 = T_NUM_4 - 10000,
    T_NUM_5 = T_NUM_5 - 10000,T_NUM_6 = T_NUM_6 - 10000,T_NUM_7 = T_NUM_7 - 10000,T_NUM_8 = T_NUM_8 - 10000,
    T_NUM_9 = T_NUM_9 - 10000,T_NUM_10 = T_NUM_10 - 10000,T_NUM_11 = T_NUM_11 - 10000,T_NUM_12 = T_NUM_12 - 10000
where ID < 250001;

update T_TIME_12 set
    T_TIME_1 = T_TIME_1 + INTERVAL '60 hour',T_TIME_2 = T_TIME_2 + INTERVAL '60 hour',
    T_TIME_3 = T_TIME_3 + INTERVAL '60 hour',T_TIME_4 = T_TIME_4 + INTERVAL '60 hour',
    T_TIME_5 = T_TIME_5 + INTERVAL '60 hour',T_TIME_6 = T_TIME_6 + INTERVAL '60 hour',
    T_TIME_7 = T_TIME_7 + INTERVAL '60 hour',T_TIME_8 = T_TIME_8 + INTERVAL '60 hour',
    T_TIME_9 = T_TIME_9 + INTERVAL '60 hour',T_TIME_10 = T_TIME_10 + INTERVAL '60 hour',
    T_TIME_11 = T_TIME_11 + INTERVAL '60 hour',T_TIME_12 = T_TIME_12 + INTERVAL '60 hour'
where ID < 250001;

update T_TIME_WTZ_12 set
    T_TIME_WTZ_1 = T_TIME_WTZ_1 + INTERVAL '60 hour',T_TIME_WTZ_2 = T_TIME_WTZ_2 + INTERVAL '60 hour',
    T_TIME_WTZ_3 = T_TIME_WTZ_3 + INTERVAL '60 hour',T_TIME_WTZ_4 = T_TIME_WTZ_4 + INTERVAL '60 hour',
    T_TIME_WTZ_5 = T_TIME_WTZ_5 + INTERVAL '60 hour',T_TIME_WTZ_6 = T_TIME_WTZ_6 + INTERVAL '60 hour',
    T_TIME_WTZ_7 = T_TIME_WTZ_7 + INTERVAL '60 hour',T_TIME_WTZ_8 = T_TIME_WTZ_8 + INTERVAL '60 hour',
    T_TIME_WTZ_9 = T_TIME_WTZ_9 + INTERVAL '60 hour',T_TIME_WTZ_10 = T_TIME_WTZ_10 + INTERVAL '60 hour',
    T_TIME_WTZ_11 = T_TIME_WTZ_11 + INTERVAL '60 hour',T_TIME_WTZ_12 = T_TIME_WTZ_12 + INTERVAL '60 hour'
where ID < 250001;

update T_TSTAMP_12 set
    T_TSTAMP_1 = T_TSTAMP_1 + INTERVAL '60 hour',T_TSTAMP_2 = T_TSTAMP_2 + INTERVAL '60 hour',
    T_TSTAMP_3 = T_TSTAMP_3 + INTERVAL '60 hour',T_TSTAMP_4 = T_TSTAMP_4 + INTERVAL '60 hour',
    T_TSTAMP_5 = T_TSTAMP_5 + INTERVAL '60 hour',T_TSTAMP_6 = T_TSTAMP_6 + INTERVAL '60 hour',
    T_TSTAMP_7 = T_TSTAMP_7 + INTERVAL '60 hour',T_TSTAMP_8 = T_TSTAMP_8 + INTERVAL '60 hour',
    T_TSTAMP_9 = T_TSTAMP_9 + INTERVAL '60 hour',T_TSTAMP_10 = T_TSTAMP_10 + INTERVAL '60 hour',
    T_TSTAMP_11 = T_TSTAMP_11 + INTERVAL '60 hour',T_TSTAMP_12 = T_TSTAMP_12 + INTERVAL '60 hour'
where ID < 250001;

update T_TSTAMP_WTZ_12  set
    T_TSTAMP_WTZ_1 =  T_TSTAMP_WTZ_1 + INTERVAL '60 hour',T_TSTAMP_WTZ_2 =  T_TSTAMP_WTZ_2 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_3 =  T_TSTAMP_WTZ_3 + INTERVAL '60 hour',T_TSTAMP_WTZ_4 =  T_TSTAMP_WTZ_4 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_5 =  T_TSTAMP_WTZ_5 + INTERVAL '60 hour',T_TSTAMP_WTZ_6 =  T_TSTAMP_WTZ_6 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_7 =  T_TSTAMP_WTZ_7 + INTERVAL '60 hour',T_TSTAMP_WTZ_8 =  T_TSTAMP_WTZ_8 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_9 =  T_TSTAMP_WTZ_9 + INTERVAL '60 hour',T_TSTAMP_WTZ_10 =  T_TSTAMP_WTZ_10 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_11 =  T_TSTAMP_WTZ_11 + INTERVAL '60 hour',T_TSTAMP_WTZ_12 =  T_TSTAMP_WTZ_12 + INTERVAL '60 hour'
where ID < 250001;

Размер базы данных PostgreSQL после обновления 25% всех таблиц 9862 MB.

Проверим размер таблиц и сведем результат в таблицу:

Размеры таблиц по типам данных

Таблица

PostgreSQL (MB)

Firebird (MB)

t_bool_12

53 MB

53.63 MB

t_char_12_200

3411 MB

2604.25 MB

t_char_12_50

814 MB

679.38 MB

t_date_12

101 MB

99.63 MB

t_int12

101 MB

99.63 MB

t_num_12

199 MB

146.13 MB

t_real_12

160 MB

99.63 MB

t_time_12

160 MB

99.63 MB

t_time_wtz_12

279 MB

146.13 MB

t_tstamp_12

160 MB

146.13 MB

t_tstamp_wtz_12

160 MB

233.25 MB

t_varchar_12_200

3442 MB

2604.25 MB

t_varchar_12_50

814 MB

710.25 MB

График

100%
100%

Обновим данные еще раз, до 50% всех данных (точнее следующие 25%)

Firebird Выполним скрипт со следующими запросами:

update T_VARCHAR_12_200 set 
    VARCHAR_1 = reverse(VARCHAR_1),VARCHAR_2 = reverse(VARCHAR_2),VARCHAR_3 = reverse(VARCHAR_3),
    VARCHAR_4 = reverse(VARCHAR_4),VARCHAR_5 = reverse(VARCHAR_5),VARCHAR_6 = reverse(VARCHAR_6),
    VARCHAR_7 = reverse(VARCHAR_7),VARCHAR_8 = reverse(VARCHAR_8),VARCHAR_9 = reverse(VARCHAR_9),
    VARCHAR_10 = reverse(VARCHAR_10),VARCHAR_11 = reverse(VARCHAR_11),VARCHAR_12 = reverse(VARCHAR_12)
where ID between 250001 and 500000;

update T_VARCHAR_12_50 set 
    VARCHAR_1 = reverse(VARCHAR_1),VARCHAR_2 = reverse(VARCHAR_2),VARCHAR_3 = reverse(VARCHAR_3),
    VARCHAR_4 = reverse(VARCHAR_4),VARCHAR_5 = reverse(VARCHAR_5),VARCHAR_6 = reverse(VARCHAR_6),
    VARCHAR_7 = reverse(VARCHAR_7),VARCHAR_8 = reverse(VARCHAR_8),VARCHAR_9 = reverse(VARCHAR_9),
    VARCHAR_10 = reverse(VARCHAR_10),VARCHAR_11 = reverse(VARCHAR_11),VARCHAR_12 = reverse(VARCHAR_12)
where ID between 250001 and 500000;

update T_CHAR_12_20 set 
    CHAR_1 = reverse(CHAR_1),CHAR_2 = reverse(CHAR_2),CHAR_3 = reverse(CHAR_3),
    CHAR_4 = reverse(CHAR_4),CHAR_5 = reverse(CHAR_5),CHAR_6 = reverse(CHAR_6),
    CHAR_7 = reverse(CHAR_7),CHAR_8 = reverse(CHAR_8),CHAR_9 = reverse(CHAR_9),
    CHAR_10 = reverse(CHAR_10),CHAR_11 = reverse(CHAR_11),CHAR_12 = reverse(CHAR_12)
where ID between 250001 and 500000;

update T_CHAR_12_50 set 
    CHAR_1 = reverse(CHAR_1),CHAR_2 = reverse(CHAR_2),CHAR_3 = reverse(CHAR_3),
    CHAR_4 = reverse(CHAR_4),CHAR_5 = reverse(CHAR_5),CHAR_6 = reverse(CHAR_6),
    CHAR_7 = reverse(CHAR_7),CHAR_8 = reverse(CHAR_8),CHAR_9 = reverse(CHAR_9),
    CHAR_10 = reverse(CHAR_10),CHAR_11 = reverse(CHAR_11),CHAR_12 = reverse(CHAR_12)
where ID between 250001 and 500000;

update T_INT12 set
    INT_1 = (INT_1-1000),INT_2 = INT_2-1000,INT_3 = INT_3-1000,INT_4 = INT_4-1000,
    INT_5 = INT_5-1000,INT_6 = INT_6-1000,INT_7 = INT_7-1000,INT_8 = INT_8-1000,
    INT_9 = INT_9-1000,INT_10 = INT_10-1000,INT_11 = INT_11-1000,INT_12 = INT_12-1000
where ID between 250001 and 500000;

update T_DATE_12  set
    T_DATE_1 = DATEADD(365 day to T_DATE_1),T_DATE_2 = DATEADD(365 day to T_DATE_2),T_DATE_3 = DATEADD(365 day to T_DATE_3),
    T_DATE_4 = DATEADD(365 day to T_DATE_4),T_DATE_5 = DATEADD(365 day to T_DATE_5),T_DATE_6 = DATEADD(365 day to T_DATE_6),
    T_DATE_7 = DATEADD(365 day to T_DATE_7),T_DATE_8 = DATEADD(365 day to T_DATE_8),T_DATE_9 = DATEADD(365 day to T_DATE_9),
    T_DATE_10 = DATEADD(365 day to T_DATE_10),T_DATE_11 = DATEADD(365 day to T_DATE_11),T_DATE_12 = DATEADD(365 day to T_DATE_12)
where ID between 250001 and 500000;

update T_BOOL_12 set
    T_BOOL_1 = T_BOOL_2,T_BOOL_2 = T_BOOL_1,T_BOOL_3 = T_BOOL_2,T_BOOL_4 = T_BOOL_1,T_BOOL_5 = T_BOOL_2,T_BOOL_6 = T_BOOL_1,
    T_BOOL_7 = T_BOOL_2,T_BOOL_8 = T_BOOL_1,T_BOOL_9 = T_BOOL_2,T_BOOL_10 = T_BOOL_1,T_BOOL_11 = T_BOOL_2,T_BOOL_12 = T_BOOL_1
where ID between 250001 and 500000;

update T_REAL_12 set
    T_REAL_1 = T_REAL_1 - 10000,T_REAL_2 = T_REAL_2 - 10000,T_REAL_3 = T_REAL_2 - 10000,T_REAL_4 = T_REAL_4 - 10000,
    T_REAL_5 = T_REAL_5 - 10000,T_REAL_6 = T_REAL_6 - 10000,T_REAL_7 = T_REAL_7 - 10000,T_REAL_8 = T_REAL_8 - 10000,
    T_REAL_9 = T_REAL_9 - 10000,T_REAL_10 = T_REAL_10 - 10000,T_REAL_11 = T_REAL_11 - 10000,T_REAL_12 = T_REAL_12 - 10000
where ID between 250001 and 500000;

update T_NUM_12 set
    T_NUM_1 = T_NUM_1 - 10000,T_NUM_2 = T_NUM_2 - 10000,T_NUM_3 = T_NUM_2 - 10000,T_NUM_4 = T_NUM_4 - 10000,
    T_NUM_5 = T_NUM_5 - 10000,T_NUM_6 = T_NUM_6 - 10000,T_NUM_7 = T_NUM_7 - 10000,T_NUM_8 = T_NUM_8 - 10000,
    T_NUM_9 = T_NUM_9 - 10000,T_NUM_10 = T_NUM_10 - 10000,T_NUM_11 = T_NUM_11 - 10000,T_NUM_12 = T_NUM_12 - 10000
where ID between 250001 and 500000;

update T_TIME_12 set
   T_TIME_1 = DATEADD(minute,60, T_TIME_1),T_TIME_2 = DATEADD(minute,60, T_TIME_2),T_TIME_3 = DATEADD(minute,60, T_TIME_3),
   T_TIME_4 = DATEADD(minute,60, T_TIME_4),T_TIME_5 = DATEADD(minute,60, T_TIME_5),T_TIME_6 = DATEADD(minute,60, T_TIME_6),
   T_TIME_7 = DATEADD(minute,60, T_TIME_7),T_TIME_8 = DATEADD(minute,60, T_TIME_8),T_TIME_9 = DATEADD(minute,60, T_TIME_9),
   T_TIME_10 = DATEADD(minute,60, T_TIME_10),T_TIME_11 = DATEADD(minute,60, T_TIME_11),T_TIME_12 = DATEADD(minute,60, T_TIME_12)
where ID between 250001 and 500000;

update T_TIME_WTZ_12 set
    T_TIME_WTZ_1 = DATEADD(minute,60, T_TIME_WTZ_1),T_TIME_WTZ_2 = DATEADD(minute,60, T_TIME_WTZ_2),T_TIME_WTZ_3 = DATEADD(minute,60, T_TIME_WTZ_3),
    T_TIME_WTZ_4 = DATEADD(minute,60, T_TIME_WTZ_4),T_TIME_WTZ_5 = DATEADD(minute,60, T_TIME_WTZ_5),T_TIME_WTZ_6 = DATEADD(minute,60, T_TIME_WTZ_6),
    T_TIME_WTZ_7 = DATEADD(minute,60, T_TIME_WTZ_7),T_TIME_WTZ_8 = DATEADD(minute,60, T_TIME_WTZ_8),T_TIME_WTZ_9 = DATEADD(minute,60, T_TIME_WTZ_9),
    T_TIME_WTZ_10 = DATEADD(minute,60, T_TIME_WTZ_10),T_TIME_WTZ_11 = DATEADD(minute,60, T_TIME_WTZ_11),T_TIME_WTZ_12 = DATEADD(minute,60, T_TIME_WTZ_12)
where ID between 250001 and 500000;

update T_TSTAMP_12 set
    T_TSTAMP_1 = DATEADD(minute,60, T_TSTAMP_1),T_TSTAMP_2 = DATEADD(minute,60, T_TSTAMP_2),T_TSTAMP_3 = DATEADD(minute,60, T_TSTAMP_3),
    T_TSTAMP_4 = DATEADD(minute,60, T_TSTAMP_4),T_TSTAMP_5 = DATEADD(minute,60, T_TSTAMP_5),T_TSTAMP_6 = DATEADD(minute,60, T_TSTAMP_6),
    T_TSTAMP_7 = DATEADD(minute,60, T_TSTAMP_7),T_TSTAMP_8 = DATEADD(minute,60, T_TSTAMP_8),T_TSTAMP_9 = DATEADD(minute,60, T_TSTAMP_9),
    T_TSTAMP_10 = DATEADD(minute,60, T_TSTAMP_10),T_TSTAMP_11 = DATEADD(minute,60, T_TSTAMP_11),T_TSTAMP_12 = DATEADD(minute,60, T_TSTAMP_12)
where ID between 250001 and 500000;

update T_TSTAMP_WTZ_12 set
    T_TSTAMP_WTZ_1 = DATEADD(minute,60, T_TSTAMP_WTZ_1),T_TSTAMP_WTZ_2 = DATEADD(minute,60, T_TSTAMP_WTZ_2),T_TSTAMP_WTZ_3 = DATEADD(minute,60, T_TSTAMP_WTZ_3),
    T_TSTAMP_WTZ_4 = DATEADD(minute,60, T_TSTAMP_WTZ_4),T_TSTAMP_WTZ_5 = DATEADD(minute,60, T_TSTAMP_WTZ_5),T_TSTAMP_WTZ_6 = DATEADD(minute,60, T_TSTAMP_WTZ_6),
    T_TSTAMP_WTZ_7 = DATEADD(minute,60, T_TSTAMP_WTZ_7),T_TSTAMP_WTZ_8 = DATEADD(minute,60, T_TSTAMP_WTZ_8),T_TSTAMP_WTZ_9 = DATEADD(minute,60, T_TSTAMP_WTZ_9),
    T_TSTAMP_WTZ_10 = DATEADD(minute,60, T_TSTAMP_WTZ_10),T_TSTAMP_WTZ_11 = DATEADD(minute,60, T_TSTAMP_WTZ_11),T_TSTAMP_WTZ_12 = DATEADD(minute,60, T_TSTAMP_WTZ_12)
where ID between 250001 and 500000;

commit;

Размер базы данных Firebird после обновления 50% всех таблиц 9528 MB

Для PostgreSQL: Выполним скрипт со следующими запросами:

update T_VARCHAR_12_200 set 
    VARCHAR_1 = reverse(VARCHAR_1),VARCHAR_2 = reverse(VARCHAR_2),VARCHAR_3 = reverse(VARCHAR_3),
    VARCHAR_4 = reverse(VARCHAR_4),VARCHAR_5 = reverse(VARCHAR_5),VARCHAR_6 = reverse(VARCHAR_6),
    VARCHAR_7 = reverse(VARCHAR_7),VARCHAR_8 = reverse(VARCHAR_8),VARCHAR_9 = reverse(VARCHAR_9),
    VARCHAR_10 = reverse(VARCHAR_10),VARCHAR_11 = reverse(VARCHAR_11),VARCHAR_12 = reverse(VARCHAR_12)
where ID between 250001 and 500000;

update T_VARCHAR_12_50 set 
    VARCHAR_1 = reverse(VARCHAR_1),VARCHAR_2 = reverse(VARCHAR_2),VARCHAR_3 = reverse(VARCHAR_3),
    VARCHAR_4 = reverse(VARCHAR_4),VARCHAR_5 = reverse(VARCHAR_5),VARCHAR_6 = reverse(VARCHAR_6),
    VARCHAR_7 = reverse(VARCHAR_7),VARCHAR_8 = reverse(VARCHAR_8),VARCHAR_9 = reverse(VARCHAR_9),
    VARCHAR_10 = reverse(VARCHAR_10),VARCHAR_11 = reverse(VARCHAR_11),VARCHAR_12 = reverse(VARCHAR_12)
where ID between 250001 and 500000;

update T_CHAR_12_200 set 
    CHAR_1 = reverse(CHAR_1),CHAR_2 = reverse(CHAR_2),CHAR_3 = reverse(CHAR_3),
    CHAR_4 = reverse(CHAR_4),CHAR_5 = reverse(CHAR_5),CHAR_6 = reverse(CHAR_6),
    CHAR_7 = reverse(CHAR_7),CHAR_8 = reverse(CHAR_8),CHAR_9 = reverse(CHAR_9),
    CHAR_10 = reverse(CHAR_10),CHAR_11 = reverse(CHAR_11),CHAR_12 = reverse(CHAR_12)
where ID between 250001 and 500000;

update T_CHAR_12_50 set 
    CHAR_1 = reverse(CHAR_1),CHAR_2 = reverse(CHAR_2),CHAR_3 = reverse(CHAR_3),
    CHAR_4 = reverse(CHAR_4),CHAR_5 = reverse(CHAR_5),CHAR_6 = reverse(CHAR_6),
    CHAR_7 = reverse(CHAR_7),CHAR_8 = reverse(CHAR_8),CHAR_9 = reverse(CHAR_9),
    CHAR_10 = reverse(CHAR_10),CHAR_11 = reverse(CHAR_11),CHAR_12 = reverse(CHAR_12)
where ID between 250001 and 500000;

update T_INT12 set
    INT_1 = (INT_1-1000),INT_2 = INT_2-1000,INT_3 = INT_3-1000,INT_4 = INT_4-1000,
    INT_5 = INT_5-1000,INT_6 = INT_6-1000,INT_7 = INT_7-1000,INT_8 = INT_8-1000,
    INT_9 = INT_9-1000,INT_10 = INT_10-1000,INT_11 = INT_11-1000,INT_12 = INT_12-1000
where ID between 250001 and 500000;

update T_DATE_12 set
    T_DATE_1 = T_DATE_1 + INTERVAL '365 day',T_DATE_2 = T_DATE_2 + INTERVAL '365 day',T_DATE_3 = T_DATE_3 + INTERVAL '365 day',
    T_DATE_4 = T_DATE_4 + INTERVAL '365 day',T_DATE_5 = T_DATE_5 + INTERVAL '365 day',T_DATE_6 = T_DATE_6 + INTERVAL '365 day',
    T_DATE_7 = T_DATE_7 + INTERVAL '365 day',T_DATE_8 = T_DATE_8 + INTERVAL '365 day',T_DATE_9 = T_DATE_9 + INTERVAL '365 day',
    T_DATE_10 = T_DATE_10 + INTERVAL '365 day',T_DATE_11 = T_DATE_11 + INTERVAL '365 day',T_DATE_12 = T_DATE_12 + INTERVAL '365 day'
where ID between 250001 and 500000;

update T_BOOL_12 set
    T_BOOL_1 = T_BOOL_2,T_BOOL_2 = T_BOOL_1,T_BOOL_3 = T_BOOL_2,T_BOOL_4 = T_BOOL_1,
    T_BOOL_5 = T_BOOL_2,T_BOOL_6 = T_BOOL_1,T_BOOL_7 = T_BOOL_2,T_BOOL_8 = T_BOOL_1,
    T_BOOL_9 = T_BOOL_2,T_BOOL_10 = T_BOOL_1,T_BOOL_11 = T_BOOL_2,T_BOOL_12 = T_BOOL_1
where ID between 250001 and 500000;

update T_REAL_12 set
    T_REAL_1 = T_REAL_1 - 10000,T_REAL_2 = T_REAL_2 - 10000,T_REAL_3 = T_REAL_2 - 10000,T_REAL_4 = T_REAL_4 - 10000,
    T_REAL_5 = T_REAL_5 - 10000,T_REAL_6 = T_REAL_6 - 10000,T_REAL_7 = T_REAL_7 - 10000,T_REAL_8 = T_REAL_8 - 10000,
    T_REAL_9 = T_REAL_9 - 10000,T_REAL_10 = T_REAL_10 - 10000,T_REAL_11 = T_REAL_11 - 10000,T_REAL_12 = T_REAL_12 - 10000
where ID between 250001 and 500000;

update T_NUM_12 set
    T_NUM_1 = T_NUM_1 - 10000,T_NUM_2 = T_NUM_2 - 10000,T_NUM_3 = T_NUM_2 - 10000,T_NUM_4 = T_NUM_4 - 10000,
    T_NUM_5 = T_NUM_5 - 10000,T_NUM_6 = T_NUM_6 - 10000,T_NUM_7 = T_NUM_7 - 10000,T_NUM_8 = T_NUM_8 - 10000,
    T_NUM_9 = T_NUM_9 - 10000,T_NUM_10 = T_NUM_10 - 10000,T_NUM_11 = T_NUM_11 - 10000,T_NUM_12 = T_NUM_12 - 10000
where ID between 250001 and 500000;

update T_TIME_12 set
    T_TIME_1 = T_TIME_1 + INTERVAL '60 hour',T_TIME_2 = T_TIME_2 + INTERVAL '60 hour',
    T_TIME_3 = T_TIME_3 + INTERVAL '60 hour',T_TIME_4 = T_TIME_4 + INTERVAL '60 hour',
    T_TIME_5 = T_TIME_5 + INTERVAL '60 hour',T_TIME_6 = T_TIME_6 + INTERVAL '60 hour',
    T_TIME_7 = T_TIME_7 + INTERVAL '60 hour',T_TIME_8 = T_TIME_8 + INTERVAL '60 hour',
    T_TIME_9 = T_TIME_9 + INTERVAL '60 hour',T_TIME_10 = T_TIME_10 + INTERVAL '60 hour',
    T_TIME_11 = T_TIME_11 + INTERVAL '60 hour',T_TIME_12 = T_TIME_12 + INTERVAL '60 hour'
where ID between 250001 and 500000;

update T_TIME_WTZ_12 set
    T_TIME_WTZ_1 = T_TIME_WTZ_1 + INTERVAL '60 hour',T_TIME_WTZ_2 = T_TIME_WTZ_2 + INTERVAL '60 hour',
    T_TIME_WTZ_3 = T_TIME_WTZ_3 + INTERVAL '60 hour',T_TIME_WTZ_4 = T_TIME_WTZ_4 + INTERVAL '60 hour',
    T_TIME_WTZ_5 = T_TIME_WTZ_5 + INTERVAL '60 hour',T_TIME_WTZ_6 = T_TIME_WTZ_6 + INTERVAL '60 hour',
    T_TIME_WTZ_7 = T_TIME_WTZ_7 + INTERVAL '60 hour',T_TIME_WTZ_8 = T_TIME_WTZ_8 + INTERVAL '60 hour',
    T_TIME_WTZ_9 = T_TIME_WTZ_9 + INTERVAL '60 hour',T_TIME_WTZ_10 = T_TIME_WTZ_10 + INTERVAL '60 hour',
    T_TIME_WTZ_11 = T_TIME_WTZ_11 + INTERVAL '60 hour',T_TIME_WTZ_12 = T_TIME_WTZ_12 + INTERVAL '60 hour'
where ID between 250001 and 500000;

update T_TSTAMP_12 set
    T_TSTAMP_1 = T_TSTAMP_1 + INTERVAL '60 hour',T_TSTAMP_2 = T_TSTAMP_2 + INTERVAL '60 hour',
    T_TSTAMP_3 = T_TSTAMP_3 + INTERVAL '60 hour',T_TSTAMP_4 = T_TSTAMP_4 + INTERVAL '60 hour',
    T_TSTAMP_5 = T_TSTAMP_5 + INTERVAL '60 hour',T_TSTAMP_6 = T_TSTAMP_6 + INTERVAL '60 hour',
    T_TSTAMP_7 = T_TSTAMP_7 + INTERVAL '60 hour',T_TSTAMP_8 = T_TSTAMP_8 + INTERVAL '60 hour',
    T_TSTAMP_9 = T_TSTAMP_9 + INTERVAL '60 hour',T_TSTAMP_10 = T_TSTAMP_10 + INTERVAL '60 hour',
    T_TSTAMP_11 = T_TSTAMP_11 + INTERVAL '60 hour',T_TSTAMP_12 = T_TSTAMP_12 + INTERVAL '60 hour'
where ID between 250001 and 500000;

update T_TSTAMP_WTZ_12 set
    T_TSTAMP_WTZ_1 =  T_TSTAMP_WTZ_1 + INTERVAL '60 hour',T_TSTAMP_WTZ_2 =  T_TSTAMP_WTZ_2 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_3 =  T_TSTAMP_WTZ_3 + INTERVAL '60 hour',T_TSTAMP_WTZ_4 =  T_TSTAMP_WTZ_4 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_5 =  T_TSTAMP_WTZ_5 + INTERVAL '60 hour',T_TSTAMP_WTZ_6 =  T_TSTAMP_WTZ_6 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_7 =  T_TSTAMP_WTZ_7 + INTERVAL '60 hour',T_TSTAMP_WTZ_8 =  T_TSTAMP_WTZ_8 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_9 =  T_TSTAMP_WTZ_9 + INTERVAL '60 hour',T_TSTAMP_WTZ_10 =  T_TSTAMP_WTZ_10 + INTERVAL '60 hour',
    T_TSTAMP_WTZ_11 =  T_TSTAMP_WTZ_11 + INTERVAL '60 hour',T_TSTAMP_WTZ_12 =  T_TSTAMP_WTZ_12 + INTERVAL '60 hour'
where ID between 250001 and 500000;

Размер базы данных PostgreSQL после обновления 50% всех таблиц 9894 MB Сведем результат в таблицу

Размеры таблиц по типам данных

Таблица

PostgreSQL (MB)

Firebird (MB)

t_bool_12

53

53.63

t_char_12_200

3427

3255.25

t_char_12_50

814

835.13

t_date_12

101

109.13

t_int12

101

109.13

t_num_12

199

167.13

t_real_12

160

109.13

t_time_12

160

109.13

t_time_wtz_12

279

158.50

t_tstamp_12

160

158.50

t_tstamp_wtz_12

160

245.88

t_varchar_12_200

3458

3255.25

t_varchar_12_50

814

865.63

График

100%
100%

Выводы

Проанализировав представленные данные о хранении информации в PostgreSQL 17 и Firebird 5, мы можем сделать следующие выводы о различиях между этими системами управления базами данных — при первичном заполнении баз данных одинаковыми наборами данных (1 млн строк) общий размер баз был практически идентичным — около 7863-7864 МБ, что говорит о сопоставимой общей эффективности хранения. Однако, при детальном рассмотрении по типам данных наблюдаются следующие различия:

  1. Числовые типы данных:

    • PostgreSQL эффективнее хранит целочисленные типы (integer) — 81 MB против 99.63 MB в Firebird

    • Firebird эффективнее хранит типы с плавающей точкой (float, numeric) — 99.63 MB против 128 MB и 146.13 MB против 159 MB

  2. Символьные типы данных:

    • Firebird более эффективно хранит данные типа char и varchar, особенно при больших размерах полей (200 символов) — 2604.25 MB против 2728 MB в PostgreSQL

  3. Временные типы данных:

    • PostgreSQL и Firebird примерно одинаково эффективны при хранении простых временных данных

    • При использовании временных зон (time with timezone, timestamp with timezone) системы демонстрируют разный подход: PostgreSQL использует больше места для time with timezone (223 MB против 146.13 MB), но меньше для timestamp with timezone (128 MB против 233.25 MB)

Обновление данных

При обновлении данных в базах (25% и 50% всех строк) наблюдаются существенные различия в подходах к управлению пространством:

1. При обновлении 25% данных:

  • PostgreSQL: размер вырос до 9862 MB (на 1999 MB или ~25%)

  • Firebird: размер вырос до 8504 MB (на 641 MB или ~8%)

2. При обновлении 50% данных:

  • PostgreSQL: размер незначительно увеличился до 9894 MB (на 32 MB относительно 25% обновления)

  • Firebird: размер вырос до 9528 MB (еще на 1024 MB или ~12%)

3. Общая разница после обновления 50% данных:

  • PostgreSQL: увеличение на 2031 MB или ~26% от исходного размера

  • Firebird: увеличение на 1665 MB или ~21% от исходного размера

Ключевые выводы:

1. Модель хранения данных:

  • PostgreSQL при обновлении создает больше дополнительного пространства сразу (значительный рост при первом обновлении)

  • Firebird показывает более линейный рост размера при последовательных обновлениях

2. Эффективность при изменениях:

  • Firebird более экономно расходует пространство при частых изменениях данных, особенно при работе с символьными типами данных

  • PostgreSQL требует больше дополнительного пространства при обновлениях, что может быть связано с его MVCC моделью (многоверсионное управление конкурентным доступом)

3. Специализация типов данных:

  • PostgreSQL более эффективен при работе с целочисленными и некоторыми временными типами данных

  • Firebird демонстрирует преимущество при работе с символьными данными и числами с плавающей точкой

4. Влияние типа данных на производительность:

  • Выбор типа данных имеет значительное влияние на эффективность хранения в обеих СУБД

  • Использование типов данных с часовыми поясами требует дополнительных ресурсов в обеих системах, но реализовано по-разному.

Эти различия следует учитывать при проектировании баз данных, особенно если предполагается частое обновление информации или работа с определенными типами данных. В зависимости от специфики приложения, одна из СУБД может предоставлять существенные преимущества с точки зрения эффективности хранения.

Исследование было проведено при спонсорской помощи компании iBase https://www.ibase.ru/

Теги:
Хабы:
Всего голосов 6: ↑5 и ↓1+5
Комментарии5

Публикации

Ближайшие события