8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 04:43:03 +01:00

Added MON$IO_STATS and MON$RECORD_STATS.

This commit is contained in:
dimitr 2007-09-14 15:13:19 +00:00
parent b55b56ad7d
commit a13f1e0ff4
6 changed files with 198 additions and 40 deletions

View File

@ -364,6 +364,7 @@
const USHORT f_mon_db_res_space = 14;
const USHORT f_mon_db_created = 15;
const USHORT f_mon_db_pages = 16;
const USHORT f_mon_db_stat_id = 17;
const USHORT f_mon_att_id = 0;
@ -379,6 +380,7 @@
const USHORT f_mon_att_timestamp = 10;
const USHORT f_mon_att_gc = 11;
const USHORT f_mon_att_remote_process = 12;
const USHORT f_mon_att_stat_id = 13;
const USHORT f_mon_tra_id = 0;
@ -393,6 +395,7 @@
const USHORT f_mon_tra_read_only = 9;
const USHORT f_mon_tra_auto_commit = 10;
const USHORT f_mon_tra_auto_undo = 11;
const USHORT f_mon_tra_stat_id = 12;
const USHORT f_mon_stmt_id = 0;
@ -401,6 +404,7 @@
const USHORT f_mon_stmt_state = 3;
const USHORT f_mon_stmt_timestamp = 4;
const USHORT f_mon_stmt_sql_text = 5;
const USHORT f_mon_stmt_stat_id = 6;
const USHORT f_mon_call_id = 0;
@ -411,5 +415,22 @@
const USHORT f_mon_call_timestamp = 5;
const USHORT f_mon_call_src_line = 6;
const USHORT f_mon_call_src_column = 7;
const USHORT f_mon_call_stat_id = 8;
const USHORT f_mon_io_stat_id = 0;
const USHORT f_mon_io_page_reads = 1;
const USHORT f_mon_io_page_writes = 2;
const USHORT f_mon_io_page_fetches = 3;
const USHORT f_mon_io_page_marks = 4;
const USHORT f_mon_rec_stat_id = 0;
const USHORT f_mon_rec_seq_reads = 1;
const USHORT f_mon_rec_idx_reads = 2;
const USHORT f_mon_rec_inserts = 3;
const USHORT f_mon_rec_updates = 4;
const USHORT f_mon_rec_deletes = 5;
const USHORT f_mon_rec_backouts = 6;
const USHORT f_mon_rec_purges = 7;
const USHORT f_mon_rec_expunges = 8;

View File

