07.08.2009, 12:40 | #1 |
Участник
|
размер 1 записи (строки)
как несложно посчитать сколько занимает 1 запись в таблице (максимальный размер и текущая выбранная)?
__________________
--- SHiSHok |
|
07.08.2009, 13:13 | #2 |
MCITP
|
Цитата:
Это зависит от СУБД, в сиквеле и в оракле ответ будет разный и искать надо там... Для оракла могу написать вам запрос, если интересно..
__________________
Zhirenkov Vitaly |
|
07.08.2009, 13:15 | #3 |
MCITP
|
ну не считая direct sql, конечно...
__________________
Zhirenkov Vitaly |
|
07.08.2009, 13:23 | #4 |
Участник
|
Ну, приближенно можно посчитать с помощью метода fieldSize() на SysDictField:
X++: static void Job2(Args _args) { SysDictTable dictTable = SysDictTable::newName(tableStr(InventTable)); SysDictField dictField; Counter fieldCnt; int recordSize; ; for (fieldCnt = 1; fieldCnt <= dictTable.fieldCnt(); fieldCnt++) { dictField = SysDictField::newName(dictTable.name(), dictTable.fieldName(dictTable.fieldCnt2Id(fieldCnt))); recordSize += dictField.fieldSize(); } info(int2str(recordSize)); } плюс служебную информацию заголовка сообщения при передаче по сети. |
|
|
За это сообщение автора поблагодарили: aidsua (1). |
07.08.2009, 13:27 | #5 |
Участник
|
Только что заметил, что на SysDictTable уже есть метод recordSize с реализацией, похожей на приведенную выше. Так что можно и им воспользоваться.
|
|
07.08.2009, 13:31 | #6 |
Участник
|
Цитата:
Сообщение от kashperuk
Ну, приближенно можно посчитать с помощью метода fieldSize() на SysDictField:
X++: static void Job2(Args _args) { SysDictTable dictTable = SysDictTable::newName(tableStr(InventTable)); SysDictField dictField; Counter fieldCnt; int recordSize; ; for (fieldCnt = 1; fieldCnt <= dictTable.fieldCnt(); fieldCnt++) { dictField = SysDictField::newName(dictTable.name(), dictTable.fieldName(dictTable.fieldCnt2Id(fieldCnt))); recordSize += dictField.fieldSize(); } info(int2str(recordSize)); } плюс служебную информацию заголовка сообщения при передаче по сети. Например, fieldSize считает, что поля типа Enum занимают 1 байт, а в реальности все 4 (DAX 4.0 MS SQL 2005) X++: case Types::Enum: size = 1; break; X++: case Types::Date: case Types::DateTime: case Types::Integer: size = 4; break; Так, что я бы с осторожностью считал размер записи данным способом Кстати, еще есть размер записи в таблице трассировки SQL операторов Администирование\Запросы\База данных\Журнал трассировки операторов SQL, вкладка Разное, только не понятно, насколько этот параметр соотвествует действительности и пронаблюдать его значение можно, только в случае есть SQL оператор попал в трассировку (но все таки этому параметру я доверяю больше, чем SysDictTable\recordSize) P.S. Не видел предыдущего сообщения когда писал
__________________
Sergey Nefedov Последний раз редактировалось SRF; 07.08.2009 в 13:39. Причина: p.s. |
|
07.08.2009, 13:39 | #7 |
MCITP
|
Импровизируйте
X++: SysDictTable::newTableId(tableNum(InventTable));
__________________
Zhirenkov Vitaly |
|
07.08.2009, 13:43 | #8 |
Участник
|
поспешил. расчет есть.
__________________
--- SHiSHok |
|
07.08.2009, 14:48 | #9 |
Участник
|
решил так
каличный метод. у меня mssql2k, сделал следующее:
создал табличку (в ax) CREATE TABLE [dbo].[TABLE2] ( [FSTR] [varchar] (10) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL , [FINT] [int] NOT NULL , [FREAL] [numeric](28, 12) NOT NULL , [FDATE] [datetime] NOT NULL , [FTIME] [int] NOT NULL , [FENUM] [int] NOT NULL , [FCON] [image] NULL , [DATAAREAID] [varchar] (3) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL , [RECID] [int] NOT NULL ) + пофиксил метод SysDictField.fieldSize() (по перекрестным ссылках используется только в отчетах о размере базы/компании): X++: int fieldSize() { int size; switch (this.baseType()) { case Types::DATETIME: case Types::DATE: size = 8; break; // case Types::DATE: // case Types::DATETIME: case Types::INTEGER: size = 4; break; case Types::BLOB: case Types::CONTAINER: case Types::VARSTRING: size = 2048; // 8192 div 4 (assumption: One out of 4 has data) break; case Types::REAL: size = 13; //20; break; case Types::ENUM: size = 4; //1; break; case Types::STRING: case Types::RSTRING: size = this.stringLen(); break; } return size*this.arraySize(); } X++: TableId RecId sequenceNum dataAreaId createdTransactionId createdBy createdTime createdDate modifiedTransactionId modifiedBy modifiedTime modifiedDate fCon fEnum fTime fDate fReal fInt fStr X++: int recordSize() { int size; int i; SysDictField sysDictField; for (i=this.fieldCnt(); i; i--) { SysDictField = new SysDictField(this.id(), this.fieldCnt2Id(i)); if ( SysDictField.isSql() ) size += SysDictField.fieldSize(); } return size; } X++: RecId dataAreaId fCon fEnum fTime fDate fReal fInt fStr
__________________
--- SHiSHok Последний раз редактировалось SHiSHok; 07.08.2009 в 14:54. Причина: дополнил |
|
07.08.2009, 14:53 | #10 |
MCITP
|
Потому что это всё не более, чем гадания на хрустальном шарике...
Если нужно именно точная цифра, то выше я уже ответил...
__________________
Zhirenkov Vitaly |
|
07.08.2009, 15:00 | #11 |
Участник
|
по крайней мере если нет больших типов можно получить точный расчет.
__________________
--- SHiSHok |
|
07.08.2009, 15:04 | #12 |
MCITP
|
Точный расчёт чего? Максимального размера - да, можно...
Точного размера текущей записи в БД? То что цифры (в оракле по крайней мере) могут занимать разное кол-во байт в БД в зависимоти от размера, вы учитываете? То что БД может быть Юникодная вы учитываете? ...
__________________
Zhirenkov Vitaly |
|
07.08.2009, 15:20 | #13 |
Участник
|
да (с оговоркой про большие поля)
судя по всему в ax нет точного расчета размера записи. остается сиквел ковырять.
__________________
--- SHiSHok |
|
07.08.2009, 17:38 | #14 |
Участник
|
Давно хотелось спросить: вопрос продиктован чисто академическим интересом или практическим ? если практическим - то каким именно? (хотите спрогнозировать рост базы на Х лет вперед при определенной интенстивности работы юзеров ? )
|
|
10.08.2009, 09:58 | #15 |
Участник
|
Цитата:
А усредненный прогноз роста базы я делаю по статистике роста бекапов сиквела.
__________________
--- SHiSHok |
|
10.08.2009, 18:02 | #16 |
Участник
|
btw, для статистической информации (min, max, avg) размер записи в mssql2k подойдет dbcc showcontig
__________________
--- SHiSHok |
|
Теги |
sql, запись |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|