|
|
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Вопрос в следующем. Создается простая таблица, без партиций. На таблицу навешано 6 составных индексов. СУБД Oracle 10.2. В пустую таблицу данные с хинтом APPEND вставляются мгновенно. Со временем, когда размер таблицы вырастает, вставка данных немного замедляется. Но вот в районе 60-70 миллионов записей в таблице скорость резко падает, 20 тыс записей может вставляться до 30 минут. Трассировка показала что основная потеря времени приходится на файлы с индексами. Пересоздание индексов ситуацию не исправило. Что может быть и как исправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 09:56 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Массажист, Попробуйте дропнуть индексы, вставить данные, создать индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 10:01 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, Интересный подход ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 10:11 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Массажистбез партиций Массажиств районе 60-70 миллионов записей в таблице МассажистЧто может быть и как исправить? Пересмотреть подход. Если не хочется возиться с партициями - смотреть в сторону оптимизации или замены дисковой подсистемы. На таких абстрактных показателях как количество записей и количество индексов сказать ничего толком нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 10:41 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Массажист, уже очень давно известно, что таблицы с индексами (и ключами), особенно содержащие много записей, обновляются крайне медленно. Для примера: обновление БД при ежемесячном расчете пенсий и дотаций всех московских пенсионеров, включая инвалидов и их доверенных лиц (это 10 млн и более записей в каждой основной таблице), на самом современном оборудовании SUN Microsystems занимало несколько суток. За это время обязательно случалось какое-нибудь ЧП, и всё надо было начинать сначала. Но это было только до тех пор, пока не была применена следующая технология: 1) Делается актуальная копия БД в текущем состоянии (резервные копии и так создавались автоматически) во временную БД. Это обязательно! Прием новых данных на некоторое время прекращается, о чем оповещаются все клиентские приложения сети. 2) Во временной БД у таблиц (не всех) удаляются ключи и индексы. 3) Делается обновление данных, а иногда и удаление с последующим инсертом. Без индексных таблиц это получается на порядок быстрее!!! 4) Проводится контроль ссылочной целостности новой БД. 5) Ключи и индексы восстанавливаются специальной программой (это делается быстро). 6) Производится контроль взаимодействия ПО с новой БД. 7) В случае положительного результата рабочая БД заменяется на новую, которая становится рабочей. Перед этим бывшая рабочая база архивируется. Такая технология обеспечивала быстрое (за несколько часов) и надежное обновление большой БД. Это было 20 лет назад, использовались СУБД Open Ingres, потом Oracle. Уверен, что сейчас появились специальные ПО (возможно, содержащееся в самих СУБД), которые все это делают (полу)автоматически, т.е. Вам не придется создавать и отрабатывать ПО в течение нескольких лет, как это делали мы, а надо будет найти соответствующий продукт и овладеть им. Я лишь попытался объяснить порядок и смысл основных шагов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 11:11 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
In short, getting rid of indexes - loading - and then rebuilding indexes makes sense only when you are loading almost entirely new data. If you are just adding more data to an already large segment - using /*+ APPEND */ with the indexes enabled is probably the right approach. The way insert /*+ APPEND */ works is a) we write table data above the high water mark (table is LOCKED, no other transaction will modify it) b) we write indexing data for the newly inserted rows into mini-index structures in temp c) at the end of the insert - we take these mini indexes and merge them in bulk into the existing indexes. We are done If you drop/disable the indexes what will happen instead is a) we write table data above the high water mark (table is LOCKED, no other transaction will modify it) b) at the end - we will full scan the table - the entire table - the whole table - N times where N = number of indexes - to recreate them. If you just made a large table a little larger - the time to full scan over and over defeats your goal. тут https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1921387700346909109 Может со статистикой индексов поиграться, чтобы мерж быстрее был? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 11:31 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Хотя, с другой стороны, Oracle должен найти куда вставить ссылки на новые узлы индексов Вопрос как он мержит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 11:36 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Массажист, я забыл объяснить главное: почему обновление и вставка в таблицы, лишенные индексов, происходит быстрее, чем в таблицы с индексами. (Ведь что такое "индекс"? - Индексы содержатся в точно таких же таблицах, как все остальные, только таблицы индексов создаете не Вы, а СУБД, когда Вы назначаете какое-то поле Вашей таблицы индексным.) Дело в том, что при каждой операции INSERT в таблицу с индексами происходит и перестройка всех индексных таблиц, связанных с этой таблицей, а также изменение значений индексов в таблицах, связанных с ней через индексы. Если же таблица очищена от индексов, то все обновления и добавления включаются в нее последовательно, "внавал". Это происходит так же быстро, как вставка в конец текстового файла символа или слова. Если после всех изменений БД программа делает индексирование таблиц, то это происходит только ОДИН РАЗ, а не КАЖДЫЙ РАЗ при добавлении каждой новой записи в индексированную таблицу. В этом заключается весь смысл отключения индексов перед массовым обновлением реляционных баз данных, в том числе перед массовым добавлением записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 11:38 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Вставка 20 тыщ. строк в таблицу с миллионами - это не такая уж и массовая операция. И что, каждый раз автору удалять и создавать индексы. Это не выход. К тому же как делать поиски пока индексов нет? Надо копать в сторону оптимизации таблицы и дисков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 16:41 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Гаврилов, Судя по уровню разработчиков, незавидна участь московских пенсионеров... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2017, 16:47 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Массажист, индексы битмап или битри? ENABLE_PARALLEL_DML вруби на уровне сессии и вставляй. Особенности использования почитаешь в доке. В чем его суть? Перестройка индексов будет кучей после вставки, сама вставка будет в параллель. В плане должна появиться строчка INDEX MAINTANCE. По EM должно быть всё хорошо видно. Как понять какой индекс тормозит? Можно трэйс наверное снимать, но есть вариант проще. Выполняешь вставку и мониторишь ash, схлопываешь её с объектами. Чем больше обращений к объекту тем больше он замедляет вставку. Но как показывает практика, наверняка есть индекс на строку. Может от него проще отказаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 04:25 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Вставка записи и изменение 6 индексов это 30 блоков чтения, 10 изменений, плюс undo. Полчаса на 20000 записей - 2 мс на lio. Нужно полностью игнорировать буфер кеш, чтобы загрузить работой пару механических hdd. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 07:11 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
индексы B-Tree, не битмап. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 09:41 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Массажистиндексы B-Tree, не битмап. Делай через pdml, должен быть профит хороший. Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 10:26 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Pavel_PV, я попробовал через Alter session force parallel dml parallel 4 Прибавки в скорости нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 11:00 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Гаврилов, Судя по уровню разработчиков, незавидна участь московских пенсионеров... Недавно работала в одной госконторе, там практиковалась такая схема работы с данными: пока пользовательское ПО работает с данными в схеме_1, программисты готовят данные в схеме_2 в течение месяца. После того, как подготовка дынных заканчивается, пользовательское ПО переключается на схему_2, а программисты - на схему_1. Видимо это из стародавних времён идёт от царя Гороха :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 11:30 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
МассажистPavel_PV, я попробовал через Alter session force parallel dml parallel 4 Прибавки в скорости нет. План изменился? Index Maitenance в плане появился? Может сам запрос без параллели выполняется? Планы нужны в общем, так гадать можно долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 12:11 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Зурбаган! Это способ, не только проверенный на практике, но и рекомендованной в теории еще основателями реляционной модели данных и РСУБД. Так что, спорите Вы даже не со мной, а с Коддом и Дейтом. Удалять индексы и потом их восстанавливать не так уж сложно: это простые операции, для которых один раз пишутся хранимые процедуры БД. На время обновления БД блокируется на ввод/изменение данных (все равно периодически проводятся регламентные работы - ТО), т.е. SELECT юзерам доступен. Если же нет такой возможности, то рабочая база продолжает работать, а обновление делается ее резервной копии, затем производится репликация двух баз - резервной из рабочей. В любом случае обновление таблиц без индексов происходит на 2 порядка быстрее, чем с индексами, а значит, это лучше даже с учетом блокировки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2017, 10:58 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Гавриловпроизводится репликацияТак может ну его нафиг вообще dml, если есть волшебная репликация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2017, 11:50 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
"Волшебной" репликации не существует, несмотря на все то, что вещали промоутеры Мелкомягкого на московских конференциях для банков - первого, кто в 90-х годах заявил на всех своих конференциях и в печати, что для MS SQL разработаны такие программы репликации структур и данных БД, а также мониторы транзакций (стоимостью для нас в то время десятки тысяч долларов, мне запомнилось число 56), которые позволяют содержать на каждом из тысяч серверов - простых ПК, разбросанных по всему миру, реплицируемые БД (т.е. крупные серверы, якобы, более не нужны, такие системы, якобы, равносильны применению машины Super Cray с ее локальной сетью!). Уже давно этот искусственно раздутый для России рынок (базар) попритих, но пароксизмы "монитора транзакций" по-прежнему возникают время от времени. Правда, цены стали почему-то гораздо ниже. На самом деле, при более пристальном рассмотрении, репликации оказались разными. Оказалось, что они зависят от требований конкретной информационной системы (ИС), и фактически всегда можно не учитывать все случаи жизни. Программы для репликаций могут быть совсем не сложными, не сложнее самих функций удаленного доступа, которые применяются при осуществлении репликации и которые сегодня поддерживаются всеми средствами разработки, в частности, MS Visual Studio (от общих для всех тенденций времени Майкрософту тоже уйти не удалось). Получается так, что механизм репликаций, прежде чем применять, надо разработать и отработать прикладным и системным программистам вместе. Главное хорошо продумать технологию сеанса репликации: что надо делать и в какой последовательности. Это непросто: надо создать очень грамотную постановку задачи, а это сейчас далеко не все могут (потому что плохо знают предметную область, да и некому им ее изложить), и поэтому сегодня репликация, по моим наблюдениям, применяется редко (систематически - только на Дальнем Западе несколькими фирмами, наверняка порожденными самим MS). Чаще создается еще одна копия БД, в ней производятся изменения, затем производится замена баз, как я и описал. А так как аппаратная часть всех необходимых обеспечений (те, кто хоть мельком знакомы с теорией IT, сразу поняли, какой список "обеспечений" я имею в виду) стала намного производительнее, чем была, то замена происходит быстро. Однако не все так просто, как хотелось бы, и нескоро будет просто. PS Особенно не скоро, пока существуют флудеры и тролли, который хлебом не корми, но дай поиздеваться над "пенсионерами". Если бы в 90-х, когда они еще только что появились на свет или в лучшем случае уже кушали свои козявки, не затормозили (насильственно, под влиянием наших собственных либеральных демократов, ну и не без западных долларей, конечно) развитие науки и промышленности России и отделившихся "стран", и вместе с этим не похерили бы естественную преемственность поколений , то сегодня не пришлось вам, многим и многим программерам - нашим прямым потомкам - задавать подобные детские вопросы и миллионы раз изобретать все тот же самый велосипед в каждой отдельно взятой коммерческой организации, прикрываясь локтями от всех других подобных же программеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2017, 13:15 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
MS? Какое отношение технологии БД MS имеют отношение к технологиям Oracle? Ну а в целом, подход для блокировщиков - удалить индексы/загрузить/создать - работает быстрее Для Oracle - это подходит для продукта Oracle RDB (бывшая RDB от фирмы DEC) А для того Oracle, который все обычно имеют ввиду, я выдержку давал, как происходит добавление данных и построение индексов для них с последующим мержем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2017, 13:30 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Класс! Только бы тему не закрыли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2017, 13:32 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
МассажистЧто может быть и как исправить?посмотреть в сторону sqlloader. Есть-ли в таблицах последовательности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2017, 13:47 |
|
||
|
Медленный insert
|
|||
|---|---|---|---|
|
#18+
Увеличьте размер файла для индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2017, 13:52 |
|
||
|
|

start [/forum/topic.php?fid=52&startmsg=39498817&tid=1885477]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
405ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 698ms |

| 0 / 0 |
