SELECT
isg2.RDB$FIELD_NAME FirstField
, rc2.RDB$RELATION_NAME NetTable
, isg4.RDB$FIELD_NAME SecondField
, rc5.RDB$RELATION_NAME TargetTable
, isg6.RDB$FIELD_NAME TargetField
, (SELECT 1
FROM RDB$DATABASE
WHERE
EXISTS(SELECT *
FROM RDB$RELATION_FIELDS rf
WHERE rc5.RDB$RELATION_NAME = rf.RDB$RELATION_NAME
AND rf.RDB$FIELD_NAME = 'LB')
AND EXISTS(SELECT *
FROM RDB$RELATION_FIELDS rf
WHERE rc5.RDB$RELATION_NAME = rf.RDB$RELATION_NAME
AND rf.RDB$FIELD_NAME = 'RB')) IsTree
FROM
RDB$INDEX_SEGMENTS isg1
, RDB$RELATION_CONSTRAINTS rc1
, RDB$REF_CONSTRAINTS rfc1
, RDB$RELATION_CONSTRAINTS rc2
, RDB$INDEX_SEGMENTS isg2
, RDB$INDEX_SEGMENTS isg3
, RDB$RELATION_CONSTRAINTS rc3
, RDB$INDEX_SEGMENTS isg4
, RDB$INDEX_SEGMENTS isg5
, RDB$RELATION_CONSTRAINTS rc4
, RDB$REF_CONSTRAINTS rfc2
, RDB$RELATION_CONSTRAINTS rc5
, RDB$INDEX_SEGMENTS isg6
WHERE
rc1.RDB$RELATION_NAME = :tablename
AND rc1.RDB$INDEX_NAME = isg1.RDB$INDEX_NAME
AND rc1.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
AND rfc1.RDB$CONSTRAINT_NAME = rc2.RDB$CONSTRAINT_NAME
AND rfc1.RDB$CONST_NAME_UQ = rc1.RDB$CONSTRAINT_NAME
AND rc2.RDB$INDEX_NAME = isg2.RDB$INDEX_NAME
AND rc1.RDB$RELATION_NAME <> rc2.RDB$RELATION_NAME
AND isg3.RDB$FIELD_NAME = isg2.RDB$FIELD_NAME
AND rc3.RDB$RELATION_NAME = rc2.RDB$RELATION_NAME
AND rc3.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
AND rc3.RDB$INDEX_NAME = isg3.RDB$INDEX_NAME
AND isg4.RDB$INDEX_NAME = isg3.RDB$INDEX_NAME
AND isg2.RDB$FIELD_NAME <> isg4.RDB$FIELD_NAME
AND isg5.RDB$FIELD_NAME = isg4.RDB$FIELD_NAME
AND rc4.RDB$INDEX_NAME = isg5.RDB$INDEX_NAME
AND rc4.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY'
AND rc4.RDB$RELATION_NAME = rc2.RDB$RELATION_NAME
AND rfc2.RDB$CONSTRAINT_NAME = rc4.RDB$CONSTRAINT_NAME
AND rfc2.RDB$CONST_NAME_UQ = rc5.RDB$CONSTRAINT_NAME
AND rc5.RDB$INDEX_NAME = isg6.RDB$INDEX_NAME
Возвращает список атрибутов типа множество для заданной таблицы.
16 июн. 2010 г.
Неявные JOIN-ы
Такие вот запросы практиковались в раннем Гедымине:
Labels:
SQL
8 июн. 2010 г.
Предварительные результаты по внешним ключам
Для тестирования была использована действующая база ВМК размером 29,912,520 Кб. Были конвертированы все внешние целочисленные ключи, удовлетворяющие следующим условиям:
После этого мы проверили скорость выполнения запроса на изменение данных на таблице AC_ENTRY, которая содержит более 9 млн. записей. Текст команды приводится ниже:
- В таблице более 10 000 записей.
- Уникальных значений в ключе не более 200.
- Ключ не ссылается на эту же таблицу.
После этого мы проверили скорость выполнения запроса на изменение данных на таблице AC_ENTRY, которая содержит более 9 млн. записей. Текст команды приводится ниже:
update ac_entry set companykey = 147048034, usr$gs_department = 147048036, currkey = 147021255, usr$gs_service = 147089059Четыре изменяемых поля — это сконвертированные ссылки. Проверка целостности осуществляется с помощью триггера следующего вида:
CREATE TRIGGER xxx ON AC_ENTRY
AFTER UPDATE
POSITION 32000
BEGIN
IF (NEW.USR$GS_SERVICE IS NOT DISTINCT FROM
OLD.USR$GS_SERVICE) THEN EXIT;
IF (NEW.USR$GS_SERVICE IS NOT NULL) THEN
BEGIN
IF (NOT EXISTS (SELECT id FROM gd_ref_constraint_data
WHERE value_data = NEW.USR$GS_SERVICE
AND constraintkey = 388626603)) THEN
BEGIN
IF (NOT EXISTS (SELECT ID FROM GD_GOOD
WHERE ID = NEW.USR$GS_SERVICE)) THEN
EXCEPTION gd_e_fkmanager 'message';
RDB$SET_CONTEXT('USER_TRANSACTION',
'REF_CONSTRAINT_UNLOCK', '1');
INSERT INTO gd_ref_constraint_data
(constraintkey, value_data, value_count)
VALUES
(388626603, NEW.USR$GS_SERVICE, 1);
RDB$SET_CONTEXT('USER_TRANSACTION',
'REF_CONSTRAINT_UNLOCK', '0');
END
END
END
Время выполнения запроса:- На новой базе — 1945 сек.
- На старой базе — 2642 сек.
7 июн. 2010 г.
Тестирование подсистемы отчетов
При тестировании изменений в подсистеме отчетов мы постарались исключить фактор пропускной способности сети и производительности дисковой подсистемы. Использовался встроенный сервер Firebird 2.5. Данные генерировались с помощью хранимых процедур. Пример такой процедуры можно видеть ниже:
Таблица с результатами находится здесь.
Вывод:
CREATE PROCEDURE tst_p_gen_str_data (i INTEGER)
RETURNS (id INTEGER,
s1 VARCHAR(60),
s2 VARCHAR(60),
s3 VARCHAR(60),
s4 VARCHAR(60))
AS
BEGIN
s1 = 'ABC dfg';
s2 = '123 567 9874 10';
s3 = 'qwertyuiop asdfghjl; xzcvnbvmn,m.';
s4 = '';
WHILE (i > 0) DO
BEGIN
id = :i;
i = :i - 1;
END
END
Тестировались следующие отчеты:- Отчет по одному набору данных со строковыми полями.
- Отчет по одному набору данных с целочисленными полями.
- Отчет по двум наборам данных, связанных связью мастер-дитэйл. Наборы данных со строковыми полями.
Таблица с результатами находится здесь.
Вывод:
- для отчетов мастер-дитэйл на двух датасетах разница незначительна — увеличение потребления памяти на 2% и ускорение на 6%.
- для отчетов, основанных на одном наборе данных, достигается существенное ускорение в 35% при умеренном росте потребления памяти — от 9 до 16%.
Labels:
отчеты,
тестирование
1 июн. 2010 г.
Проблема 1 июня 2010 года
В нашей истории случались забавные и не очень случаи, когда программа начинала работать неверно с определенной даты. Как выяснилось, мы не одиноки и проколы случаются с куда более крупными компаниями. Так с 1 июня 2010 г. перестал запускаться Corel X4. На официальном форуме техподдержки дается решение проблемы: "set back the clock 1-2 months".
Labels:
цікава
Отстоим свой интернет!
Создан сайт ukaz60.net для сбора подписей за отмену Указа 60, фактически уничтожающего свободный интернет в Беларуси. Просьба всем небезразличным поддержать!
Labels:
интернет
Подписаться на:
Комментарии (Atom)