powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Количество страниц, занятых таблицей c учётом пустых страниц
14 сообщений из 14, страница 1 из 1
Количество страниц, занятых таблицей c учётом пустых страниц
    #33184980
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Не подскажет ли кто, каким образом без перезагрузки или фрагментации таблицы выяснить, сколько страниц ДЕЙСТВИТЕЛЬНО ЗАПОЛНЕНЫ ДАННЫМИ в этой таблице?

Простой эксперимент:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table tmp1(id serial, id2 integer);
create index tmp1 on tmp1(id2);
insert into tmp1(id2) select tabid from systables;
delete from tmp1 where id >  1 ;

select
      n.tabname
    , i.ti_nptotal
    , i.ti_npused
    , i.ti_npdata
  from
        sysmaster:systabinfo i
      , sysmaster:systabnames n
    where n.partnum = i.ti_partnum
      and n.dbsname = (
            select odb_dbname
              from sysmaster:sysopendb o
                where odb_sessionid = dbinfo('sessionid')
                  and odb_iscurrent = 'Y')
      and n.tabname = 'tmp1';
у меня (с учётом большого количества таблиц в БД :) )
выдаёт следующее:
Код: plaintext
1.
2.
tabname	ti_nptotal ti_npused ti_npdata
tmp1	 16           13          1 

А после:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ALTER FRAGMENT ON TABLE tmp1 INIT IN data_dbs;
select
      n.tabname
    , i.ti_nptotal
    , i.ti_npused
    , i.ti_npdata
  from
        sysmaster:systabinfo i
      , sysmaster:systabnames n
    where n.partnum = i.ti_partnum
      and n.dbsname = (
            select odb_dbname
              from sysmaster:sysopendb o
                where odb_sessionid = dbinfo('sessionid')
                  and odb_iscurrent = 'Y')
      and n.tabname = 'tmp1';
выдаёт
Код: plaintext
1.
2.
tabname ti_nptotal ti_npused ti_npdata
tmp1     8            4           1 

После фрагментации выяснилось, что 13 - 4 = 11 страниц были не заполнены данными. Вот как это выяснить без модификации таблицы? Или я ошибаюсь и старинцы были чем-то заполнены?
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33185517
Leonid Belov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если для таблицы ни разу не выполнялся запрос UPDATE STATISTICS, пространство, занятое удаленными записями, повторно не используется. После серии DELETE некоторые страницы могут остаться на 90% пустыми.
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33185607
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, кстати, извините, забыл сказать что пользуюсь IDS 7.31.UD6...
Leonid BelovЕсли для таблицы ни разу не выполнялся запрос UPDATE STATISTICS, пространство, занятое удаленными записями, повторно не используется. После серии DELETE некоторые страницы могут остаться на 90% пустыми.
К сожалению картина та же и после
Код: plaintext
DELETE FROM tmp1;
и после
Код: plaintext
UPDATE STATISTICS HIGH FOR TABLE tmp1;

Ещё идеи есть? :)
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33185789
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"После фрагментации выяснилось, что 13 - 4 = 11 страниц были не заполнены данными. Вот как это выяснить без модификации таблицы? Или я ошибаюсь и старинцы были чем-то заполнены?"
Для начала определимся с термином "данными".
Как можно увидеть, и в первом и во втором случае ti_npdata=1, а это и есть именно "ДАННЫЕ", т.е. содержание таблицы и оно (кол-во страниц) не изменилось.
В кол-во ti_npused входят все ИСПОЛЬЗУЕМЫЕ страницы, а сюдя относятся и индексные страницы (для версии 7.3х индексные страницы берутся из одного экстента с данными) и битмаповые страницы (как минимум одна всегда есть в экстенте), и блобовые (если BLOB-ы размещены в табличном пространстве) и remainder page ("остаточные", что ли :) , короче, для остатков длинных строк).
ti_nptotal - все ВЫДЕЛЕННЫЕ страницы, среди которых есть и пока свободные, но не доступные другим таблицам.
После удаления строк страницы остаются занятыми (учитываюися в ti_npused просто потому, что эти страницы помечены как "данные" и не могут использоваться как индексные, например), но вставка строк в них возможна и без update statistics. Другое дело, что оптимизатор по прежнему считает таблицу заполненной (если после заполнения таблицы выполнялся сбор статистики) и для чтения строк таблицы будет вынужден просканировать все страницы, которые считаются занятыми. Пока не сделаем новый update statistics.
Есть чудная утилитка oncheck -pT ,которая покажет вам всю правду о занятых и свободных страницах таблицы даже в том случае, когда строки из таблицы удалены и в systabinfo в ti_npused показываются страницы как "используемые", хотя фактически они свободные для вставки строк.
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33186988
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, куча полезной информации.
Но: :)
Очередной эксперимент просто за душу берёт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 1 . CREATE TABLE tmp1(id serial, id2 INTEGER);
 2 . CREATE INDEX tmp1 ON tmp1(id2);
 3 . INSERT INTO tmp1(id2) SELECT tabid FROM systables;
 4 . UPDATE STATISTICS HIGH FOR TABLE tmp1;
 5 . DELETE FROM tmp1;
 6 . UPDATE STATISTICS HIGH FOR TABLE tmp1;       
 7 . ALTER FRAGMENT ON TABLE tmp1 INIT IN data_dbs;
 8 . DROP INDEX tmp1;
 9 .UPDATE STATISTICS HIGH FOR TABLE tmp1;
 10 . ALTER FRAGMENT ON TABLE tmp1 INIT IN data_dbs;

