Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all 1677 articles
Browse latest View live

Зациклил Insert!

$
0
0
Короче, тупанул написал в ib expert зацикленный insert нарушив следующее правило:
"Допустимо выбирать из той же таблицы, в которую строки вставляются, но эта практика не рекомендуется, так как подобные действия могут привести к бесконечным вставкам строк (зацикливанию)."

Инсерт зациклился и ibexpert завис, я снял задачу (commit не произошел), генератор таблицы показывает 7млн, а в таблице записей 20шт. При этом все работает, но таблица стала жутко медленная (как через ibexpert, так и через программу, которая с этой бд работает).

База увеличилась с 2х гигов до 6 гигов.

Что сделать чтобы вернуть нормальную скорость работы таблицы?

FB 3.0 права procedure/view на блоб в подобъекте

$
0
0
FB 3.0.4.33041
create role TEST$ROLE;
create or alter user TEST$USER password '12345678';
grant TEST$ROLE to user TEST$USER;

recreate table TTEST ( ID   integer not null,  BLB  blob sub_type 0 segment size 80);
insert into TTEST(ID, BLB) values (1, 'тест');

set term ! ;
create or alter procedure TTEST$PROC
returns (
    id type of column ttest.id,
    blb type of column ttest.blb)
as
begin
  for select id
           , blb
      from ttest
      into :id, :blb 
  do suspend;
end!
set term ; !
grant execute on procedure TTEST$PROC to role TEST$ROLE;

create or alter view TTEST$VW(
    ID,
    BLB)
as
select T.ID
     , T.BLB
from TTEST T;
grant select on TTEST$VW to role TEST$ROLE;
grant select on table TTEST to view TTEST$VW;

Если сейчас зайти в БД под TEST$USER+TEST$ROLE и сделать запрос либо из вьюхи, либо из процедуры - вернёт
This user does not have privileges to perform this operation on this object
no permission for SELECT access to TABLE TTEST.

В 2.5 при этом работает как и ожидается.
При этом, проблема касается только блоба. Если блоб отсутствует в выборке - всё работает без неожиданностей.

Ну и собстна вопрос - доколебага/фича? Есть ли workaround?

Интернет в Казани

$
0
0
Хотите подключить интернет в Казани но не знаете какой провайдер подходит именно вам и вашему адресу?
https://kazaninternet.ru

Сборка мусора.

$
0
0
Всем привет!
Помогите пожалуйста разобраться со сборкой мусора.

Описываю ситуацию.
Firebird 2.5. Embeded версия
Ibexpert для мониторинга статистики таблицы

Есть приложение, есть таблица в которой происходит update/insert.

Через IbExpert вижу что таблица замусоривается. Закрываю программу, в IbExpert делаю
select count(*) из таблицы, вижу что мусор очистился. Делаю тоже самое в программе, мусор не чиститься. Понимаю, что в программе остались "Заинтересованные транзакции".
У меня вопрос, как найти транзакции в моём приложении которые мешают сборке мусора?
Я смотрел в таблицы mon$transaction, mon$statements, mon$atachments но ничего нужного не нашёл, может не так смотрел конечно.

cursor и временная таблица

$
0
0
Сервер: LI-V6.3.3.32900 Firebird 3.0

Имеем вот такую временную таблицу:
CREATE GLOBAL TEMPORARY TABLE obj_list (
    id_list    int NOT NULL,
    id_obj    int NOT NULL,
    n  varchar(200)
) ON COMMIT DELETE ROWS;
ALTER TABLE obj_list ADD CONSTRAINT pk_obj_list PRIMARY KEY (id_list, id_obj);


Пробуем запустить:
execute block
returns (
    name type of column rdb$relation_fields.rdb$field_name)
as
    declare variable id_list int;
    declare variable n type of column rdb$relation_fields.rdb$relation_name;
    declare cur cursor for (
        select
            l.n
        from obj_list l
        where
            l.id_list = :id_list
    );
begin
    id_list = 1;
    n = 'RDB$FIELDS';
    merge into obj_list d
    using (
        select
            row_number() over() as id,
            rf.rdb$field_name as n
        from rdb$RELATION_FIELDS rf
        where
            rf.rdb$relation_name = :n
    ) s
    on d.id_list = :id_list and d.id_obj = s.id
    when not matched then
        insert (id_list, id_obj, n)
        values (:id_list, s.id, s.n);

    --suspend;
    open cur;
    while (true) do begin
        fetch cur into :name;
        if (row_count = 0) then
            break;
        suspend;
    end
    close cur;
