Перечитуючи профільні (ІТ, конкретніше - автоматизація всякого на підприємствах) сайти прийшла в голову думка. Якщо вірити хоча б половині написаного, то взагалі немає сенсу займатись чим-небудь. Все вже придумано і поділено. Вибрана програма працює лише у її авторів. Вибраний стек технологій безумовно програє конкурентам. Менше аніж за стотисячмільйонів грошей взагалі ніхто ні за що братись не хоче. Ну і далі в тому ж напряму з повторами і заворотами.
А банальна думка власне в тому, що шукати відповіді на неконкретні запитання на форумах марна справа. Як зреалізувати конкретну задачу на конкретній платформі - це так, це запросто. А от яка платформа підходить для даної задачі - дзузьки.
Ет, фігня.
Я люблю тебе, життя :)
пятница, 1 июля 2011 г.
пятница, 23 октября 2009 г.
Триггери в Firebird: один чи багато?
Не знайшов інформації по темі, а є підозра, що вона незабаром знадобиться. Тому накидав такий тест:
CREATE GENERATOR GEN_MULTITRIGGER1_ID;
CREATE TABLE MULTITRIGGER1 (
ID INTEGER NOT NULL,
INT1 INTEGER,
INT2 INTEGER,
FLOAT1 FLOAT,
FLOAT2 FLOAT,
TIMESTAMP1 TIMESTAMP,
TIMESTAMP2 TIMESTAMP,
VARCHAR1 VARCHAR(128) CHARACTER SET UTF8,
VARCHAR2 VARCHAR(128) CHARACTER SET UTF8);
ALTER TABLE MULTITRIGGER1 ADD CONSTRAINT PK_MULTITRIGGER1 PRIMARY KEY ID);
CREATE INDEX MULTITRIGGER1_IDX1 ON MULTITRIGGER1 (TIMESTAMP1);
SET TERM ^ ;
CREATE OR ALTER TRIGGER MULTITRIGGER1_BI FOR MULTITRIGGER1
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.id is null) then new.id = gen_id(gen_multitrigger1_id,1);
if (new.int1 = 0) then new.int1 = 1;
if (new.int2 is null) then new.int2 = new.int1 * 2;
if (new.float1 is null) then new.float1 = new.int1 / 8 - new.int2 / 3;
if (new.float2 is null) then new.float2 = new.float1 - (new.int1 / new.int2);
if (new.timestamp1 is null) then new.timestamp1 = current_timestamp;
if (new.timestamp2 is null) then new.timestamp2 = current_date;
if (new.varchar1 is null) then new.varchar1 = new.timestamp1 || ' Hello, world!';
if (new.varchar2 is null) then new.varchar2 = 'float1 = ' || new.float1;
end^
SET TERM ; ^
А тепер така ж сама таблиця, але один тригер на вставку розбитий на 9:
CREATE GENERATOR GEN_MULTITRIGGER2_ID;
CREATE TABLE MULTITRIGGER2 (
ALTER TABLE MULTITRIGGER2 ADD CONSTRAINT PK_MULTITRIGGER2 PRIMARY KEY ID);
CREATE INDEX MULTITRIGGER2_IDX1 ON MULTITRIGGER2 (TIMESTAMP1);
SET TERM ^ ;
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI0 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 0 AS
begin
if (new.id is null) then new.id = gen_id(gen_multitrigger2_id, 1);
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI1 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 1 AS
begin
if (new.int1 = 0) then new.int1 = 1;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI2 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 2 AS
begin
if (new.int2 is null) then new.int2 = new.int1 * 2;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI3 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 3 AS
begin
if (new.float1 is null) then new.float1 = new.int1 / 8 - new.int2 / 3;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI4 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 4 AS
begin
if (new.float2 is null) then new.float2 = new.float1 - (new.int1 / new.int2);
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI5 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 5 AS
begin
if (new.timestamp1 is null) then new.timestamp1 = current_timestamp;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI6 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 6 AS
begin
if (new.timestamp2 is null) then new.timestamp2 = current_date;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI7 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 7 AS
begin
if (new.varchar1 is null) then new.varchar1 = new.timestamp1 || ' Hello, world!';
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI8 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 8 AS
begin
if (new.varchar2 is null) then new.varchar2 = 'float1 = ' || new.float1;
end^
SET TERM ; ^
Заливаємо у кожну з цих таблиць по 100К записів, при чому у записах задаємо лише поле int1, всі інші рахуються у тригерах. Далі дивимось результат:
select
((select first 1 timestamp1 from multitrigger1 order by timestamp1 desc) -
(select first 1 timestamp1 from multitrigger1 order by timestamp1))*3600*24
from rdb$database
Результат: 12,6720288 (секунд)
select
((select first 1 timestamp1 from multitrigger2 order by timestamp1 desc) -
(select first 1 timestamp1 from multitrigger2 order by timestamp1))*3600*24
from rdb$database
Результат: 12,8589984 (секунд)
Виглядає на те, що кількість тригерів практично не впливає на продуктивність бази даних.
СКБД - останній стабільний вогнептах, Firebird 2.1.3; ОС - вінда ХР СП3. Хоча, як на мене, воно ніякого значення не має.
Звісно, що результати можна назвати очевидними. Особливо, якщо ти - автор вогнептаха, або проводиш у базах даних 60-80 годин в тиждень.
P.S. Цікаво, це у всіх редактор блогера не має кнопки «Програмний код», чи лише у мене? :/
CREATE GENERATOR GEN_MULTITRIGGER1_ID;
CREATE TABLE MULTITRIGGER1 (
ID INTEGER NOT NULL,
INT1 INTEGER,
INT2 INTEGER,
FLOAT1 FLOAT,
FLOAT2 FLOAT,
TIMESTAMP1 TIMESTAMP,
TIMESTAMP2 TIMESTAMP,
VARCHAR1 VARCHAR(128) CHARACTER SET UTF8,
VARCHAR2 VARCHAR(128) CHARACTER SET UTF8);
ALTER TABLE MULTITRIGGER1 ADD CONSTRAINT PK_MULTITRIGGER1 PRIMARY KEY ID);
CREATE INDEX MULTITRIGGER1_IDX1 ON MULTITRIGGER1 (TIMESTAMP1);
SET TERM ^ ;
CREATE OR ALTER TRIGGER MULTITRIGGER1_BI FOR MULTITRIGGER1
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.id is null) then new.id = gen_id(gen_multitrigger1_id,1);
if (new.int1 = 0) then new.int1 = 1;
if (new.int2 is null) then new.int2 = new.int1 * 2;
if (new.float1 is null) then new.float1 = new.int1 / 8 - new.int2 / 3;
if (new.float2 is null) then new.float2 = new.float1 - (new.int1 / new.int2);
if (new.timestamp1 is null) then new.timestamp1 = current_timestamp;
if (new.timestamp2 is null) then new.timestamp2 = current_date;
if (new.varchar1 is null) then new.varchar1 = new.timestamp1 || ' Hello, world!';
if (new.varchar2 is null) then new.varchar2 = 'float1 = ' || new.float1;
end^
SET TERM ; ^
А тепер така ж сама таблиця, але один тригер на вставку розбитий на 9:
CREATE GENERATOR GEN_MULTITRIGGER2_ID;
CREATE TABLE MULTITRIGGER2 (
ID INTEGER NOT NULL,
INT1 INTEGER,
INT2 INTEGER,
FLOAT1 FLOAT,
FLOAT2 FLOAT,
TIMESTAMP1 TIMESTAMP,
TIMESTAMP2 TIMESTAMP,
VARCHAR1 VARCHAR(128) CHARACTER SET UTF8,
VARCHAR2 VARCHAR(128) CHARACTER SET UTF8);
CREATE INDEX MULTITRIGGER2_IDX1 ON MULTITRIGGER2 (TIMESTAMP1);
SET TERM ^ ;
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI0 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 0 AS
begin
if (new.id is null) then new.id = gen_id(gen_multitrigger2_id, 1);
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI1 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 1 AS
begin
if (new.int1 = 0) then new.int1 = 1;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI2 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 2 AS
begin
if (new.int2 is null) then new.int2 = new.int1 * 2;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI3 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 3 AS
begin
if (new.float1 is null) then new.float1 = new.int1 / 8 - new.int2 / 3;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI4 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 4 AS
begin
if (new.float2 is null) then new.float2 = new.float1 - (new.int1 / new.int2);
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI5 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 5 AS
begin
if (new.timestamp1 is null) then new.timestamp1 = current_timestamp;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI6 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 6 AS
begin
if (new.timestamp2 is null) then new.timestamp2 = current_date;
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI7 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 7 AS
begin
if (new.varchar1 is null) then new.varchar1 = new.timestamp1 || ' Hello, world!';
end^
CREATE OR ALTER TRIGGER MULTITRIGGER2_BI8 FOR MULTITRIGGER2
ACTIVE BEFORE INSERT POSITION 8 AS
begin
if (new.varchar2 is null) then new.varchar2 = 'float1 = ' || new.float1;
end^
SET TERM ; ^
Заливаємо у кожну з цих таблиць по 100К записів, при чому у записах задаємо лише поле int1, всі інші рахуються у тригерах. Далі дивимось результат:
select
((select first 1 timestamp1 from multitrigger1 order by timestamp1 desc) -
(select first 1 timestamp1 from multitrigger1 order by timestamp1))*3600*24
from rdb$database
Результат: 12,6720288 (секунд)
select
((select first 1 timestamp1 from multitrigger2 order by timestamp1 desc) -
(select first 1 timestamp1 from multitrigger2 order by timestamp1))*3600*24
from rdb$database
Результат: 12,8589984 (секунд)
Виглядає на те, що кількість тригерів практично не впливає на продуктивність бази даних.
СКБД - останній стабільний вогнептах, Firebird 2.1.3; ОС - вінда ХР СП3. Хоча, як на мене, воно ніякого значення не має.
Звісно, що результати можна назвати очевидними. Особливо, якщо ти - автор вогнептаха, або проводиш у базах даних 60-80 годин в тиждень.
P.S. Цікаво, це у всіх редактор блогера не має кнопки «Програмний код», чи лише у мене? :/
четверг, 13 августа 2009 г.
just test
Цікаво, а в гуглі є якась автотестілка, котра шукає слово "test" і видаляє нафіг записи з таким контентом? Нє, навряд. Можна щось потрібне видалити. Та і взагалі не подібно, щоб тут щось видаляли.
Подписаться на:
Сообщения (Atom)