powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как подсчитать размер индекса
19 сообщений из 19, страница 1 из 1
Как подсчитать размер индекса
    #34577279
Marina3494
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток!
Прошу подскажите как подсчитать
размер индекса? а суммарный размер таблицы с индексами?

К примеру вот таблица содержит 3 поля

Поле Тип
sp_id char(14)
st_wyg smallint
bufer char
Все 3 поля составляют первичный ключ.

Пишется - запись имеет длину 17 б, всего записей 250,
размер индекса – 31 б, суммарный размер таблицы 16 Кб.

Как подсчитали размер индекса? суммарный размер таблицы?
Спасибо!
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34577528
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вас интересует теория (почему именно строка 17 байт, а индекс 31байт?) или практика (сколько килобайт или страниц занимает уже существующая таблица/индекс ?
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34577557
Marina3494
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Практика, нужны
эти данные для существующих таблиц/индексов.
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34577655
Marina3494
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Практика, нужны
эти данные для существующих таблиц/индексов.
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34577717
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно легко посмотреть размер данных и индексов, а также др. информацию с помощью утилиты oncheck:

oncheck -pt database:tabname
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34577749
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам, наверное, будет полезно знать, что индексы могут быть "присоединенные" (т.е. индексные страницы расположены в том же табличном пространстве, что и данные таблицы) и "отсоединенные", когда индекс строится в отдельном пространстве (tablespace). В каждом случае размеры нужно считать по разному, но можно использовать готовые запросы.
См. структуру системных таблиц systables (npused), sysindexes и таблицы/представления из системной БД sysmaster (systabinfo, systabnames, sysptnhdr)

Есть множество простеньких запросов для подсчета размеров таблиц (tablespaces), но я вам предлагаю большой, "сложный" и... красивый :)
--------------------------------------------------
-- Find all real tables space usage (pages and MB)
-- for one db (current)
-- User's tables, System's tables and Total
-- IDS 7.3+ 9.2+
--
-- V.Shulzhenko DBA_Tools (by Informix FAQ)
-- 2002-01 - 2007-04
--------------------------------------------------
----- User's tables -----
select n.tabname[1,18] tabname18
,substr(ti_nrows,1,10) num_rows
,substr(sum(ti_nptotal),1,7) total_p
,substr(sum(ti_npused),1,7) used_p
,substr(sum(ti_npdata),1,7) data_p
,substr((sum(ti_npused)-sum(ti_npdata)),1,7) nodata
,substr((sum(ti_nptotal)-sum(ti_npused)),1,7) free_p
,substr(round(sum(ti_nptotal)*(select sh_pagesize from sysmaster:sysshmvals)/1048576,2),1,7) size_mb
from sysmaster:systabinfo i,sysmaster:systabnames n,systables s
where i.ti_partnum = n.partnum
and s.tabid > 99 and n.partnum=s.partnum
and n.dbsname= (select odb_dbname from sysmaster:sysopendb
where odb_sessionid=dbinfo('sessionid') and odb_iscurrent='Y')
group by 1,2
into temp _temp_dbatools
;
insert into _temp_dbatools
select '------------------','----------','-------','-------','-------','-------','-------','-------'
from systables
where tabid=1
;
----- Total User's tables -----
insert into _temp_dbatools
select '-Total User tables'
,substr(sum(ti_nrows),1,10)
,substr(sum(ti_nptotal),1,7)
,substr(sum(ti_npused),1,7)
,substr(sum(ti_npdata),1,7)
,substr((sum(ti_npused)-sum(ti_npdata)),1,7)
,substr((sum(ti_nptotal)-sum(ti_npused)),1,7)
,substr(round(sum(ti_nptotal)*(select sh_pagesize from sysmaster:sysshmvals)/1048576,2),1,7)
from sysmaster:systabinfo i,sysmaster:systabnames n,systables s
where i.ti_partnum = n.partnum
and s.tabid > 99 and n.partnum=s.partnum
and n.dbsname= (select odb_dbname from sysmaster:sysopendb
where odb_sessionid=dbinfo('sessionid') and odb_iscurrent='Y')
;
insert into _temp_dbatools
select '------------------','----------','-------','-------','-------','-------','-------','-------'
from systables
where tabid=1
;
----- System's tables -----
insert into _temp_dbatools
select n.tabname[1,18]
,substr(ti_nrows,1,10)
,substr(sum(ti_nptotal),1,7)
,substr(sum(ti_npused),1,7)
,substr(sum(ti_npdata),1,7)
,substr((sum(ti_npused)-sum(ti_npdata)),1,7)
,substr((sum(ti_nptotal)-sum(ti_npused)),1,7)
,substr(round(sum(ti_nptotal)*(select sh_pagesize from sysmaster:sysshmvals)/1048576,2),1,7)
from sysmaster:systabinfo i,sysmaster:systabnames n,systables s
where i.ti_partnum = n.partnum
and s.tabid < 100 and n.partnum=s.partnum
and n.dbsname= (select odb_dbname from sysmaster:sysopendb
where odb_sessionid=dbinfo('sessionid') and odb_iscurrent='Y')
group by 1,2
;
insert into _temp_dbatools
select '------------------','----------','-------','-------','-------','-------','-------','-------'
from systables
where tabid=1
;
----- Total System's tables -----
insert into _temp_dbatools
select '-Total System tabs'
,substr(sum(ti_nrows),1,10)
,substr(sum(ti_nptotal),1,7)
,substr(sum(ti_npused),1,7)
,substr(sum(ti_npdata),1,7)
,substr((sum(ti_npused)-sum(ti_npdata)),1,7)
,substr((sum(ti_nptotal)-sum(ti_npused)),1,7)
,substr(round(sum(ti_nptotal)*(select sh_pagesize from sysmaster:sysshmvals)/1048576,2),1,7)
from sysmaster:systabinfo i,sysmaster:systabnames n,systables s
where i.ti_partnum = n.partnum
and s.tabid < 100 and n.partnum=s.partnum
and n.dbsname= (select odb_dbname from sysmaster:sysopendb
where odb_sessionid=dbinfo('sessionid') and odb_iscurrent='Y')
;
insert into _temp_dbatools
select '------------------','----------','-------','-------','-------','-------','-------','-------'
from systables
where tabid=1
;
----- Total all tables for db -----
insert into _temp_dbatools
select '-Total all tables-'
,substr(sum(ti_nrows),1,10)
,substr(sum(ti_nptotal),1,7)
,substr(sum(ti_npused),1,7)
,substr(sum(ti_npdata),1,7)
,substr((sum(ti_npused)-sum(ti_npdata)),1,7)
,substr((sum(ti_nptotal)-sum(ti_npused)),1,7)
,substr(round(sum(ti_nptotal)*(select sh_pagesize from sysmaster:sysshmvals)/1048576,2),1,7)
from sysmaster:systabinfo i,sysmaster:systabnames n
where i.ti_partnum = n.partnum
and n.dbsname= (select odb_dbname from sysmaster:sysopendb
where odb_sessionid=dbinfo('sessionid') and odb_iscurrent='Y')
;
---------------------------------------
Select * from _temp_dbatools
;
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34577781
Marina3494
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А где там размер индексов?
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34577791
Marina3494
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имела в виду, в
oncheck -pt
где размер индексов?
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34577852
Marina3494
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilis,
огромное спасибо за скрипт,
размеры таблиц теперь для меня не проблема,
хотя с размерами индексов вопрос по-прежнему,
sysindexes не помогла.