end

и получаем пустой набор.

Если убрать комментарий у первого suspend, то все нормально (ну за исключением лишней первой строки)

Баг?

Селективный запрос роняет базу

$
0
0
Firebird 2.5.8 SS
Случайно ошибся в запросе и уронил базу с ошибкой:
internal Firebird consistency check (EVL_expr: invalid operation (232), file: evl.cpp line: 1219)
другие коннекты тоже отвалились, подключаться не даёт пока запущено приложение вызвавшее ошибку.

FB3 выдаёт нормальную ошибку группировки

create or alter procedure TEST(ID integer)
returns (VAL varchar(100))
as
begin
  VAL = ID; suspend;
end

select
  (select VAL from TEST(min(r.RDB$RELATION_ID))),
  r.RDB$SYSTEM_FLAG,
  max(r.RDB$RELATION_ID)
from RDB$RELATIONS r
group by 1,2
order by 1


Ошибка известная или в трекер?

RECREATE PACKAGE BODY

$
0
0
Есть пакет:
+

CREATE OR ALTER PACKAGE TEST_A
AS
begin

procedure "Assign"(
    a int,
    b int = null
);

procedure proc1(arg1 int);

function test2(a int) returns int;
 
end;

RECREATE PACKAGE BODY TEST_A
AS
begin

procedure proc1(arg1 int)
as
begin
end
function test2(a int) returns int
as
begin
    return a + 1;
end

procedure "Assign"(
    a int,
    b int)
as
begin
    execute procedure proc1(a + test2(coalesce(b,5)));
end

end;



делаем бэкап/рестор и пробуем выполнить RECREATE PACKAGE BODY (текст можно не менять) и получаем:

This operation is not defined for system tables.
unsuccessful metadata update.
RECREATE PACKAGE BODY TEST_A failed.
Procedure Assign has a signature mismatch on package body TEST_A.

Лечится пересозданием заголовка пакета

Без бэкап/рестор тоже иногда случается.


Server Version: LI-V3.0.4.33047 Firebird 3.0
Server Implementation: Firebird/Linux/AMD/Intel/x64
Service Version: 2

время выполнения запроса

$
0
0
Добрый день!
В рунтайме программа в цикле формирует запросы к БД для заполнения книги в Экселе.
порядка 30тыс селектов разной степени сложности (размерность таблицы 900 на 35).
время выполнения одного запроса 3-10сек. Например такой

select count(id) from sc inner join scf on sc.id=scf.stat_card_id where sc_id!=-1 and (period_id = 20 or period_id = 19 ) and ((( scf.res=21 or scf.res=32 or scf.res=1 or scf.res=31 or scf.res=4 or scf.res=5 or scf.res=6 or scf.res=7 or scf.res=8 or scf.res=9 or scf.res=10 or scf.res=11 or scf.res=12 or scf.res=13 or scf.res=14 or scf.res=15 or scf.res=17 or scf.res=18 or scf.res=16 or scf.res=20) ) ) and (( scf.res=1 ) ) and sc.mode_sc in (0,1,4)

План выполнения такой
Plan
PLAN JOIN (SCF INDEX (SCF_RES, SCF_PERIOD_ID, SCF_PERIOD_ID), SC INDEX (RDB$PRIMARY51))

Adapted Plan
PLAN JOIN (SCF INDEX (SCF_RES, SCF_PERIOD_ID, SCF_PERIOD_ID), SC INDEX (PK_SC))

------ Performance info ------
Prepare time = 0ms
Execute time = 3s 276ms
Avg fetch time = 3 276,00 ms
Current memory = 43 336 744
Max memory = 43 482 792
Memory buffers = 2 048
Reads from disk to cache = 52 484
Writes from cache to disk = 0
Fetches from cache = 5 515 962

FB - SS 2.5.1.26351
Win7(64)
Для доступа к базе используются компоненты FIB.
КОличество записей в SC и SCF порядка 10млн.

Это нормальное (обычное) время выполнения запроса или можно как-то ускорить, чтобы было менее секунды.
Сейчас для расчета такой таблицы уходит порядка суток!
+

Т.О. (Тематический оффтоп)

$
0
0
Я, конечно, мало что видел, но, как правило, народ не заморачивается: sysdba/masterke и - вперёд, на мины.