Результаты:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 п.N|   SQL   |     tbinfo           |            oncheck 
    |         | total used data free | Total Used Data Free Index BitMap
   1  | CRT TBL |    8       1      0      7   |    8       1      0      7      0        1   
   2  | CRT IDX |    8       2      0      6   |    8       2      0      6      1        1   
   3  | INSERT  |   16      13      5      3   |   16      13      5      3      7        1   
   4  | UPD STA |   16      13      5      3   |   16      13      5      6      7        1   
   5  | DELETE  |   16      13      0      3   |   16       2      0     14      1        1   
   6  | UPD STA |   16      13      0      3   |   16       2      0     14      1        1   
   7  | ALT FRA |    8       2      0      6   |    8       2      0      6      1        1   
   8  | DRP IDX |    8       2      0      6   |    8       1      0      7      0        1   
   9  | UPD STA |    8       2      0      6   |    8       1      0      7      0        1   
  10  | ALT FRA |    8       1      0      7   |    8       1      0      7      0        1   

vasilis
Другое дело, что оптимизатор по прежнему считает таблицу заполненной
(если после заполнения таблицы выполнялся сбор статистики)
и для чтения строк таблицы будет вынужден просканировать все страницы,
которые считаются занятыми. Пока не сделаем новый update statistics.


Первая неприятность поджидала в п.N 6 - после DELETE FROM tmp1;
oncheck радостно показывает именно ту статистику , какую хотелось бы получить, т.е. такую же статистику как и до
заполнения таблицы, а systabinfo, и до и после выполнения
UPDATE STATISTICS по прежнему считает что ti_npused = 13. :(

vasilis
Есть чудная утилитка oncheck -pT ,которая покажет вам всю правду
о занятых и свободных страницах таблицы даже в том случае,
когда строки из таблицы удалены и в systabinfo в ti_npused
показываются страницы как "используемые", хотя фактически
они свободные для вставки строк.


Вот-вот, oncheck -pT "всю правду" показывает, а UPDATE STATISTICS не помагает...
А как раскопать откуда oncheck -pT информацию тянет?

ЗЫ: Заранее спасибо :)
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33187194
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, закралась ошибка в oncheck free:
Вместо
Код: plaintext
1.
   4  | UPD STA |   16      13      5      3   |   16      13      5     _6_     7        1   

должно быть

Код: plaintext
1.
   4  | UPD STA |   16      13      5      3   |   16      13      5     _3_     7        1   