Я наверное неправильно все же сформулировала.
Mне важно смоделировать ситуацию -
таблица создана, в ней скажем сейчас 33 записи,
а в будущем планируется - 200 записей.
Информация по ней существующей мне менее интересна.
Мне нужно рассчитать размер индекса,
размер записи конечно знаю, и размер БУДУЩЕЙ таблицы (то есть когда
будет достигнуто 200 записей).
Так получается, что это все же теория...
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34578040
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marina3494Имела в виду, в
oncheck -pt
где размер индексов?

если внимательно посмотрите вывод этой команды то увидите размеры индексов (если индексы на таблице есть). Для индексов и данных там есть поле Number of pages allocated (для каждого индекса свое)
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34578330
Marina3494
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хоть убивай себя об стену, не понимаю!
Вот насчет вышеприведенной таблицы что пишет:


TBLspace Report for valmetdb:informix.welstat

Physical Address 10bb1a
Creation date 10/23/2002 02:36:41
TBLspace Flags 802 Row Locking
TBLspace use 4 bit bit-maps
Maximum row size 17
Number of special columns 0
Number of keys 1
Number of extents 2
Current serial value 1
First extent size 8
Next extent size 8
Number of pages allocated 16
Number of pages used 10
Number of data pages 3
Number of rows 263
Partition partnum 1048913
Partition lockid 1048913

