пятница, 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 (
 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 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. Цікаво, це у всіх редактор блогера не має кнопки «Програмний код», чи лише у мене? :/

четверг, 13 августа 2009 г.

just test

Цікаво, а в гуглі є якась автотестілка, котра шукає слово "test" і видаляє нафіг записи з таким контентом? Нє, навряд. Можна щось потрібне видалити. Та і взагалі не подібно, щоб тут щось видаляли.