powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Моделировние одновременного построения нескольких индексов: вопросы по статистике
25 сообщений из 26, страница 1 из 2
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38370768
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Когда база содержит здоровенные таблицы, то восстановление индексов по ним занимает бОльшую часть времени. Периодически слышны стенания о том, как было бы хорошо, если бы рестор умел запускать несколько потоков (= числу процессоров на сервере ?) и в каждом из них ресторить индексы таблиц.
У мну это несколько раз тоже было актуальным, вот и решил сравнить два варианта построения индексов (на таблице с полем ID int, 10^9 строк):

var-1. Открытие двух isql-окон и одновременный (почти) запуск в них:
Код: sql
1.
2.
3.
4.
5.
set autoddl on;
commit;
set stat on; 
create index t_id_asc on t(id); ---------------------- в isql-окне #1
set stat off; 

Код: sql
1.
2.
3.
4.
5.
set autoddl on;
commit;
set stat on; 
create descending index t_id_dec on t(id); ----------- в isql-окне #2
set stat off; 

(т.е. ввожу в первом окне на выполнение, дальше быстрый Alt-Tab и ввод во втором окне)

var-2. Открытие одного окна и запуск в нём:
Код: sql
1.
2.
3.
4.
5.
6.
set autoddl on;
commit;
set stat on; 
create index t_id_asc on t(id); ---------------------- (1)
create descending index t_id_dec on t(id); ----------- (2)
set stat off; 


Перед тем, как замерять статистику, скрипт
Код: sql
1.
2.
create index t_id_asc on t(id); ---------------------- (1)
create descending index t_id_dec on t(id); ----------- (2)

был однократно выполнен, а затем индексы были тут же грохнуты - чтобы файл базы уже был расширен до необх. размера.
После этого было:
1) рестарт операционки и запуск var-1. Запись статистики и удаление созданных индексов.
2) снова рестарт операционки и запуск var-2 с записью статистики.

Ну так вот: иллюзия ускорения создания двух индексов при почти одновременном запуске соотв-щих DDL ушла как вода в песок.
А заодно снова появились вопросы по странным цифиркам в isql-статистике.

Нижеследующие данные получены на базе со страницей 16K, кешем буферов 65000, FW = OFF.
Физически на хосте 1 cpu-сокет и 4 ядра, для linux-виртуалки сконфигурировано 8 логических ядер.

Таблица- I. Статистика isql :Сценарий создания двух индексовКоннект, транзакцияВыполнявшийся стейтментisql: elapsed time, secisql: readsisql: wirtesisql: fetchesvar-1. Одновременный старт DDL в двух isqlATT_202, TRA_4061 of 1: create ascending index10305,767047042878428 4006201494 ATT_204, TRA_4081 of 1: create descending index10305,347046606878428 4005998506 var-2. Последовательный запуск двух DDL в одном isqlATT_209, TRA_4321 of 2: create ascending index4952,6942747374318502004769359ATT_209, TRA_4332 of 2: create descending index4985,4142747134465852004720252

Таблица- II . Статистика trace :Сценарий создания двух индексовКоннект, транзакцияВыполнявшийся стейтментtrace: elapsed time, mstrace: readstrace: wirtestrace: fetchestrace: marksvar-1. Одновременный старт DDL в двух isqlATT_202, TRA_4061 of 1: create ascending index103054923483818 4373 2005524571863664ATT_204, TRA_4081 of 1: create descending index103053103563216691322005469612893138var-2. Последовательный запуск двух DDL в одном isqlATT_209, TRA_4321 of 2: create ascending index49524604274729678032004769211863664ATT_209, TRA_4332 of 2: create descending index49852734274701677992004720125893138

Итого:
1) время создания индексов при попытке их "распараллелить" по двум сеансам оказывается больше (пусть и ненамного), чем время последовательного создания в одном коннекте двух индексов;
2) не понимаю совершенно, откудова взялось 4 млрд фетчей в статистике isql при "параллельном" варианте (см таблицу-1);
3) также не уловил юмора с числом записей = 4373 по статистике трейса (в этом же "параллельном" варианте, таблица-2);
4) откудова такое дикое несовпадение между значениями writes по трейсу и по isql ? 68 тыс против 432 тыс - разница почти в 6 раз, и это в лучшем случае! Как такое понимать ?

В аттаче - фрагменты трейса для соотв-щих COMMIT_TRAN.