С другой стороны, не так уж и сложно завести отдельный логин для создания и обслуживания базы (условно - Владыка) и понасоздавать в нужных количествах "рабочих пользователей" (условно - Работяга, РаботягаРаз ...).
+ Сначала
 gsec -user sysdba ...
...

isql -u Владыка ...
create ...;
-- стопитцот однотипных строчек
grant ...;
-- ещё стопитцот строчек
exit;

isql -ex -u Владыка ...
rem ... и положить в сухое, прохладное место
+ Обслуживание
 gbak -user Владыка -b ...

isql -u Владыка -i ФазаРаз.sql ...
rem стопитцот однотипных скриптов

gbak -user Владыка -b ...
То, что это "много лишней возни" с раздачей прав и "вообще неудобно" - понятно, а другие проблемы у такого подхода есть?

Вот, например, всякие ОРМы/Эксперты "лазают" по метаданным.
У владельца прав доступа точно есть, у "работяги"? Явно выдавать или вообще схема не пригодна для разработки?

P.S.
К "устаревшему" gsec - не придираться

OpenSUSE Leap 15: Could not find acceptable ICU library

$
0
0
Прошу помощи. Не могу собрать Firebird 3.0.4 под OpenSUSE Leap 15.

make[3]: вход в каталог «/home/bor/FB/Firebird-3.0.4.33049-0/gen»
rm -f yachts.lnk
ln -s metadata.fdb yachts.lnk
rm -f msg.fdb
echo create database \'msg.fdb\'\; | /home/bor/FB/Firebird-3.0.4.33049-0/gen/Release/firebird/bin/isql
can't format message 17:3 -- message file /home/bor/FB/Firebird-3.0.4.33049-0/gen/Release/firebird/firebird.msg not found
can't format message 17:0 -- message file /home/bor/FB/Firebird-3.0.4.33049-0/gen/Release/firebird/firebird.msg not found
Could not find acceptable ICU library

ICU установлен:
bor@lbor:~> zypper info icu
Загрузка данных о репозиториях...
Чтение установленных пакетов...


Сведения — пакет icu:
---------------------
Репозиторий : Основной репозиторий (OSS)
Имя : icu
Версия : 60.2-lp150.1.4
Архитектура : x86_64
Поставщик : openSUSE
Размер после установки : 630,3 KiB
Установлено : Да
Состояние : актуален
Пакет с исходным кодом : icu-60.2-lp150.1.4.src
Заключение : International Components for Unicode
Описание :
ICU is a set of C and C++ libraries that provide extensive Unicode and locale
support, such as calendar, conversions for many character sets, language
sensitive collation, date and time formatting, support for many locales,
message catalogs and resources, message formatting, normalization, number and
currency formatting, time zone support, transliteration, and word, line, and
sentence breaking.

This subpackage contains the runtime programs for interacting with ICU.

bor@lbor:/usr/lib64> ls libicu*
libicudata.so libicudata.so.60.2 libicui18n.so.60_2 libicuio.so libicuio.so.60.2 libicutest.so.60_2 libicutu.so libicutu.so.60.2 libicuuc.so.60_2
libicudata.so.60_2 libicui18n.so libicui18n.so.60.2 libicuio.so.60_2 libicutest.so libicutest.so.60.2 libicutu.so.60_2 libicuuc.so libicuuc.so.60.2

Ошибка при создании FK problematic key value NULL

$
0
0
что означает?
Изначально в этой записи было не NULL значение, запись на которую оно (как бы) ссыллось была удалена, в поле помещен NULL, а теперь при создании FK выдается такая ошибка. Колеса пинал, стекла протирал, все транзакции закоммичены, приложения из которых удалялись и изменялись эти записи перезапущены, тем не менее.
FB 2.5.6.26979

Восстановление связи с сервером