@ -316,6 +316,7 @@ void DatabaseSnapshot::SharedMemory::init(void* arg, SH_MEM_T* shmemData, bool i
Mutex DatabaseSnapshot::initMutex;
DatabaseSnapshot::SharedMemory* DatabaseSnapshot::dump = NULL;
int DatabaseSnapshot::pid = getpid();
DatabaseSnapshot* DatabaseSnapshot::create(thread_db* tdbb)
@ -375,7 +376,7 @@ int DatabaseSnapshot::blockingAst(void* ast_object)
DatabaseSnapshot::DatabaseSnapshot(thread_db* tdbb, MemoryPool& pool)
: snapshot(pool)
: snapshot(pool), idMap(pool), idCounter(0)
{
// Initialize record buffers
RecordBuffer* dbb_buffer =
@ -388,6 +389,10 @@ DatabaseSnapshot::DatabaseSnapshot(thread_db* tdbb, MemoryPool& pool)
allocBuffer(tdbb, pool, rel_mon_statements);
RecordBuffer* call_buffer =
allocBuffer(tdbb, pool, rel_mon_calls);
RecordBuffer* io_stat_buffer =
allocBuffer(tdbb, pool, rel_mon_io_stats);
RecordBuffer* rec_stat_buffer =
allocBuffer(tdbb, pool, rel_mon_rec_stats);
Database* dbb = tdbb->tdbb_database;
fb_assert(dbb);
@ -474,6 +479,12 @@ DatabaseSnapshot::DatabaseSnapshot(thread_db* tdbb, MemoryPool& pool)
case rel_mon_calls:
buffer = call_buffer;
break;
case rel_mon_io_stats:
buffer = io_stat_buffer;
break;
case rel_mon_rec_stats:
buffer = rec_stat_buffer;
break;
default:
fb_assert(false);
}
@ -614,6 +625,21 @@ void DatabaseSnapshot::putField(Record* record, int id, const void* source, size
return;
}
if (length == sizeof(SINT64) && desc.dsc_dtype == dtype_long)
{
// special case: translate 64-bit global ID into 32-bit local ID
const SINT64 global_id = *(SINT64*) source;
SLONG local_id = 0;
if (!idMap.get(global_id, local_id))
{
local_id = ++idCounter;
idMap.put(global_id, local_id);
}
*(SLONG*) address = local_id;
CLEAR_NULL(record, id);
return;
}
switch (desc.dsc_dtype) {
case dtype_text:
{
@ -785,18 +811,18 @@ void DatabaseSnapshot::dumpData(thread_db* tdbb)
// Database information
putDatabase(dbb, *writer);
putDatabase(dbb, *writer, dbb->generateId());
// Self attachment information
putAttachment(self_attachment, *writer);
putAttachment(self_attachment, *writer, dbb->generateId());
// Self transactions information
for (transaction = self_attachment->att_transactions;
transaction; transaction = transaction->tra_next)
{
putTransaction(transaction, *writer);
putTransaction(transaction, *writer, dbb->generateId());
}
// Self requests information
@ -806,7 +832,7 @@ void DatabaseSnapshot::dumpData(thread_db* tdbb)
{
if (!(request->req_flags & (req_internal | req_sys_trigger)))
{
putRequest(request, *writer);
putRequest(request, *writer, dbb->generateId());
}
}
@ -821,7 +847,7 @@ void DatabaseSnapshot::dumpData(thread_db* tdbb)
if (!(request->req_flags & (req_internal | req_sys_trigger)) &&
request->req_caller)
{
putCall(request, *writer);
putCall(request, *writer, dbb->generateId());
}
}
}
@ -834,14 +860,14 @@ void DatabaseSnapshot::dumpData(thread_db* tdbb)
if (attachment == self_attachment)
continue;
putAttachment(attachment, *writer);
putAttachment(attachment, *writer, dbb->generateId());
// Transaction information
for (transaction = attachment->att_transactions;
transaction; transaction = transaction->tra_next)
{
putTransaction(transaction, *writer);
putTransaction(transaction, *writer, dbb->generateId());
}
// Request information
@ -851,7 +877,7 @@ void DatabaseSnapshot::dumpData(thread_db* tdbb)
{
if (!(request->req_flags & (req_internal | req_sys_trigger)))
{
putRequest(request, *writer);
putRequest(request, *writer, dbb->generateId());
}
}
@ -866,7 +892,7 @@ void DatabaseSnapshot::dumpData(thread_db* tdbb)
if (!(request->req_flags & (req_internal | req_sys_trigger)) &&
request->req_caller)
{
putCall(request, *writer);
putCall(request, *writer, dbb->generateId());
}
}
}
@ -888,7 +914,8 @@ void DatabaseSnapshot::dumpData(thread_db* tdbb)
void DatabaseSnapshot::putDatabase(const Database* database,
ClumpletWriter& writer)
ClumpletWriter& writer,
int stat_id)
{
fb_assert(database);
@ -950,11 +977,15 @@ void DatabaseSnapshot::putDatabase(const Database* database,
sizeof(ISC_TIMESTAMP));
// database size
writer.insertBigInt(f_mon_db_pages, PageSpace::actAlloc(database));
// statistics
writer.insertBigInt(f_mon_db_stat_id, getGlobalId(stat_id));
putStatistics(&database->dbb_stats, writer, stat_id);
}
void DatabaseSnapshot::putAttachment(const Attachment* attachment,
ClumpletWriter& writer)
ClumpletWriter& writer,
int stat_id)
{
fb_assert(attachment);
@ -1005,69 +1036,77 @@ void DatabaseSnapshot::putAttachment(const Attachment* attachment,
// garbage collection flag
temp = (attachment->att_flags & ATT_no_cleanup) ? 0 : 1;
writer.insertInt(f_mon_att_gc, temp);
// statistics
writer.insertBigInt(f_mon_att_stat_id, getGlobalId(stat_id));
putStatistics(&attachment->att_stats, writer, stat_id);
}
void DatabaseSnapshot::putTransaction(const jrd_tra* new_transaction,
ClumpletWriter& writer)
void DatabaseSnapshot::putTransaction(const jrd_tra* transaction,
ClumpletWriter& writer,
int stat_id)
{
fb_assert(new_transaction);
fb_assert(transaction);
writer.insertByte(TAG_RECORD, rel_mon_transactions);
int temp;
// transaction id
writer.insertInt(f_mon_tra_id, new_transaction->tra_number);
writer.insertInt(f_mon_tra_id, transaction->tra_number);
// attachment id
writer.insertInt(f_mon_tra_att_id,
new_transaction->tra_attachment->att_attachment_id);
transaction->tra_attachment->att_attachment_id);
// state
temp = new_transaction->tra_requests ? mon_state_active : mon_state_idle;
temp = transaction->tra_requests ? mon_state_active : mon_state_idle;
writer.insertInt(f_mon_tra_state, temp);
// timestamp
writer.insertBytes(f_mon_tra_timestamp,
(UCHAR*) &new_transaction->tra_timestamp.value(),
(UCHAR*) &transaction->tra_timestamp.value(),
sizeof(ISC_TIMESTAMP));
// top transaction
writer.insertInt(f_mon_tra_top, new_transaction->tra_top);
writer.insertInt(f_mon_tra_top, transaction->tra_top);
// oldest transaction
writer.insertInt(f_mon_tra_oit, new_transaction->tra_oldest);
writer.insertInt(f_mon_tra_oit, transaction->tra_oldest);
// oldest active transaction
writer.insertInt(f_mon_tra_oat, new_transaction->tra_oldest_active);
writer.insertInt(f_mon_tra_oat, transaction->tra_oldest_active);
// isolation mode
if (new_transaction->tra_flags & TRA_degree3)
if (transaction->tra_flags & TRA_degree3)
temp = iso_mode_consistency;
else if (new_transaction->tra_flags & TRA_read_committed)
temp = (new_transaction->tra_flags & TRA_rec_version) ?
else if (transaction->tra_flags & TRA_read_committed)
temp = (transaction->tra_flags & TRA_rec_version) ?
iso_mode_rc_version : iso_mode_rc_no_version;
else
temp = iso_mode_concurrency;
writer.insertInt(f_mon_tra_iso_mode, temp);
// lock timeout
writer.insertInt(f_mon_tra_lock_timeout,
new_transaction->tra_lock_timeout);
transaction->tra_lock_timeout);
// read only flag
temp = (new_transaction->tra_flags & TRA_readonly) ? 1 : 0;
temp = (transaction->tra_flags & TRA_readonly) ? 1 : 0;
writer.insertInt(f_mon_tra_read_only, temp);
// autocommit flag
temp = (new_transaction->tra_flags & TRA_autocommit) ? 1 : 0;
temp = (transaction->tra_flags & TRA_autocommit) ? 1 : 0;
writer.insertInt(f_mon_tra_auto_commit, temp);
// auto undo flag
temp = (new_transaction->tra_flags & TRA_no_auto_undo) ? 0 : 1;
temp = (transaction->tra_flags & TRA_no_auto_undo) ? 0 : 1;
writer.insertInt(f_mon_tra_auto_undo, temp);
// statistics
writer.insertBigInt(f_mon_tra_stat_id, getGlobalId(stat_id));
putStatistics(&transaction->tra_stats, writer, stat_id);
}
void DatabaseSnapshot::putRequest(const jrd_req* request,
ClumpletWriter& writer)
ClumpletWriter& writer,
int stat_id)
{
fb_assert(request);
writer.insertByte(TAG_RECORD, rel_mon_statements);
// request id
writer.insertInt(f_mon_stmt_id, request->req_id);
writer.insertBigInt(f_mon_stmt_id, getGlobalId(request->req_id));
// attachment id
if (request->req_attachment) {
writer.insertInt(f_mon_stmt_att_id,
@ -1096,11 +1135,15 @@ void DatabaseSnapshot::putRequest(const jrd_req* request,
}
// sql text
writer.insertString(f_mon_stmt_sql_text, request->req_sql_text);
// statistics
writer.insertBigInt(f_mon_stmt_stat_id, getGlobalId(stat_id));
putStatistics(&request->req_stats, writer, stat_id);
}
void DatabaseSnapshot::putCall(const jrd_req* request,
ClumpletWriter& writer)
ClumpletWriter& writer,
int stat_id)
{
fb_assert(request);
@ -1112,10 +1155,10 @@ void DatabaseSnapshot::putCall(const jrd_req* request,
writer.insertByte(TAG_RECORD, rel_mon_calls);
// call id
writer.insertInt(f_mon_call_id, request->req_id);
writer.insertBigInt(f_mon_call_id, getGlobalId(request->req_id));
// statement id
writer.insertInt(f_mon_call_stmt_id,
statement->req_id);
const SINT64 stmt_id = ((SINT64)getpid() << BITS_PER_LONG) + statement->req_id;
writer.insertBigInt(f_mon_call_stmt_id, stmt_id);
// caller id
if (statement == request->req_caller) {
writer.insertInt(f_mon_call_caller_id, 0);
@ -1149,4 +1192,49 @@ void DatabaseSnapshot::putCall(const jrd_req* request,
// source line/column
writer.insertInt(f_mon_call_src_line, request->req_src_line);
writer.insertInt(f_mon_call_src_column, request->req_src_column);
// statistics
writer.insertBigInt(f_mon_call_stat_id, getGlobalId(stat_id));
putStatistics(&request->req_stats, writer, stat_id);
}
void DatabaseSnapshot::putStatistics(const RuntimeStatistics* statistics,
Firebird::ClumpletWriter& writer,
int stat_id)
{
fb_assert(statistics);
// statistics id
const SINT64 id = getGlobalId(stat_id);
// physical I/O statistics
writer.insertByte(TAG_RECORD, rel_mon_io_stats);
writer.insertBigInt(f_mon_io_stat_id, id);
writer.insertBigInt(f_mon_io_page_reads,
statistics->getValue(RuntimeStatistics::PAGE_READS));
writer.insertBigInt(f_mon_io_page_writes,
statistics->getValue(RuntimeStatistics::PAGE_WRITES));
writer.insertBigInt(f_mon_io_page_fetches,
statistics->getValue(RuntimeStatistics::PAGE_FETCHES));
writer.insertBigInt(f_mon_io_page_marks,
statistics->getValue(RuntimeStatistics::PAGE_MARKS));
// logical I/O statistics
writer.insertByte(TAG_RECORD, rel_mon_rec_stats);
writer.insertBigInt(f_mon_rec_stat_id, id);
writer.insertBigInt(f_mon_rec_seq_reads,
statistics->getValue(RuntimeStatistics::RECORD_SEQ_READS));
writer.insertBigInt(f_mon_rec_idx_reads,
statistics->getValue(RuntimeStatistics::RECORD_IDX_READS));
writer.insertBigInt(f_mon_rec_inserts,
statistics->getValue(RuntimeStatistics::RECORD_INSERTS));
writer.insertBigInt(f_mon_rec_updates,
statistics->getValue(RuntimeStatistics::RECORD_UPDATES));
writer.insertBigInt(f_mon_rec_deletes,
statistics->getValue(RuntimeStatistics::RECORD_DELETES));
writer.insertBigInt(f_mon_rec_backouts,
statistics->getValue(RuntimeStatistics::RECORD_BACKOUTS));
writer.insertBigInt(f_mon_rec_purges,
statistics->getValue(RuntimeStatistics::RECORD_PURGES));
writer.insertBigInt(f_mon_rec_expunges,
statistics->getValue(RuntimeStatistics::RECORD_EXPUNGES));
}

View File

@ -115,16 +115,25 @@ private:
static void dumpData(thread_db*);
static const char* checkNull(int, int, const char*, size_t);
static void putDatabase(const Database*, Firebird::ClumpletWriter&);
static void putAttachment(const Attachment*, Firebird::ClumpletWriter&);
static void putTransaction(const jrd_tra*, Firebird::ClumpletWriter&);
static void putRequest(const jrd_req*, Firebird::ClumpletWriter&);
static void putCall(const jrd_req*, Firebird::ClumpletWriter&);
static SINT64 getGlobalId(int value)
{
return ((SINT64)pid << BITS_PER_LONG) + value;
}
static void putDatabase(const Database*, Firebird::ClumpletWriter&, int);
static void putAttachment(const Attachment*, Firebird::ClumpletWriter&, int);
static void putTransaction(const jrd_tra*, Firebird::ClumpletWriter&, int);
static void putRequest(const jrd_req*, Firebird::ClumpletWriter&, int);
static void putCall(const jrd_req*, Firebird::ClumpletWriter&, int);
static void putStatistics(const RuntimeStatistics*, Firebird::ClumpletWriter&, int);
static Firebird::Mutex initMutex;
static SharedMemory* dump;
static int pid;
Firebird::Array<RelationData> snapshot;
Firebird::GenericMap<Firebird::Pair<Firebird::NonPooled<SINT64, SLONG> > > idMap;
int idCounter;
};
} // namespace

View File

@ -126,6 +126,7 @@
FIELD(fld_att_id , nam_att_id , dtype_long , sizeof(SLONG) , 0 , 0, NULL)
FIELD(fld_stmt_id , nam_stmt_id , dtype_long , sizeof(SLONG) , 0 , 0, NULL)
FIELD(fld_call_id , nam_call_id , dtype_long , sizeof(SLONG) , 0 , 0, NULL)
FIELD(fld_stat_id , nam_stat_id , dtype_long , sizeof(SLONG) , 0 , 0, NULL)
FIELD(fld_pid , nam_pid , dtype_long , sizeof(SLONG) , 0 , 0, NULL)
FIELD(fld_state , nam_state , dtype_short , sizeof(SSHORT), 0 , 0, NULL)

View File

@ -226,6 +226,7 @@ NAME("RDB$REMOTE_ADDRESS", nam_remote_addr)
NAME("RDB$REMOTE_PROTOCOL", nam_remote_proto)
NAME("RDB$SHUTDOWN_MODE", nam_shut_mode)
NAME("RDB$SQL_DIALECT", nam_sql_dialect)
NAME("RDB$STAT_ID", nam_stat_id)
NAME("RDB$STATE", nam_state)
NAME("RDB$STATEMENT_ID", nam_stmt_id)
NAME("RDB$SWEEP_INTERVAL", nam_sweep_int)
@ -248,6 +249,7 @@ NAME("MON$DATABASE", nam_mon_database)
NAME("MON$DATABASE_NAME", nam_mon_db_name)
NAME("MON$FORCED_WRITES", nam_mon_forced_writes)
NAME("MON$GARBAGE_COLLECTION", nam_mon_gc)
NAME("MON$IO_STATS", nam_mon_io_stats)
NAME("MON$ISOLATION_MODE", nam_mon_iso_mode)
NAME("MON$LOCK_TIMEOUT", nam_mon_lock_timeout)
NAME("MON$NEXT_TRANSACTION", nam_mon_nt)
@ -263,7 +265,20 @@ NAME("MON$OLDEST_SNAPSHOT", nam_mon_ost)
NAME("MON$OLDEST_TRANSACTION", nam_mon_oit)
NAME("MON$OWNER", nam_mon_owner)
NAME("MON$PAGE_BUFFERS", nam_mon_page_bufs)
NAME("MON$PAGE_FETCHES", nam_mon_page_fetches)
NAME("MON$PAGE_MARKS", nam_mon_page_marks)
NAME("MON$PAGE_READS", nam_mon_page_reads)
NAME("MON$PAGE_WRITES", nam_mon_page_writes)
NAME("MON$PAGES", nam_mon_pages)
NAME("MON$RECORD_BACKOUTS", nam_mon_rec_backouts)
NAME("MON$RECORD_DELETES", nam_mon_rec_deletes)
NAME("MON$RECORD_EXPUNGES", nam_mon_rec_expunges)
NAME("MON$RECORD_IDX_READS", nam_mon_rec_idx_reads)
NAME("MON$RECORD_INSERTS", nam_mon_rec_inserts)
NAME("MON$RECORD_PURGES", nam_mon_rec_purges)
NAME("MON$RECORD_SEQ_READS", nam_mon_rec_seq_reads)
NAME("MON$RECORD_STATS", nam_mon_rec_stats)
NAME("MON$RECORD_UPDATES", nam_mon_rec_updates)
NAME("MON$REMOTE_ADDRESS", nam_mon_remote_addr)
NAME("MON$REMOTE_PID", nam_mon_remote_pid)
NAME("MON$REMOTE_PROCESS", nam_mon_remote_process)
@ -275,6 +290,7 @@ NAME("MON$SOURCE_LINE", nam_mon_src_line)
NAME("MON$SOURCE_COLUMN", nam_mon_src_column)
NAME("MON$SQL_TEXT", nam_mon_sql_text)
NAME("MON$SQL_DIALECT", nam_mon_dialect)
NAME("MON$STAT_ID", nam_mon_stat_id)
NAME("MON$STATE", nam_mon_state)
NAME("MON$STATEMENTS", nam_mon_statements)
NAME("MON$STATEMENT_ID", nam_mon_stmt_id)

View File

@ -363,6 +363,7 @@ RELATION(nam_mon_database, rel_mon_database, ODS_11_1, rel_virtual)
FIELD(f_mon_db_res_space, nam_mon_res_space, fld_flag, 0, 0, 0, 0)
FIELD(f_mon_db_created, nam_mon_created, fld_time, 0, 0, 0, 0)
FIELD(f_mon_db_pages, nam_mon_pages, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_db_stat_id, nam_mon_stat_id, fld_stat_id, 0, 0, 0, 0)
END_RELATION
RELATION(nam_mon_attachments, rel_mon_attachments, ODS_11_1, rel_virtual)
FIELD(f_mon_att_id, nam_mon_att_id, fld_att_id, 0, 0, 0, 0)
@ -378,6 +379,7 @@ RELATION(nam_mon_attachments, rel_mon_attachments, ODS_11_1, rel_virtual)
FIELD(f_mon_att_timestamp, nam_mon_timestamp, fld_time, 0, 0, 0, 0)
FIELD(f_mon_att_gc, nam_mon_gc, fld_flag, 0, 0, 0, 0)
FIELD(f_mon_att_remote_process, nam_mon_remote_process, fld_file_name, 0, 0, 0, 0)
FIELD(f_mon_att_stat_id, nam_mon_stat_id, fld_stat_id, 0, 0, 0, 0)
END_RELATION
RELATION(nam_mon_transactions, rel_mon_transactions, ODS_11_1, rel_virtual)
FIELD(f_mon_tra_id, nam_mon_tra_id, fld_trans_id, 0, 0, 0, 0)
@ -392,6 +394,7 @@ RELATION(nam_mon_transactions, rel_mon_transactions, ODS_11_1, rel_virtual)
FIELD(f_mon_tra_read_only, nam_mon_read_only, fld_flag, 0, 0, 0, 0)
FIELD(f_mon_tra_auto_commit, nam_mon_auto_commit, fld_flag, 0, 0, 0, 0)
FIELD(f_mon_tra_auto_undo, nam_mon_auto_undo, fld_flag, 0, 0, 0, 0)
FIELD(f_mon_tra_stat_id, nam_mon_stat_id, fld_stat_id, 0, 0, 0, 0)
END_RELATION
RELATION(nam_mon_statements, rel_mon_statements, ODS_11_1, rel_virtual)
FIELD(f_mon_stmt_id, nam_mon_stmt_id, fld_stmt_id, 0, 0, 0, 0)
@ -400,6 +403,7 @@ RELATION(nam_mon_statements, rel_mon_statements, ODS_11_1, rel_virtual)
FIELD(f_mon_stmt_state, nam_mon_state, fld_state, 0, 0, 0, 0)
FIELD(f_mon_stmt_timestamp, nam_mon_timestamp, fld_time, 0, 0, 0, 0)
FIELD(f_mon_stmt_sql_text, nam_mon_sql_text, fld_source, 0, 0, 0, 0)
FIELD(f_mon_stmt_stat_id, nam_mon_stat_id, fld_stat_id, 0, 0, 0, 0)
END_RELATION
RELATION(nam_mon_calls, rel_mon_calls, ODS_11_1, rel_virtual)
FIELD(f_mon_call_id, nam_mon_call_id, fld_call_id, 0, 0, 0, 0)
@ -410,4 +414,23 @@ RELATION(nam_mon_calls, rel_mon_calls, ODS_11_1, rel_virtual)
FIELD(f_mon_call_timestamp, nam_mon_timestamp, fld_time, 0, 0, 0, 0)
FIELD(f_mon_call_src_line, nam_mon_src_line, fld_src_info, 0, 0, 0, 0)
FIELD(f_mon_call_src_column, nam_mon_src_column, fld_src_info, 0, 0, 0, 0)
FIELD(f_mon_call_stat_id, nam_mon_stat_id, fld_stat_id, 0, 0, 0, 0)
END_RELATION
RELATION(nam_mon_io_stats, rel_mon_io_stats, ODS_11_1, rel_virtual)
FIELD(f_mon_io_stat_id, nam_mon_stat_id, fld_stat_id, 0, 0, 0, 0)
FIELD(f_mon_io_page_reads, nam_mon_page_reads, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_io_page_writes, nam_mon_page_writes, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_io_page_fetches, nam_mon_page_fetches, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_io_page_marks, nam_mon_page_marks, fld_counter, 0, 0, 0, 0)
END_RELATION
RELATION(nam_mon_rec_stats, rel_mon_rec_stats, ODS_11_1, rel_virtual)
FIELD(f_mon_rec_stat_id, nam_mon_stat_id, fld_stat_id, 0, 0, 0, 0)
FIELD(f_mon_rec_seq_reads, nam_mon_rec_seq_reads, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_rec_idx_reads, nam_mon_rec_idx_reads, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_rec_inserts, nam_mon_rec_inserts, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_rec_updates, nam_mon_rec_updates, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_rec_deletes, nam_mon_rec_deletes, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_rec_backouts, nam_mon_rec_backouts, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_rec_purges, nam_mon_rec_purges, fld_counter, 0, 0, 0, 0)
FIELD(f_mon_rec_expunges, nam_mon_rec_expunges, fld_counter, 0, 0, 0, 0)
END_RELATION