т.е.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 п.N|   SQL   |     tbinfo           |            oncheck 
    |         | total used data free | Total Used Data Free Index BitMap
   1  | CRT TBL |    8       1      0      7   |    8       1      0      7      0        1   
   2  | CRT IDX |    8       2      0      6   |    8       2      0      6      1        1   
   3  | INSERT  |   16      13      5      3   |   16      13      5      3      7        1   
   4  | UPD STA |   16      13      5      3   |   16      13      5      3      7        1   
   5  | DELETE  |   16      13      0      3   |   16       2      0     14      1        1   
   6  | UPD STA |   16      13      0      3   |   16       2      0     14      1        1   
   7  | ALT FRA |    8       2      0      6   |    8       2      0      6      1        1   
   8  | DRP IDX |    8       2      0      6   |    8       1      0      7      0        1   
   9  | UPD STA |    8       2      0      6   |    8       1      0      7      0        1   
  10  | ALT FRA |    8       1      0      7   |    8       1      0      7      0        1   
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33187817
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill'иОчередной эксперимент просто за душу берёт:
А чем берет ? Все результаты предсказуемы, как для меня :)
Следует отметить, что для полноты картины не хватает информации о размерах таблицы, взятых из systables, которая и обновляется как раз после UPDATE STATISTICS. Иначе в приведенном тобой эксперименте выполнение UPDATE STATISTICS не нужно (п.4, 6, 9) и ничего не дает (и не может дать в данном случае).
И еще замечание - нельзя давать одно имя и таблице и индексу.
Для 7-ки это не существенно (для вычислений), а вот для 9-ки это будут два разных tablespace, которые будут смешивать результаты.
Bill'иПервая неприятность поджидала в п.N 6 - после DELETE FROM tmp1;
oncheck радостно показывает именно ту статистику , какую хотелось бы получить, т.е. такую же статистику как и до заполнения таблицы, а systabinfo, и до и после выполнения UPDATE STATISTICS по прежнему считает что ti_npused = 13. :(
Еще раз повторю, UPDATE STATISTICS не влияет на systabinfo и ранее уже объяснил, почему ti_npused не изменяется после удаления строк. Эти страницы уже отмечены в bitmap page, как занятые, и именно эти значения и присутствует в systabinfo. Надо ли их приводить в точное соответствие ? Как по мне, незачем (страницы то доступны для вставки строк) и будет много работы - при каждом удалении строки (!) надо проверять, а не последняя ли строка это на странице и после этого менять bitmap page, а ведь есть еще другие нити по вставке строк, и какая то уже могла получить адрес страницы и номер слота и т.п. Т.е. с точки зрения производительности и оптимизации работы с диском (а это присутствует повсюду внутри сервера) я понимаю, почему так сделано.
Bill'иВот-вот, oncheck -pT "всю правду" показывает, а UPDATE STATISTICS не помагает...
А как раскопать откуда oncheck -pT информацию тянет?
Как откуда ? Непосредственно с диска и берет, анализируя каждую физическую страницу и на больших объемах это будет медленно и требовать большого вв/выв. Поэтому для сервера это и неприемлемо.
А тебе, если очень нужно и очень точно, есть способ .
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33187899
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilis
И еще замечание - нельзя давать одно имя и таблице и индексу.
Для 7-ки это не существенно (для вычислений), а вот для 9-ки это будут два разных tablespace, которые будут смешивать результаты.

Не совсем понял про "смешивать результаты". Наверное потому, что с 9-кой шапочно знаком, а тут уже и 10-ка на подходе... Ладно, позже разберусь, но больше так делать не буду :)
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33187900
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bill'и
А как раскопать откуда oncheck -pT информацию тянет?
vasilis
Как откуда ? Непосредственно с диска и берет, анализируя каждую физическую страницу и на больших объемах это будет медленно и требовать большого вв/выв. Поэтому для сервера это и неприемлемо.
А тебе, если очень нужно и очень точно, есть способ .



"А тебе, если очень нужно и очень точно, есть способ" - это "oncheck -pT"?
А то недосказанность какая-то почувствовалась... Если да - на этот вопрос можно не отвечать. :)
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33187901
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем, пока ничего оперативненького не получается.
Зайдём с другой стороны: Имеем задачу по регулировке extent size и next size после длительной эксплуатации БД. Спешу обрадовать, с vasilisDBA_Tools я знаком.

НО: Задача всплыла в новом ракурсе - необходимо отрегулировать extent size в связи с уменьшением на порядок объёма многих таблиц.

Хотелось бы сделать инструмент, который делает всё это за один присест: выгрузка БД, колдование над скриптом, загрузка БД...

Проблема как раз в пункте "колдование над скриптом" - пока выясняется, что он требует больших временных затрат (поскольку после чистки (DELETE) в рабочих таблицах информация в системных таблицах о свободных ИНДЕКСНЫХ страницах не обновляется, а точную оценку даёт только oncheck -pT, который работает долго, да и анализировать его вывод накладно.

Собственно можно было бы рассчитать объём пространства, необходимого для загрузки таблицы, но у меня пока не получается ничего сделать с более-менее точной оценкой объёма, необходимого для создания индексов.

Может кто-то знает, чем копать в эту сторону? Впрочем, обещаю внимательно рассмотреть любые предложения :)
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33187911
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, я не совсем понятно выразился про "свободные ИНДЕКСНЫЕ страницы"...
Мне кажется, что именно из-за индексов не получается посчитать, сколько свободных страниц на самом деле на данный момент в extent'ах таблицы.