$
0
0
Добрый день всем!
У меня клиент связывается с сервером с помощью библиотеки IBPP.
Можно ли, с помощью этой библиотеки, как-то отловить аварийную потерю связи с сервером?
Я уже поискал на форуме - советуют дёргать сервер простым запросом, например select current_time from rdb$database.
Я так и сделал. Вызываю такую функцию в цикле, в отдельном потоке:
int TestConnect(char *destptr)
{
int ret = -1;

pthread_mutex_lock(&mutex);

try
{
if (qtestconnect->exec(st))
ret = 1;
else
{
ret = -1;
errorstr = (string) qtestconnect->errorstr.c_str();
log("Error TDataLayer::TestConnect: - " + errorstr);
}
}
catch (IBPP::Exception& e)
{
errorstr = cp2koi(e.what(),1);
ret = -1;
log("Error TDataLayer::TestConnect: - " + errorstr);
}
Дрбрый день всем!
У меня клиент связывается с сервером с помощью библиотеки IBPP.
Можно ли, с помощью этой библиотеки, как-то отловить аварийную потерю связи с сервером?
Я уже поискал на форуме - советуют дёргать сервер простым запросом, например select current_time from rdb$database.
Я так и сделал. Вызываю такую функцию в цикле, в отдельном потоке:
int TestConnect(char *destptr)
{
int ret = -1;

pthread_mutex_lock(&mutex);

try
{
if (qtestconnect->exec(st))
ret = 1;
else
{
ret = -1;
errorstr = (string) qtestconnect->errorstr.c_str();
log("Error TDataLayer::TestConnect: - " + errorstr);
}
}
catch (IBPP::Exception& e)
{
errorstr = cp2koi(e.what(),1);
ret = -1;
log("Error TDataLayer::TestConnect: - " + errorstr);
}

pthread_mutex_unlock(&mutex);

return (ret);
},
где:
qtestconnect = new TIBPPQuery(db, "cp1251", "utf8");
qtestconnect->SetNewQuery("select current_time from rdb$database", IBPP::amRead);
.
Но когда выдёргиваю кабель, программа просто виснет на выполнении запроса (qtestconnect->exec(st)) и не попадает ни в блок else, ни в блок catch.
Можно ли, средствами IBPP, как-то отловить аварийную потерю связи с сервером или в этом случае придётся пинговать сервер?
pthread_mutex_unlock(&mutex);

return (ret);
},
где:
qtestconnect = new TIBPPQuery(db, "cp1251", "utf8");
qtestconnect->SetNewQuery("select current_time from rdb$database", IBPP::amRead);
.
Но когда выдёргиваю кабель, программа просто виснет на выполнении запроса (qtestconnect->exec(st)) и не попадает ни в блок else, ни в блок catch.
Можно ли, средствами IBPP, как-то отловить аварийную потерю связи?
Или может ещё какой-нибудь способ есть?
Заранее спасибо.

Текущая таблица в триггере

$
0
0
Фича-реквест - получить имя текущей таблицы в триггере, что-то вроде CURRENT_TABLE.
Для чего - есть некий шаблон универсального триггера, который передает в ХП и в другие таблицы имя таблицы, для которой он сработал. Чтобы не подставлять в этом шаблоне фактическое имя таблицы, было бы удобно передавать туда значение такой контекстной переменной.
Так вот, нужна еще кому-то эта фича или нет? И есть ли нечто подобное в других sql-серверах?

Преобразовать blob (0) или blob text (1) в пользовательский blob (-1 - -32768)

$
0
0
Есть такая возможность без написания фильтра? Или уже готовые фильтры в IBExpert? Varchar в тип 0 или 1 конвертируется без проблем, в пользовательские ошибка.

Медленный select count(*)

$
0
0
Есть таблица с примерно 22 млн записей. select count(*) по ней занимает примерно 40 минут, что очень долго. Для чего нужен select count(*) не спрашивайте, т.к. он нужен не мне (на самом деле используется запрос посложнее select count(*)). Доступа к базе нету и вообще пока что обладаю минимальной инфой о базе и о том, как её используют.

Статистика при выполнении запроса такая:
+

SELECT COUNT(*) FROM CURV_VERSIONS;

PLAN (CURV_VERSIONS NATURAL)

COUNT
============
22733063

Current memory = 8435825808
Delta memory = 37104
Max memory = 8544542928
Elapsed time= 2442.59 sec
Buffers = 1000000
Reads = 4129105
Writes 5811
Fetches = 63521418


Есть также вьюха, основанная на этой таблице. select count(*) из ней ещё печальнее:
+
SELECT COUNT(*) FROM VIEW_CURVE;

