Задача: создать одинаковые таблицы с определенными типами данных, заполнить одинаковыми данными в количестве 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 |
График

Обновим данные еще раз, до 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 |
График

Выводы
Проанализировав представленные данные о хранении информации в PostgreSQL 17 и Firebird 5, мы можем сделать следующие выводы о различиях между этими системами управления базами данных — при первичном заполнении баз данных одинаковыми наборами данных (1 млн строк) общий размер баз был практически идентичным — около 7863-7864 МБ, что говорит о сопоставимой общей эффективности хранения. Однако, при детальном рассмотрении по типам данных наблюдаются следующие различия:
Числовые типы данных:
PostgreSQL эффективнее хранит целочисленные типы (integer) — 81 MB против 99.63 MB в Firebird
Firebird эффективнее хранит типы с плавающей точкой (float, numeric) — 99.63 MB против 128 MB и 146.13 MB против 159 MB
Символьные типы данных:
Firebird более эффективно хранит данные типа char и varchar, особенно при больших размерах полей (200 символов) — 2604.25 MB против 2728 MB в PostgreSQL
Временные типы данных:
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/