Extents
Logical Page Physical Page Size
0 10da1a 8
8 10f402 8

Слова index не вижу!

Number of pages allocated - разве это не число страниц?
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34578437
GVF112GVF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько Я помню, в Server Studio™ with Sentinel™ есть возможность оценить размер таблицы и индексов .... :)

Выгрузить можно отсюда - http://www.serverstudio.com/downloads/

С уважением,
Вадим.
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34578490
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marina3494Хоть убивай себя об стену, не понимаю!
Вот насчет вышеприведенной таблицы что пишет:


TBLspace Report for valmetdb:informix.welstat

...

Слова index не вижу!

Number of pages allocated - разве это не число страниц?

Если это весь вывод oncheck который вы привели, то индексов на таблице valmetdb:informix.welstat нету!

Number of pages allocated в данном выводе это кол-во страниц с данными.
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34579181
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marina3494
Number of keys 1
....
Слова index не вижу!

Судя по всему, один индекс все же должен быть.
Информация из oncheck -pT должна включать ниже еще такие строчки (обратите внимание на слово Index :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
TBLspace Usage Report for stores7_ua:vasilis.smoke

    Type                  Pages      Empty  Semi-Full       Full  Very-Full
    ---------------- ---------- ---------- ---------- ---------- ----------
    Free                     12
    Bit-Map                   1
    Index                     1
    Data (Home)               0
                     ----------
    Total Pages              14
....
Index Usage Report for index  113_27 on stores7_ua:vasilis.smoke

                    Average    Average
    Level    Total No. Keys Free Bytes
    ----- -------- -------- ----------
        1        1        5       3978
    ----- -------- -------- ----------
    Total        1        5       3978
Посмотрите на другой таблице, на которой точно знаете, что индексы есть
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34579260
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marina3494Информация по ней существующей мне менее интересна.
Мне нужно рассчитать размер индекса,
размер записи конечно знаю, и размер БУДУЩЕЙ таблицы (то есть когда
будет достигнуто 200 записей).
Так получается, что это все же теория...
Вам будет полезно почитать раздел "Structure of B-Tree Index Pages"
http://publib.boulder.ibm.com/infocenter/idshelp/v10/topic/com.ibm.adref.doc/adref02.htm#ToC_285
к тому же очень полезно бы знать версию Информикс.
В примитивном случае расчет делается так:
1. длина (размер) всех полей, входящих в ключ индекса (varchar полный)
2. плюс служебные байты на указатель строки и признак удаления (от 5 до 9 байт в зависимости от версии и фрагментированности)
3. размер страницы на диске (зависит от версии) минус служебный заголовок страницы
4. 3-е делим на 1-е + 2-е
5. учитываем коэффициент заполнения индекса (по умолчанию 90%)
6. округляем в меньшую сторону и получаем количество индексных элементов на странице.
7. Ожидаемое число строк в таблице (и кол-во уникальных значений ключа) делим на 6-е
и получаем ПРИБЛИЗИТЕЛЬНОЕ число страниц индекса.
Оно еще зависит от уникальности или повторяемости значений ключей, количества уровней в индексе.
Так что все просто :)
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34580586
Marina3494
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо всем!
Оказалось параметр t в oncheck надо писать T,
и тогда вывод информации полный,
а с t - урезанный как я привела.!