PLAN JOIN (MERGE (SORT (JOIN (JOIN (JOIN (JOIN (JOIN (JOIN (JOIN (JOIN (VIEW_CURVE LV F NATURAL, VIEW_CURVE LV L1 INDEX (PK_LEVELS_ID), VIEW_CURVE LV LT1 INDEX (PK_LEVELTYPES_TYPEV)), JOIN (VIEW_CURVE LV L2 INDEX (PK_LEVELS_ID), VIEW_CURVE LV LT2 INDEX (PK_LEVELTYPES_TYPEV))), JOIN (VIEW_CURVE LV L3 INDEX (PK_LEVELS_ID), VIEW_CURVE LV LT3 INDEX (PK_LEVELTYPES_TYPEV))), JOIN (VIEW_CURVE LV L4 INDEX (PK_LEVELS_ID), VIEW_CURVE LV LT4 INDEX (PK_LEVELTYPES_TYPEV))), JOIN (VIEW_CURVE LV L5 INDEX (PK_LEVELS_ID), VIEW_CURVE LV LT5 INDEX (PK_LEVELTYPES_TYPEV))), JOIN (VIEW_CURVE LV L6 INDEX (PK_LEVELS_ID), VIEW_CURVE LV LT6 INDEX (PK_LEVELTYPES_TYPEV))), JOIN (VIEW_CURVE LV L7 INDEX (PK_LEVELS_ID), VIEW_CURVE LV LT7 INDEX (PK_LEVELTYPES_TYPEV))), JOIN (VIEW_CURVE LV L8 INDEX (PK_LEVELS_ID), VIEW_CURVE LV LT8 INDEX (PK_LEVELTYPES_TYPEV)))), SORT (JOIN (JOIN (JOIN (VIEW_CURVE CN NATURAL, VIEW_CURVE CV INDEX (FK_CURVVERSIONS_NAMEID)), VIEW_CURVE CC INDEX (PK_CURVCOMMENTS_ID)), VIEW_CURVE U INDEX (PK_UNITS_ID)))), VIEW_CURVE DB INDEX (PK_WSDATABASE_ID))

COUNT
============
22723272

Current memory = 8436037600
Delta memory = 211792
Max memory = 8544542928
Elapsed time= 5015.62 sec
Buffers = 1000000
Reads = 4608871
Writes 25225
Fetches = 389290619


Firebird скорее всего 2.5.* на винде. Можно из этих данных понять в чём причина тормозов? Или нужно больше инфы?

instclient (FB3.0) куда вывод идет, запускаю - в ответ тишина

$
0
0
Добрый день!

Устанавливаю FIB 3.0 (как приложение), указываю - создать gds32.dll. При установке выдает сообщение об установке в системной папке. Далее поиском по системному диску (и по диску D:\) - находит какое-то старье от 12-го года (от InterBase XE3 как я понимаю).

Ладно, запускаю 'instclient i -f g' - в ответ тишина.

Запускаю IBExpert, загружаю employee.fdb - все гуд. Делаю простой проект в XE3, база та же. Жму Test в диалоге свойств IBDatabase1 - выдает 'connection rejected by remote interface'.
Я так понимаю, нет gds32.dll? Где его искать? Куда его класть.

Темы
http://www.ibase.ru/ibx/
http://www.ibase.ru/inst_manual/#files
и др.
перечитал несколько раз, но ни фига не понял в данном контексте.

Где искать логи firebird?

RDB$SET_CONTEXT и RDB$GET_CONTEXT

$
0
0
Два вопроса, связанных с методами работы с контекстными переменными в FB 3.0.

1. Длина имени переменной.
По доке она ограничена длиной 80 символов. По факту можно присвоить и 100 символов.
EXECUTE BLOCK
RETURNS (VAL INTEGER)
AS
DECLARE VARIABLE VAL_PARAM VARCHAR(30000);
DECLARE VARIABLE LEN INTEGER;
BEGIN
    RDB$SET_CONTEXT('USER_SESSION', LPAD('', 100, '0'), LPAD('', 100, '1'));
    VAL_PARAM = RDB$GET_CONTEXT('USER_SESSION', LPAD('', 100, '0'));
    VAL = CHAR_LENGTH(:VAL_PARAM);
    SUSPEND;
END


Возвращается число 100.

Но попытка открыть таблицу мониторинга приводит к исключению:
SELECT * FROM MON$CONTEXT_VARIABLES

Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.
expected length 80, actual 100.

2. Длина значения переменной.
В руководстве написано:
Таблица 7.3. Параметры функции RDB$GET_CONTEXT
Тип возвращаемого результата: VARCHAR(255)

А таблица MON$CONTEXT_VARIABLES говорит о том, что это не так:
CREATE TABLE MON$CONTEXT_VARIABLES (
    MON$ATTACHMENT_ID   BIGINT,
    MON$TRANSACTION_ID  BIGINT,
    MON$VARIABLE_NAME   VARCHAR(80) CHARACTER SET NONE,
    MON$VARIABLE_VALUE  VARCHAR(32765) CHARACTER SET NONE
);