PS.
Код: plaintext
1.
2.
3.
4.
5.
6.
SQL> show version;
ISQL Version: WI-V2.5.3.26661 Firebird 2.5
Server version:
Firebird/linux AMD64 (access method), version "LI-T3.0.0.30590 Firebird 3.0 Alpha 1"
Firebird/linux AMD64 (remote server), version "LI-T3.0.0.30590 Firebird 3.0 Alpha 1/tcp (vmoel63.local)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26661 Firebird 2.5/tcp (csprog)/P12"
on disk structure version 12.0
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38370819
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

По поводу параллельного создания индексов при ресторе kdv как то писал. В Interbase XE3 вроде бы сделали такое. Так вот kdv говорил, что выигрыша на обычных дисках тут не получить. Здесь нужен либо RAID массив либо SSD.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38370828
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидИтого:
1) время создания индексов при попытке их "распараллелить" по двум сеансам оказывается больше (пусть и ненамного), чем время последовательного создания в одном коннекте двух индексов;
2) не понимаю совершенно, откудова взялось 4 млрд фетчей в статистике isql при "параллельном" варианте (см таблицу-1);
3) также не уловил юмора с числом записей = 4373 по статистике трейса (в этом же "параллельном" варианте, таблица-2);
4) откудова такое дикое несовпадение между значениями writes по трейсу и по isql ? 68 тыс против 432 тыс - разница почти в 6 раз, и это в лучшем случае! Как такое понимать ?
1) тест бессмысленный, ибо так распараллеливать создание индексов никто в здравом уме не будет
2) 2 млрд + 2 млрд. В супере ISQL показывает дельту изменений в базе вообще, а не конкретным коннектом. Так что при параллельном выполнении они суммируются.
3) 64К страниц влезли в кеш, 68 - 64 = 4. Почему сброс кеша по коммиту сюда не попал, пока не ясно - либо баг, либо фоновый cache writer успел все сбросить.
4) трейс показывает только операции самого коннекта. Остальные writes относятся к cache writer-у и тут не видны.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38370890
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr1) тест бессмысленный, ибо так распараллеливать создание индексов никто в здравом уме не будеттогда как было бы правильно, имея в руках только штатный isql ?
dimitr2) 2 млрд + 2 млрд. В супере ISQL показывает дельту изменений в базе вообще, а не конкретным коннектом. Так что при параллельном выполнении они суммируются.Насколько сложно это исправить ? Ибо засада полная получается:
Код: sql
1.
2.
session #1
select count(*) from rdb$types,rdb$types,rdb$types;


Код: sql
1.
2.
3.
session #2
-- пока молотит #1, вводим несколько раз:
set stat on; out nul; select count(*) from rdb$types;

Получаем в окне_2 форменный бред: не накопительный, а какой-то "скачущий" результат
Код: 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.
SQL> set stat on; out nul; select count(*) from rdb$types;
Current memory = 1103989392
Delta memory = 0
Max memory = 1104011712
Elapsed time= 0.00 sec
Buffers = 65000
Reads = 0
Writes 0
Fetches = 510
SQL> set stat on; out nul; select count(*) from rdb$types;
Current memory = 1103989392
Delta memory = 0
Max memory = 1104011712
Elapsed time= 0.00 sec
Buffers = 65000
Reads = 0
Writes 0
Fetches = 13705
SQL> set stat on; out nul; select count(*) from rdb$types;
Current memory = 1103989392
Delta memory = 0
Max memory = 1104011712
Elapsed time= 0.00 sec
Buffers = 65000
Reads = 0
Writes 0
 Fetches = 8352 -- ?! 
SQL> set stat on; out nul; select count(*) from rdb$types;
Current memory = 1103989392
Delta memory = 0
Max memory = 1104011712
Elapsed time= 0.00 sec
Buffers = 65000
Reads = 0
Writes 0
Fetches = 9637
SQL> set stat on; out nul; select count(*) from rdb$types;
Current memory = 1103989392
Delta memory = 0
Max memory = 1104011712
Elapsed time= 0.00 sec
Buffers = 65000
Reads = 0
Writes 0
 Fetches = 6313 -- ?!  

