|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
Всем доброго дня. Удивительный эффект обнаружил. Таблица ежедневно транкейтится (с опцией drop storage) и заполняется 20 миллионами записей. Простое перекладывание из одной таблицы в другую. У таблицы есть primary key. мне казалось, что append тут никак не повлияет на скорость вставки. однако на тестовом контуре выигрыш в 4 раза. на продуктивном - в 2 раза. Если убрать индекс из таблицы то разница в скорости (с хинтом и без) незначительная. С чем это связано? Выглядит нелогично. По идее, append не должен повлиять на скорость вставки в пустую таблицу. Триггеров у таблицы нет. после транкейта проверял - количество экстентов как у таблицы, так и у индекса - 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2019, 11:05 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
bhr, The APPEND hint tells the optimizer to perform a direct-path insert, which improves the performance of INSERT .. SELECT operations for a number of reasons: Data is appended to the end of the table, rather than attempting to use existing free space within the table. Data is written directly to the data files, by-passing the buffer cache. Referential integrity constraints are not considered. * No trigger processing is performed. * ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2019, 11:41 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
feagorbhr, The APPEND hint tells the optimizer to perform a direct-path insert, which improves the performance of INSERT .. SELECT operations for a number of reasons: Data is appended to the end of the table, rather than attempting to use existing free space within the table. Data is written directly to the data files, by-passing the buffer cache. Referential integrity constraints are not considered. * No trigger processing is performed. * и какой из 4 пунктов дает улучшение скорости? если только by-passing the buffer cache остальные както мимо: Referential integrity constraints are not considered форинкеев нету. триггеров нету, неиспользованных блоков в таблице тоже нет Я не спорю, просто пытаюсь понять вашу мысль. Еслиб ускорение было только за счет отсутствия кеширования, то при удаленном индексе тоже наблюдалось бы улучшение. Для понимания без primary key insert с append и без append - 14 секунд с primary key - без append - 600 секунд с append - 130 секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2019, 12:05 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
bhr, append пишет меньше undo и, соответственно, redo этого undo. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2019, 12:23 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
-2-bhr, append пишет меньше undo и, соответственно, redo этого undo. очень может быть. спасибо. Но почему тогда разница с append и без append исчезает при отсутствии индекса? Создается такое впечатление, что при append - оракл сперва вставляет все, не проверяя уникальность, а потом делает вставку в индекс, заодно проверяя уникальность. фактически делает rebuild index в конце вставки. а без append - проверяет уникальность каждой вставляемой строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2019, 13:32 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
APPEND [почти] не генерирует UNDO (а на него и REDO) только для таблицы Для индекса все идет как обычно ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2019, 13:54 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
И да, Direct-path Insert (APPEND) разбирается с индексами по завершении всего оператора, а не построчно ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2019, 13:59 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, спасибо. похоже на правду. буду выяснять, зачем и кому этот индекс понадобился. индексы в хранилищах - зло, от которого по возможности надо избавляться. в скором времени обновление данных будет более частым чем раз в сутки. и ускорение процессов обновления будет на первом месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.07.2019, 18:08 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
Ничто не мешает (а часто и рекомендуют) перед заливкой переводить индекс в unusable, а после перестроить Скорее всего, суммарно по времени это будет столько же, только разнесено во времени ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2019, 05:05 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
Вячеслав ЛюбомудровСкорее всего, суммарно по времени это будет столько же, только разнесено во времениТ.е. при прочих равных время недоступности индекса больше. Спрашивается зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2019, 07:20 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
Честно говоря, сам не очень понимаю, но это рекомендация от Оракла https://docs.oracle.com/cd/E11882_01/server.112/e25494/tables.htm#i1009887 Index Maintenance with Direct-Path INSERT Oracle Database performs index maintenance at the end of direct-path INSERT operations on tables (partitioned or nonpartitioned) that have indexes. This index maintenance is performed by the parallel execution servers for parallel direct-path INSERT or by the single process for serial direct-path INSERT. You can avoid the performance impact of index maintenance by making the index unusable before the INSERT operation and then rebuilding it afterward. Возможно, все-таки влияет, когда таблица не пуста изначально? А, может, из-за того, что новые данные не видны до завершения транзакции, а перестроенный индекс становится уже готов? И любой доступ по индексу требует согласованного чтения (через UNDO и т.д.), что повышает нагрузку в целом? Честно, я не исследовал этот вопрос. Как-то не было нужды ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2019, 13:01 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
bhrиндексы в хранилищах - зло, от которого по возможности надо избавлятьсяа для чего хранилище? Как используется? как SELECT * FROM <20 млн строк> WHERE true? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2019, 14:06 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
andreymxкак SELECT * FROM <20 млн строк> WHERE true?Проблема хранилища, что оно используется по всякому и на каждовыдумываемый запрос индексов не напасешься. Но и утверждать, что индексы зло, нелепо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2019, 16:19 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
трудно судить, кто как использует конечную витрину. Они могут не отчитываться. фантазии конечного пользователя не предугадать. но не думаю, что делают поиск инфы для конкретного id клиента (по которому индекс). как правило делаются статистические отчеты с группировками и связками с другими витринами. практика показала, что при проектировании таких витрин, индекс создают по принципу "по этому полю будет осуществляться связь, дай-ка я создам индекс по нему". я общался с сторонниками создания этих индексов "на всякий случай". Их аргументы в стиле "ну это же бытрее!!!". Что именно быстрее, что с чем сравнивают - загадка. Убрать индекс обычно тоже вызывает протест - "а вдруг". Хотя почти уверен, что таблица вся целиком переносится в сас и там строятся отчеты.. А индекс - просто следствие primary key, контроль отсутствия дублей. Наличие такого констреинта только испортит загрузку данных. Ибо лучше загрузить, что есть, а потом программно разобраться с наличием дублей, чем получить ошибку и остановку всего процесса. Отключение индекса и rebuild после вставки - пробовал. и эффект даже лучше чем от append. но не подходит. постепенно готовим базу к более частому обновлению данных (не раз в сутки, а чаще). Витрины в момент загрузки могут использоваться другими процессами. И как следствие нельзя использовать ни транкейтов, ни ребилдов индексов. проще и правильнее добиться удаления индекса. раньше убедить удавалось с трудом. сейчас руководство и старожилы увидели положительный эффект, думаю, пойдет легче. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2019, 10:44 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
Вячеслав Любомудровтолько разнесено во времени Суть этой рекомендации - сократить время загрузки новых данных в хранилище. Данные таблицы становятся доступны раньше, их можно начинать использовать параллельно с перестроением индекса. Кроме того, несколько понижаются риски сбоя собственно загрузки. Ну и обычно под регламент загрузки стараются подгонять схему partitioning с тем, чтобы не затрагивать не участвующие в процессе данные. И да, глобальные индексы в хранилище - зло, хотя некоторые нововведения в области управления индексами жизнь несколько упрощают. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2019, 12:05 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
andreymxbhrиндексы в хранилищах - зло, от которого по возможности надо избавлятьсяа для чего хранилище? Как используется? как SELECT * FROM <20 млн строк> WHERE true? Хранилища обычно используются для наведения всевсяческой аналитики-статистики на существенных объемах, и partitioning тут заметно удобнее индексов. Хотя и индексы тоже приходится делать - как для конечных витрин под наиболее типовое использование, так и для прочих слоев под технологические нужды (например, если строится какое-нибудь SCD2, то при трансформациях приходится решать задачу поиска актуальной записи по ключу). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2019, 12:11 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
APPEND хинт [почти] не будет генерировать undo, в том случае, если база запущена в режиме NOARCHIVELOG. Если база запущена в режиме ARCHIVELOG, то APPEND сработает в том случае, если на таблице отключено логирование (NOLOGGING). Если у вас разные показатели на тестовой и продукционной средах, проверьте одинаковые ли параметры таблицы/индекса. А именно: Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2019, 11:35 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
watsonЕсли база запущена в режиме ARCHIVELOG, то APPEND сработает в том случае, если на таблице отключено логирование (NOLOGGING).Читаешь документацию задом наперед? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2019, 11:48 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
-2-, что вас не устраивает? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2019, 12:35 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
watson, Append включает direct-path insert независимо от logging и archivelog. Утверждение, что append не сработает ложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2019, 14:20 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
-2-bhr, append пишет меньше undo и, соответственно, redo этого undo. ОК, я упустил уточнение, что описываю свойства APPEND касательно генерации UNDO. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2019, 14:37 |
|
Хинт append при инсерте в таблицу с индексом
|
|||
---|---|---|---|
#18+
Как говорится, слышал звон Более корректно утверждение звучит так: операция, которая может быть выполнена в режиме [сегмента] NOLOGGING (включая Direct-Path Insert) в режиме NOARCHIVELOG и будет выполняться как NOLOGGING Т.е. в режиме ARCHIVELOG если на сегменте не стоит атрибут NOLOGGING Direct-path Insert будет генерировать REDO, но не UNDO (и, соответсвенно, REDO на UNDO) В режиме NOARCHIVELOG REDO (за исключением минимального) на вставку генерироваться не будет, так же как и UNDO и REDO на UNDO ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2019, 14:42 |
|
|
start [/forum/topic.php?fid=52&fpage=72&tid=1882323]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
1ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 148ms |
0 / 0 |