Проверяем:
EXECUTE BLOCK
RETURNS (VAL INTEGER)
AS
DECLARE VARIABLE PARAM VARCHAR(30000);
DECLARE VARIABLE VAL_PARAM VARCHAR(30000);
DECLARE VARIABLE LEN INTEGER;
BEGIN
    PARAM = LPAD('', 10000, '0');
    LEN = CHAR_LENGTH(:PARAM);
    RDB$SET_CONTEXT('USER_SESSION', 'CONT_PARAM', :PARAM);
    VAL_PARAM = RDB$GET_CONTEXT('USER_SESSION', 'CONT_PARAM');

    VAL = CHAR_LENGTH(:VAL_PARAM);
    SUSPEND;
END

Выборка из таблицы мониторинга работает:
SELECT * FROM MON$CONTEXT_VARIABLES


Но использование в запросе приводит к ошибке:
SELECT RDB$GET_CONTEXT('USER_SESSION', 'CONT_PARAM') FROM RDB$DATABASE

Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.
expected length 255, actual 10000.

Вопрос Владу - написать об этих проблемах в трекер?

Создание PK в таблице с данными

$
0
0
Добрый день.
Есть таблица с данными. В ней составной первичный ключ. Хочу добавить новое поле с простым идентификатором вместо составного. Для этого:
1. удаляю старый PK
2. добавляю простую колонку ID (без NOT NULL)
3. заполняю значениями ID
4. устанавливаю NOT NULL в ID
5. создаю новый PK на колонке ID

При попытке выполнить пункт 5 ошибка:
[FireDAC][Phys][FB]validation error for column ID, value "*** null ***"

Скрипты выполняются последовательно в рамках одного подключения к БД.
Перед выполнением каждого скрипта "вручную" запускается транзакция.
После выполнения в зависимости от результата commit или rollback.
Версия FB: 3.0.3.32900.
Скрипты выполняются программно в Delphi 10 Seattle + FireDAC.

Что я делаю не так? Вроде в рамках одного подключения должны быть видны предыдущие изменения...
Хотелось бы отметить, что ошибка происходит только если в таблице есть данные.
Между выполнением скриптов (останавливался в точке останова) подключался к базе и проверял наличие NULL в поле ID. NULL отсутствовали. Более того NOT NULL для колонки ID применилось, значит NULL в колонке не может быть по определению.

Как сделать сводную таблицу из выборки

$
0
0
Добрый день!

Подскажите, пожалуйста - есть некий запрос, который делает выборку из трех таблиц
и возвращает результат в виде таблицы номер 1.

Нужно получить сводную таблицу, где для каждого ФИО будет подсчитано число
Текущих, Отложенных и Будущих ремонтов (таблица номер 2)?

Накопление версий записей при UPDATE

$
0
0
Есть приложение, собирающее данные с датчиков и сохраняющее их в БД Firebird 2.5.
Данные сохраняются через вызов хранимой процедуры, которая делает INSERT в лог и UPDATE в таблицу состояний датчиков, после чего зовёт post_event.
Пишущая транзакция: write nowait read_committed rec_version.

Слушатели эвента стартуют транзакцию, в которой читают из БД новые записи в лог и обновлённые состояния датчиков для их визуализации.
Читающая транзакция: read nowait concurrency.

В лабораторных условиях работает без проблем, однако пользователи софта рапортуют о накоплении версий записей в таблице состояний:

Table                 Records    Versions  Rec/Vers size
STATE : 1352 698291 22%


Parameter		Value
Page size 4096
Forced Write ON
Dialect 3
OnDiskStructure 11.2
Sweep interval 20000
Oldest transaction 241697086
Oldest snapshot 241710000
Oldest active 241710000
Next transaction 241710001
Sweep gap (active - oldest) 12914
TIP size 14754 pages, 59015 kilobytes
Snapshot TIP size 12915 transactions, 7 kilobytes
Active transactions 1, 0% of daily average
Transactions per day 833482, for 290 days
Data versions percent 29.16% - records: 487 mb, versions: 142 mb, pages 883 mb, indices 220 mb
Database Size 1217.70 megabytes, 91% data and indices


Что можно проверить, чтобы выйти на причину?
Viewing all 1677 articles
Browse latest View live