|
|
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
hi all Когда база содержит здоровенные таблицы, то восстановление индексов по ним занимает бОльшую часть времени. Периодически слышны стенания о том, как было бы хорошо, если бы рестор умел запускать несколько потоков (= числу процессоров на сервере ?) и в каждом из них ресторить индексы таблиц. У мну это несколько раз тоже было актуальным, вот и решил сравнить два варианта построения индексов (на таблице с полем ID int, 10^9 строк): var-1. Открытие двух isql-окон и одновременный (почти) запуск в них: Код: sql 1. 2. 3. 4. 5. Код: sql 1. 2. 3. 4. 5. (т.е. ввожу в первом окне на выполнение, дальше быстрый Alt-Tab и ввод во втором окне) var-2. Открытие одного окна и запуск в нём: Код: sql 1. 2. 3. 4. 5. 6. Перед тем, как замерять статистику, скрипт Код: sql 1. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 15:08:56 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Таблоид, По поводу параллельного создания индексов при ресторе kdv как то писал. В Interbase XE3 вроде бы сделали такое. Так вот kdv говорил, что выигрыша на обычных дисках тут не получить. Здесь нужен либо RAID массив либо SSD. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 15:44:17 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
ТаблоидИтого: 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-у и тут не видны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 15:48:19 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
dimitr1) тест бессмысленный, ибо так распараллеливать создание индексов никто в здравом уме не будеттогда как было бы правильно, имея в руках только штатный isql ? dimitr2) 2 млрд + 2 млрд. В супере ISQL показывает дельту изменений в базе вообще, а не конкретным коннектом. Так что при параллельном выполнении они суммируются.Насколько сложно это исправить ? Ибо засада полная получается: Код: sql 1. 2. Код: sql 1. 2. 3. Получаем в окне_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. dimitr3) 64К страниц влезли в кеш, 68 - 64 = 4. Почему сброс кеша по коммиту сюда не попал, пока не ясно - либо баг, либо фоновый cache writer успел все сбросить. 4) трейс показывает только операции самого коннекта. Остальные writes относятся к cache writer-у и тут не видны.А по этому cache writer-у в трейс можно добавить статистику ? А то какой-то "теневой игрок" появился, про которого ничего нельзя выяснить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 16:15:23 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисТак вот kdv говорил, что выигрыша на обычных дисках тут не получить. Здесь нужен либо RAID массив либо SSD.а если в одной таблице надо создать Х индексов за 1 проход - получается построчное чтение в 1 поток? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 16:42:16 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
fd00chа если в одной таблице надо создать Х индексов за 1 проход - получается построчное чтение в 1 поток? И вывалится за пределы памяти на диск, там где один индекс без диска создавался. Экономия на одном I/O приведёт к потерям на другом I/O. Вообще есть подозрение, чтобы разработчикам заставить сервер так работать нужно кучу сил положить на подбор оптимальных параметров в зависимости от размера записи в индексах, количества самих индексов, памяти под сортировку и ещё чего, в одних случах будет выигрыш, а вдругих проигрыш. Значит принимать решение на ходу. Жуть. Для начала неплохо бы достоверно понять как это в IB работает. А там и пофантазировать можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 17:24:07 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Таблоидтогда как было бы правильно, имея в руках только штатный isql ? это невозможно средствами isql ТаблоидНасколько сложно это исправить ? нет в АПИ средств получить эту информацию ТаблоидА по этому cache writer-у в трейс можно добавить статистику ? А то какой-то "теневой игрок" появился, про которого ничего нельзя выяснить... он всегда был, просто ты с супером не работал. А статистика CW тебе ничего не даст. Во-первых, это фоновый поток (общий для всех коннектов) и его активность к твоей транзакции никак не привязать. Во-вторых, он работает вне контекста транзакций и его счетчики можно вывести только при его завершении, сиречь отключении последнего юзера от базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 17:54:56 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
afgmнужно кучу сил положитьА так ли велика куча сия ? 0) Выполнить рестор только данных таблицы, получить таким обр. точное значение числа строк в ней; 1) Брать индексы с 1-го по N-й, где N = число_cpu_ядер, найти в них самый длинный ключ. Умножить его длину (maxKey) на число записей в таблице и на какой-то там "повышающий коэффициент" для запаса (сколько доп. памяти требуется для сортировки и построения индекса ?). 2) Сравнить это число с имеющейся свободной памятью на машине (не с TempCacheLimit, а со всей свободной памятью!). Если оно больше, взять минимум из них и поделить на maxKey с отбрасыванием дробной части. Получим в итоге то число индексов (p), построение которых можно распараллелить. 3) Запустить 'p' потоков. Поскольку они в каждый интервал времени будут читать примерно одни и те же страницы, кеширование должно сыграть роль: страницы, нужные потоку-2, еще не будут вытеснены из кеша, т.к. поток-1 прочитал их "вот только что". 4) Брать далее индексы с (p+1)-го по (p+1+N)-й и повторить пункт "1)" - и так до тех пор, пока не будут построены все индексы для таблицы. Ы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 17:56:07 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
dimitrнет в АПИ средств получить эту информацию Это чтож теперь при многопользовательской работе, нельзя никак оценить сколько фетчей сделал конкретный запрос (определить его эффективность)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:01:44 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
dimitrТаблоидтогда как было бы правильно, имея в руках только штатный isql ? это невозможно средствами isqlОК, а если на java попробовать это всё сбацать, запустив два потока - так будет корректно ? dimitrнет в АПИ средств получить эту информациюфигасе... спасибо, буду поиметь теперь в виду: никогда не юзать статистику isql в SS, если "рядом" еще что-то крутится. dimitrстатистика CW тебе ничего не даст. Во-первых, это фоновый поток (общий для всех коннектов) и его активность к твоей транзакции никак не привязать. Во-вторых, он работает вне контекста транзакций и его счетчики можно вывести только при его завершении, сиречь отключении последнего юзера от базы.Печалько... Показ длительности записи кеша на диск мог бы многое прояснить. Ну да ладно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:03:06 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Симонов Дениспри многопользовательской работе, нельзя никак оценить сколько фетчей сделал конкретный запрос (определить его эффективность)?Во-во... :( ...и как-то сам по себе SuperClassic вдруг вспомнился... ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:06:05 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Таблоид, ОК, а если на java попробовать это всё сбацать, запустив два потока - так будет корректно ? Нет, так как каждый поток будет читать данные с диска. Внутри движка по идее их можно прочитать один раз, если я правильно понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:08:51 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисНет, так как каждый поток будет читать данные с диска. Внутри движка по идее их можно прочитать один раз, если я правильно понимаю.Какая-то порция данных таблицы, прочитанная full scan'ом, в кеше разве не удержатся ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:14:07 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Таблоид0) Выполнить рестор только данных таблицы, получить таким обр. точное значение числа строк в нейвзять число строк из бекапа (где оно д.б. записано), при ресторе таблицы (т.е. при чтении бекапа и постраничной записи на диск) уже создавать все табличные индексы "на лету", данные то для них есть, зачем еще раз перечитывать? Ы?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:39:57 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
fd00ch, Это ещё большой вопрос что быстрее. Сравни insert в таблицу с индексом и insert + создание индекса. Что быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:43:50 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
fd00ch, Да и не все индексы так можно создавать. FK, например, не получится, т.к. в этом случае надо соблюдать порядок заливки таблиц. А что если FK задан на саму себя в рекурсии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:47:09 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисСравни insert в таблицу с индексом и insert + создание индексапоследнее, конечно, будет тормозить из-за необходимости поддерживать ACID при "многопоточном" доступе к таблице и малом объеме памяти. при ресторе этого же нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:49:32 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
fd00chвзять число строк из бекапаЕсли у нас настолько крохотная БД, что она целиком убирается в ОЗУ, то о ней рассуждать не интересно, т.е. игра не стоит свеч. Если не лезет в ОЗУ, то нахрена козе баян? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:51:13 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисДа и не все индексы так можно создавать. FK, например, не получится, т.к. в этом случае надо соблюдать порядок заливки таблиц. А что если FK задан на саму себя в рекурсии?на серебряную пулю не претендую))Ivan_Pisarevskyfd00chвзять число строк из бекапаЕсли у нас настолько крохотная БД, что она целиком убирается в ОЗУ, то о ней рассуждать не интересно, т.е. игра не стоит свеч. Если не лезет в ОЗУ, то нахрена козе баян?какой-то странный вывод. я имел в виду, что в бекапе записано число строк (в 8 байтовой константе) и ни к чему ресторить всю таблицу, чтобы его получить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 18:54:27 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
fd00chпоследнее, конечно, будет тормозить из-за необходимости поддерживать ACID при "многопоточном" доступе к таблице и малом объеме памяти. при ресторе этого же нет. оно будет тормозить из-за постоянного поиска места вставки в дерево неотсортированных данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 19:04:05 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Теоретически при создании индекса можно сортировать не всю таблицу, а только поля индекса + DB_KEY (если я ничего не упустил). Может оно конечно так и делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 19:16:28 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисМожет оно конечно так и делается. естественно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 19:22:31 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
Ох если бы всё было так просто... Таблоид2) Сравнить это число с имеющейся свободной памятью на машине (не с TempCacheLimit, а со всей свободной памятью!). Если оно больше, взять минимум из них и поделить на maxKey с отбрасыванием дробной части. Получим в итоге то число индексов (p), построение которых можно распараллелить. С расчётом буферов и потоков тоже не всё так гладко. Таблоид3) Запустить 'p' потоков. Поскольку они в каждый интервал времени будут читать примерно одни и те же страницы, кеширование должно сыграть роль: страницы, нужные потоку-2, еще не будут вытеснены из кеша, т.к. поток-1 прочитал их "вот только что". 4) Брать далее индексы с (p+1)-го по (p+1+N)-й и повторить пункт "1)" - и так до тех пор, пока не будут построены все индексы для таблицы. Нужно понимать, что всё потоки прочитали некоторые записи и их можно затирать новой порцией. Дочитывание можно организовать параллельно сортировкам. В один прекрасный момент потоки поймут, что им не хватает памяти и начнуть сбрасывать данные на диск, а этот процесс лучше "выпрямить", т.е. сделать последовательным (SSD не так критично, а вот даже рейду может быть не так комфортно, потому как это потому ещё вычитывать). На период сброса желательно приостановить чтение порций данных и т.д. ИМХО тут ухужшиь производительность легче чем улучшить. Сразу извиняюсь если несу бред :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 22:20:58 |
|
||
|
Моделировние одновременного построения нескольких индексов: вопросы по статистике
|
|||
|---|---|---|---|
|
#18+
dimitrfd00chпоследнее, конечно, будет тормозить из-за необходимости поддерживать ACID при "многопоточном" доступе к таблице и малом объеме памяти. при ресторе этого же нет. оно будет тормозить из-за постоянного поиска места вставки в дерево неотсортированных данных Иными словами можно сказать что идексация вновь прибывыших и построение индекса с нуля это "совершенно" разные процессы? (просто уточняю, из твоих уст, чтобы потом цитировать) По поду предложения fd00chуже создавать все табличные индексы "на лету" есть смысл учитывать тот факт, что это рестор и делать не индексирование, и сортировать как при первичном построении. Порцию влили, эту же порцию подкинули сортировщикам для индексов, закончили с заливом, влили индексы в БД, пошли за следующей табличкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2013, 22:37:16 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38371122&tid=1564400]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
142ms |
get topic data: |
7ms |
get forum data: |
4ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 476ms |

| 0 / 0 |