Или ti_npdata - это количество занятых страниц С УЧЁТОМ ИНДЕКСОВ? 8-[ ]
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33188003
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill'иИли ti_npdata - это количество занятых страниц С УЧЁТОМ ИНДЕКСОВ? 8-[ ]
Нет. Сюда входят только страницы с данными, я ранее подробно расписывал - читай внимательнее еще раз.
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33188016
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill'и
НО: Задача всплыла в новом ракурсе - необходимо отрегулировать extent size в связи с уменьшением на порядок объёма многих таблиц.
А зачем ? Что, таблицы больше расти совсем не будут ? Или сильно большой дефицит пары гигабайт дискового пространства ? Или просто хочется сделать что то полезное для страны ? :)

Bill'иХотелось бы сделать инструмент, который делает всё это за один присест: выгрузка БД, колдование над скриптом, загрузка БД...
Если в базе нет фрагментации таблиц или хранения таблиц и индексов в разных ДБ-пространствах, а также таблиц с блокировкой на уровне строки (или их немного), то такой универсальный инструмент уже существует - называется dbexport (без опции -ss) и dbimport, который сам придумает нужный extent size и next size в размере 10% от extent size (если не ошибаюсь).
Bill'и
...(поскольку после чистки (DELETE) в рабочих таблицах информация в системных таблицах о свободных ИНДЕКСНЫХ страницах не обновляется...
Не только об индексных.
Кстати, кажется существует автоматический механизм "схлопывания" пустых или полупустых индексных страниц, только не помню , когда он срабатывает - толи во время обновления, толи во время того же Update Statistics

Bill'иСобственно можно было бы рассчитать объём пространства, необходимого для загрузки таблицы, но у меня пока не получается ничего сделать с более-менее точной оценкой объёма, необходимого для создания индексов.
А что там считать ? Кол-во страниц = кол-во_строк/(Размер страницы-заголовок страницы)/(Размер ключа + 8 байт на ссылку) + немного на верхние уровни.
Вроде так :) Точне можно посмотреть в Руководстве админа.
...
Рейтинг: 0 / 0
Количество страниц, занятых таблицей c учётом пустых страниц
    #33189691
Bill'и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilisА зачем ? Что, таблицы больше расти совсем не будут ? Или сильно большой дефицит пары гигабайт дискового пространства ?
Вариантов с ростом таблиц есть много (напомню, что размеры уменьшились на порядок):
Для одной БД - таблицы настолько НИКОГДА не вырастут - БД для макета
Для второй - вырастут - но опять таки через 2-3 года эксплуатации.
Для третьей - сегодня это 3-4 ГБ, а через год 15 Г, и опять таким страдай :(

vasilis
Если в базе нет фрагментации таблиц или хранения таблиц и индексов в разных ДБ-пространствах, а также таблиц с блокировкой на уровне строки (или их немного), то такой универсальный инструмент уже существует - называется dbexport (без опции -ss) и dbimport, который сам придумает нужный extent size и next size в размере 10% от extent size (если не ошибаюсь).

Кстати не знал что dbimport сам "нужный extent size" прикидывает...
И индексы в разных ДБ-пространствах, и таблиц с блокировкой на уровне строки немеряно... Вобщем, dbexport с -ss, а потом колдуем над скриптом, ВЫБРАСЫВАЯ из него EXTENT SIZE NEXT SIZE..., dbexport, и если после этого есть проблемы с количеством экстентов - см. исходную задачу :)

vasilis
А что там считать ? Кол-во страниц = кол-во_строк/(Размер страницы-заголовок страницы)/(Размер ключа + 8 байт на ссылку) + немного на верхние уровни.
Вроде так :) Точне можно посмотреть в Руководстве админа.
О! Там и глянем...

vasilisИли просто хочется сделать что то полезное для страны ? :)
Мне кажется, что тут как в анекдоте
"Или ручками за 5 часов, или программу за 10 часов, а она потом ещё полчаса работать будет"...
Но программу ведь не один раз использовать прийдётся.
Попробую всё таки второй вариант :)
О результатах собщу... После отпуска :)
Всем спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Количество страниц, занятых таблицей c учётом пустых страниц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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