Дать элемент очереди файлов
Назначение
Команда
DIRF
предназначена для получения информации об указанном элементе
очереди дескрипторов файлов.
Параметры вызова
inter(CBL, NULL, [Opbuf], [CondBuf], RowBuf);
Входные данные
Входными данными являются:
-
контрольный блок
CBL; -
буфер SQL-запросов
OpBuf.
В контрольном блоке должны быть заполнены поля:
| Имя поля | Значение | |
|---|---|---|
Command
|
"DIRF"
| |
RowId
| Порядковый номер элемента очереди файлов (отсчет начинается с 1) | |
LnBufRow
| Длина буфера выборки данных (sizeof(DIRF_OUT)) | |
Node
| Имя ЛИНТЕР-сервера |
Буфер SQL-запросов OpBuf может содержать имя устанавливаемой для данного канала кодовой страницы, которая должна быть известна БД, то есть:
-
находиться в системной таблице LINTER_SYSTEM_USER.$$$CHARSET;
-
или быть описана как синоним в таблице LINTER_SYSTEM_USER.$$$CSALIAS;
-
или быть предопределённым значением UTF-8 или UCS2.
Выходные данные
Выходными данными являются:
-
контрольный блок
CBL; -
буфер выборки данных
RowBuf.
В контрольном блоке будут возвращены:
| Имя поля | Значение | |
|---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
LnBufRow
| Фактическая длина буфера выборки данных | |
SysErr
| Код состояния ОС |
В буфере выборки данных
RowBuf информация будет представлена в следующем виде:
struct DIRF_OUT
{
L_LONG Owner; /* Идентификатор владельца таблицы */
L_CHAR TblName[MAX_ID_LEN]; /* Имя таблицы */
L_BYTE Type; /* Тип файла */
L_BYTE Extent; /* Номер файла */
L_LONG State; /* Признак состояния */
};
В полях буфера выборки данных будет содержаться:
| Имя поля | Значение | |
|---|---|---|
|
| Идентификатор владельца таблицы, дескриптор файла которой находится в указанном элементе очереди дескрипторов файлов | |
|
| Имя таблицы, дескриптор файла которой находится в указанном элементе очереди дескрипторов файлов | |
|
|
Тип файла (таблица 15) | |
|
|
Логический номер файла данной таблицы. Это поле может принимать значение от 1 до 63, в зависимости от количества файлов, объявленных при создании таблицы | |
|
|
Текущее состояние элемента очереди: 1 – элемент занят дескриптором файла; 0 – элемент свободен. |
Команда
DIRF
может быть использована для определения оптимального размера
очереди дескрипторов файлов. Дескриптор файла, включенный в
очередь,
вытесняется из нее только в одном случае – отсутствие свободных элементов при
включении в очередь нового элемента. Поэтому в процессе мониторинга
БД можно выявить
следующие ситуации:
-
часть элементов очереди файлов никогда не используется. Это говорит о том, что размер очереди слишком велик и его без ущерба для производительности БД можно уменьшить (примерно на количество неиспользуемых элементов);
-
в очереди файлов происходит интенсивное вытеснение и добавление элементов. Это говорит о недостаточном размере очереди файлов.
Изменяя размер очереди файлов (насколько позволят системные ресурсы) и выполняя мониторинг БД, можно добиться оптимального размера – когда элементы из очереди не вытесняются, и в то же время количество неиспользуемых элементов очереди минимально.
| Обозначение | Значение | Файл |
|---|---|---|
| FT_INDEX | 0 | Файл индексов |
| FT_DATA | 1 | Файл данных |
| FT_SYSWBV | 2 | Рабочий файл бит-векторов |
| FT_SYSWRK | 3 | Рабочий файл |
| FT_SYSSRT | 4 | Рабочий файл сортировки |
| FT_SYSLOG | 5 | Системный журнал |
| FT_BLOB | 7 | BLOB-файл |
Первые 10 элементов очереди файлов заняты дескрипторами системных файлов в порядке, приведенном в таблице 16.
| № элемента | Имя файла | Комментарий |
|---|---|---|
| 1 | 1.01 |
Файл индексов таблицы
$$$SYSRL
|
| 2 | 1.11 |
Файл данных таблицы
$$$SYSRL
|
| 3 | 2.01 |
Файл индексов таблицы
$$$ATTRI
|
| 4 | 2.11 |
Файл данных таблицы
$$$ATTRI
|
| 5 | 3.01 |
Файл индексов таблицы
$$$USR
|
| 6 | 3.11 |
Файл данных таблицы
$$$USR
|
| 7 | 1.41 | Рабочий файл |
| 8 | 1.31 | Рабочий файл бит-векторов |
| 9 | 1.51 | Рабочий файл сортировки |
| 10 | Резерв | Файлы системного журнала |
Описание
СУБД ЛИНТЕР ведет очереди, не меняя положения элемента очереди в оперативной памяти. Поэтому, если при двух обращениях к элементу с тем же самым порядковым номером были возвращены разные данные, то между двумя этими обращениями СУБД осуществила запись элемента очереди на диск, а на освободившееся место была записана новая информация.
Для файлов с кодами типа 2,3,4
(таблица 15) поля
Owner
и
TblName
будут заполнены нулем и пробелами соответственно.
Информация о файлах с кодом типа 5
(таблица 15) по команде
DIRF не выдается.
Коды завершения
| Код | Описание | |
|---|---|---|
| NORMAL | Нормальное завершение | |
| SMALLBUFKOR | Недостаточный размер буфера выборки данных | |
| EORR | Элемент очереди с заданным порядковым номером не найден |
Пример формирования команды
#include < string.h >
#include < stdlib.h >
#include "inter.h"
L_LONG LinterDIRF(TCBL *pCBL, L_LONG N, DIRF_OUT *Out)
{
memcpy(pCBL- >Command, "DIRF", 4);
pCBL- >LnBufRow=sizeof(DIRF_OUT);
pCBL- >RowId=N;
pCBL- >PrzExe &= ~Q_ASYNC;
inter(pCBL, NULL, NULL, NULL, Out);
return pCBL- >CodErr;
}