А за алгоритм - vasilis, такое спасибище,
просто нет слов!
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34582608
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marina3494А за алгоритм - vasilis, такое спасибище,
просто нет слов!
И вам спасибо за слова благодарности.
В награду :) свежий скриптик для определения размеров detached indexes
(сильно не тестировал, замечания принимаются)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
--------------------------------------------------
-- Size all detached indexes (in separated tablespaces) 
-- usage (pages and MB) for one db (current)
--
-- Indexes from all tables and Total size
--      IDS 7.3+ 9.2+
--
-- V.Shulzhenko  DBA_Tools 
-- 2007-06
--------------------------------------------------
----- by Index from all tables -----
select   s.tabname[ 1 , 18 ]                tabname_18
        ,x.idxname[ 1 , 18 ]                idxname_18
        ,substr(x.nunique, 1 , 10 )         nunique
        ,substr(sum(ti_nptotal), 1 , 7 )    total_p
        ,substr(sum(ti_npused), 1 , 7 )     used_p
--        ,substr((sum(ti_nptotal)-sum(ti_npused)),1,7)   free_p
        ,substr(round(sum(ti_nptotal)*(select sh_pagesize from sysmaster:sysshmvals)/ 1048576 , 2 ), 1 , 7 ) size_mb
from  sysmaster:systabinfo i,sysmaster:systabnames n,systables s, sysindexes x
where i.ti_partnum = n.partnum 
--      and s.tabid > 99          -- user tables only
      and x.tabid = s.tabid
      and x.idxname = n.tabname
      and n.dbsname= (select odb_dbname from sysmaster:sysopendb
       where odb_sessionid=dbinfo('sessionid') and odb_iscurrent='Y')
group by  1 , 2 , 3 
order by  1 , 2 
into temp _temp_dbatools
;
insert into _temp_dbatools
select   '------------------','------------------','----------','-------','-------','-------'
  from systables
  where tabid= 1 
;
----- Total Indexes from all tables -----
insert into _temp_dbatools
select   '- Total Indexes '
        ,substr((select count(*) from  _temp_dbatools), 1 , 8 ) 
        ,substr(sum(x.nunique), 1 , 10 ) 
        ,substr(sum(ti_nptotal), 1 , 7 )
        ,substr(sum(ti_npused), 1 , 7 ) 
--        ,substr((sum(ti_nptotal)-sum(ti_npused)),1,7)
        ,substr(round(sum(ti_nptotal)*(select sh_pagesize from sysmaster:sysshmvals)/ 1048576 , 2 ), 1 , 7 )
from  sysmaster:systabinfo i,sysmaster:systabnames n,systables s, sysindexes x
where i.ti_partnum = n.partnum 
--      and s.tabid > 99          -- user tables only
      and x.tabid = s.tabid
      and x.idxname = n.tabname
      and n.dbsname= (select odb_dbname from sysmaster:sysopendb
       where odb_sessionid=dbinfo('sessionid') and odb_iscurrent='Y')
;
insert into _temp_dbatools
select   '------------------','------------------','----------','-------','-------','-------'
  from systables
  where tabid= 1 
;
---------------------------------------
Select * from _temp_dbatools
;
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34583209
Фотография Andron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marina3494Огромное спасибо всем!
Оказалось параметр t в oncheck надо писать T,
и тогда вывод информации полный,
а с t - урезанный как я привела.!


Что значит урезанный? Если вы имеете ввиду информацию об индексах, так эта информация приводится при использовании обеих опций. Просто при -T выдается еще дополнительная информация.
...
Рейтинг: 0 / 0
Как подсчитать размер индекса
    #34583437
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подозреваю, что у вас совершенно разные версии Informix.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как подсчитать размер индекса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]