|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Привет всем. Имеются внешние данные (около 40 млн записей), которые надо залить в некую таблицу. 1. Создается талица без каких либо ограничений в виде ключей, индексов, not null. 2. Так же создается полный по структуре эквивалент в виде внешней таблицы. 3. Некой внешней программой создается файл в формате external table, содержащий внешние данные. 4. Запросом вида Код: plsql 1.
данные переливаются в целевую талицу. 5. На целевую таблицу накладываюся все требуемые ограничения, создаются индексы: Код: powershell 1. 2. 3.
В данном конкретном случае процесс переноса данных и создания индексов занимает около 18 минут. Если сначала создать индексы, а затем перенести данные запросом в целевую таблицу, то процесс занимает существенно больше времени (я прождал около 3-х часов и снял процесс). Чем обусловлено столь существенное увеличение времени при переносе данных в таблицу с созданными индексам по сравнению с созданием индексов по таблице с залитыми данными? С уважением, Polesov. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 13:24 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
PolesovЧем обусловлено столь существенное увеличение времени при переносе данных в таблицу с созданными индексам по сравнению с созданием индексов по таблице с залитыми данными? Тем, что данные надо добавлять и в индексы, что есть нетривиальный процесс, затрагивающий большое количество страниц. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 13:38 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, но разница более, чем на порядок... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 13:48 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Polesov, примитивные тесты показывают, что уникальный индекс по int/bigint замедляет вставку в ~3 раза, а индекс по строковому столбцу - в ~7 раз. Увы, да, физика такая. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 13:54 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Polesovно разница более, чем на порядок... рекомендую почитать алгоритм добавления ключа в страничный индекс. например, в b-tree filer этот код занимал где-то 3 страницы текста. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 13:55 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Polesovразница более, чем на порядок... между последовательным и случайным I/O - именно так ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 13:58 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Polesov, потому что "PK по полю типа CHAR(36)" не есть хорошо для вставки. Если там какой нибудь GUID, то такие индексы практически не сжимаются префиксной компрессией, да и вставка каждой записи модифицирует разные страницы индекса. Был бы на этом месте монотонно возрастающий INTEGER возможно разница была бы не столь существенной. Был тут как-то топик не совсем про то, но на 3 ей странице есть некоторые ответы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:00 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
kdvпримитивные тесты показывают, что уникальный индекс по int/bigint замедляет вставку в ~3 раза, а индекс по строковому столбцу - в ~7 раз. Можно ли сказать, что замедление суммируется по каждому из индексов? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:01 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Симонов Дениспотому что "PK по полю типа CHAR(36)" не есть хорошо для вставки. Если там какой нибудь GUID, то такие индексы практически не сжимаются префиксной компрессией Да, там PK имеет тип GUID, но ничего не поделаешь, т.к. данные внешние и структура уже предопределена. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:05 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
PolesovИмеются внешние данные (около 40 млн записей), которые надо залить в некую таблицу. Это разовая операция или периодическая? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:06 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
PolesovМожно ли сказать, что замедление суммируется по каждому из индексов? конечно! более того, для индексов по строковым столбцам замедление вставки нелинейно, т.е. вначале быстро, потом медленее, и после нескольких миллионов записей выравнивается. с индексами по числовым столбцам такого нет, там замедление вставки равномерно-постоянно. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:11 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
PolesovМожно ли сказать, что замедление суммируется по каждому из индексов? Грубо - можно. Но зависимость там далека от линейной. Polesovтам PK имеет тип GUID GUID это CHAR(16), не CHAR(36). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:11 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Симонов ДенисЭто разовая операция или периодическая? Для конкретного экземпляра БД - разовая, т.к. при появлении обновлений внешних данных БД пересоздается заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:23 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovGUID это CHAR(16), не CHAR(36). Внешние данные в DBF-файлах - там GUID-ы представлены в текстовом виде. Речь идет про ФИАС. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:26 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
PolesovВнешние данные в DBF-файлах - там GUID-ы представлены в текстовом виде. Это как-то мешает использовать UUID_TO_CHAR при импорте?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:36 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЭто как-то мешает использовать UUID_TO_CHAR при импорте?.. Такой вариант рассматривался, но никакого ощутимого выигрыша не наблюдалось. Зато преобразование строковых гуидов ощутимо увеличивает время заливки данных. БД носит справочный характер и используется в режиме read only. Более того, при появлении обновлений данных БД пересоздается заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2016, 14:46 |
|
Массовая заливка данных
|
|||
---|---|---|---|
#18+
PolesovЕсли сначала создать индексы, а затем перенести данные запросом в целевую таблицу, то процесс занимает существенно больше времени (я прождал около 3-х часов и снял процесс). Чем обусловлено столь существенное увеличение времени при переносе данных в таблицу с созданными индексам верно. временная деактивация индексов - это типовой FAQ при вставке больших данных. тем, что индекс перестраивается или один раз, или много-много-много раз в процессе. потому что движок не знаает заранее какая запись будет последней и обязан каждую из них воспринимать как последнюю и подстраивать индекс. очень грубо говоря - просто для аналогии - попробуйте сравнить два действия 1) создать файл на 4*40МБ и заполнить его int32 числами от 1 до 40М 2) создать файл на 4 байта и записать в него int32 =1. Создать файл на 2*4 байтов, скопировать в него 1*4 байта из первого, удалить первый файл, в конец нового файла записать Int32 =2. Создать файл на 3*4 байтов, скопировать в него 2*4 байта из второго, удалить второй файл, в конец нового файла записать Int32 =3 - и так 40 млн раз ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2016, 16:05 |
|
|
start [/forum/topic.php?fid=40&msg=39190827&tid=1562294]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 177ms |
0 / 0 |