dimitr3) 64К страниц влезли в кеш, 68 - 64 = 4. Почему сброс кеша по коммиту сюда не попал, пока не ясно - либо баг, либо фоновый cache writer успел все сбросить.
4) трейс показывает только операции самого коннекта. Остальные writes относятся к cache writer-у и тут не видны.А по этому cache writer-у в трейс можно добавить статистику ? А то какой-то "теневой игрок" появился, про которого ничего нельзя выяснить...
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38370951
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТак вот kdv говорил, что выигрыша на обычных дисках тут не получить. Здесь нужен либо RAID массив либо SSD.а если в одной таблице надо создать Х индексов за 1 проход - получается построчное чтение в 1 поток?
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38370997
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00chа если в одной таблице надо создать Х индексов за 1 проход - получается построчное чтение в 1 поток?
И вывалится за пределы памяти на диск, там где один индекс без диска создавался. Экономия на одном I/O приведёт к потерям на другом I/O. Вообще есть подозрение, чтобы разработчикам заставить сервер так работать нужно кучу сил положить на подбор оптимальных параметров в зависимости от размера записи в индексах, количества самих индексов, памяти под сортировку и ещё чего, в одних случах будет выигрыш, а вдругих проигрыш. Значит принимать решение на ходу. Жуть.
Для начала неплохо бы достоверно понять как это в IB работает. А там и пофантазировать можно.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371029
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидтогда как было бы правильно, имея в руках только штатный isql ?
это невозможно средствами isql

ТаблоидНасколько сложно это исправить ?
нет в АПИ средств получить эту информацию

ТаблоидА по этому cache writer-у в трейс можно добавить статистику ? А то какой-то "теневой игрок" появился, про которого ничего нельзя выяснить...
он всегда был, просто ты с супером не работал. А статистика CW тебе ничего не даст. Во-первых, это фоновый поток (общий для всех коннектов) и его активность к твоей транзакции никак не привязать. Во-вторых, он работает вне контекста транзакций и его счетчики можно вывести только при его завершении, сиречь отключении последнего юзера от базы.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371030
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmнужно кучу сил положитьА так ли велика куча сия ?

0) Выполнить рестор только данных таблицы, получить таким обр. точное значение числа строк в ней;
1) Брать индексы с 1-го по N-й, где N = число_cpu_ядер, найти в них самый длинный ключ. Умножить его длину (maxKey) на число записей в таблице и на какой-то там "повышающий коэффициент" для запаса (сколько доп. памяти требуется для сортировки и построения индекса ?).
2) Сравнить это число с имеющейся свободной памятью на машине (не с TempCacheLimit, а со всей свободной памятью!). Если оно больше, взять минимум из них и поделить на maxKey с отбрасыванием дробной части. Получим в итоге то число индексов (p), построение которых можно распараллелить.
3) Запустить 'p' потоков. Поскольку они в каждый интервал времени будут читать примерно одни и те же страницы, кеширование должно сыграть роль: страницы, нужные потоку-2, еще не будут вытеснены из кеша, т.к. поток-1 прочитал их "вот только что".
4) Брать далее индексы с (p+1)-го по (p+1+N)-й и повторить пункт "1)" - и так до тех пор, пока не будут построены все индексы для таблицы.

Ы ?
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371038
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrнет в АПИ средств получить эту информацию

Это чтож теперь при многопользовательской работе, нельзя никак оценить сколько фетчей сделал конкретный запрос (определить его эффективность)?
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371043
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоидтогда как было бы правильно, имея в руках только штатный isql ?
это невозможно средствами isqlОК, а если на java попробовать это всё сбацать, запустив два потока - так будет корректно ?
dimitrнет в АПИ средств получить эту информациюфигасе... спасибо, буду поиметь теперь в виду: никогда не юзать статистику isql в SS, если "рядом" еще что-то крутится.
dimitrстатистика CW тебе ничего не даст. Во-первых, это фоновый поток (общий для всех коннектов) и его активность к твоей транзакции никак не привязать. Во-вторых, он работает вне контекста транзакций и его счетчики можно вывести только при его завершении, сиречь отключении последнего юзера от базы.Печалько... Показ длительности записи кеша на диск мог бы многое прояснить. Ну да ладно.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371047
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениспри многопользовательской работе, нельзя никак оценить сколько фетчей сделал конкретный запрос (определить его эффективность)?Во-во... :(
...и как-то сам по себе SuperClassic вдруг вспомнился... ;-)
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371052
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

ОК, а если на java попробовать это всё сбацать, запустив два потока - так будет корректно ?

Нет, так как каждый поток будет читать данные с диска. Внутри движка по идее их можно прочитать один раз, если я правильно понимаю.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371064
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНет, так как каждый поток будет читать данные с диска. Внутри движка по идее их можно прочитать один раз, если я правильно понимаю.Какая-то порция данных таблицы, прочитанная full scan'ом, в кеше разве не удержатся ?
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371101
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид0) Выполнить рестор только данных таблицы, получить таким обр. точное значение числа строк в нейвзять число строк из бекапа (где оно д.б. записано), при ресторе таблицы (т.е. при чтении бекапа и постраничной записи на диск) уже создавать все табличные индексы "на лету", данные то для них есть, зачем еще раз перечитывать?
Ы?))
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371108
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch,

Это ещё большой вопрос что быстрее.

Сравни insert в таблицу с индексом и insert + создание индекса. Что быстрее?
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371115
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch,

Да и не все индексы так можно создавать. FK, например, не получится, т.к. в этом случае надо соблюдать порядок заливки таблиц. А что если FK задан на саму себя в рекурсии?
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371122
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисСравни insert в таблицу с индексом и insert + создание индексапоследнее, конечно, будет тормозить из-за необходимости поддерживать ACID при "многопоточном" доступе к таблице и малом объеме памяти. при ресторе этого же нет.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371127
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00chвзять число строк из бекапаЕсли у нас настолько крохотная БД, что она целиком убирается в ОЗУ, то о ней рассуждать не интересно, т.е. игра не стоит свеч. Если не лезет в ОЗУ, то нахрена козе баян?
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371130
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисДа и не все индексы так можно создавать. FK, например, не получится, т.к. в этом случае надо соблюдать порядок заливки таблиц. А что если FK задан на саму себя в рекурсии?на серебряную пулю не претендую))Ivan_Pisarevskyfd00chвзять число строк из бекапаЕсли у нас настолько крохотная БД, что она целиком убирается в ОЗУ, то о ней рассуждать не интересно, т.е. игра не стоит свеч. Если не лезет в ОЗУ, то нахрена козе баян?какой-то странный вывод. я имел в виду, что в бекапе записано число строк (в 8 байтовой константе) и ни к чему ресторить всю таблицу, чтобы его получить
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371140
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00chпоследнее, конечно, будет тормозить из-за необходимости поддерживать ACID при "многопоточном" доступе к таблице и малом объеме памяти. при ресторе этого же нет.
оно будет тормозить из-за постоянного поиска места вставки в дерево неотсортированных данных
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371150
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретически при создании индекса можно сортировать не всю таблицу, а только поля индекса + DB_KEY (если я ничего не упустил). Может оно конечно так и делается.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371154
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисМожет оно конечно так и делается.
естественно
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371300
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох если бы всё было так просто...
Таблоид2) Сравнить это число с имеющейся свободной памятью на машине (не с TempCacheLimit, а со всей свободной памятью!). Если оно больше, взять минимум из них и поделить на maxKey с отбрасыванием дробной части. Получим в итоге то число индексов (p), построение которых можно распараллелить.
С расчётом буферов и потоков тоже не всё так гладко.
Таблоид3) Запустить 'p' потоков. Поскольку они в каждый интервал времени будут читать примерно одни и те же страницы, кеширование должно сыграть роль: страницы, нужные потоку-2, еще не будут вытеснены из кеша, т.к. поток-1 прочитал их "вот только что".
4) Брать далее индексы с (p+1)-го по (p+1+N)-й и повторить пункт "1)" - и так до тех пор, пока не будут построены все индексы для таблицы.
Нужно понимать, что всё потоки прочитали некоторые записи и их можно затирать новой порцией. Дочитывание можно организовать параллельно сортировкам. В один прекрасный момент потоки поймут, что им не хватает памяти и начнуть сбрасывать данные на диск, а этот процесс лучше "выпрямить", т.е. сделать последовательным (SSD не так критично, а вот даже рейду может быть не так комфортно, потому как это потому ещё вычитывать). На период сброса желательно приостановить чтение порций данных и т.д. ИМХО тут ухужшиь производительность легче чем улучшить. Сразу извиняюсь если несу бред :)
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371317
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrfd00chпоследнее, конечно, будет тормозить из-за необходимости поддерживать ACID при "многопоточном" доступе к таблице и малом объеме памяти. при ресторе этого же нет.
оно будет тормозить из-за постоянного поиска места вставки в дерево неотсортированных данных
Иными словами можно сказать что идексация вновь прибывыших и построение индекса с нуля это "совершенно" разные процессы? (просто уточняю, из твоих уст, чтобы потом цитировать)

По поду предложения fd00chуже создавать все табличные индексы "на лету" есть смысл учитывать тот факт, что это рестор и делать не индексирование, и сортировать как при первичном построении. Порцию влили, эту же порцию подкинули сортировщикам для индексов, закончили с заливом, влили индексы в БД, пошли за следующей табличкой.
...
Рейтинг: 0 / 0
Моделировние одновременного построения нескольких индексов: вопросы по статистике
    #38371321
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmИными словами можно сказать что индексация вновь прибывших и построение индекса с нуля это "совершенно" разные процессы?
естественно
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Моделировние одновременного построения нескольких индексов: вопросы по статистике
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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