powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хинт append при инсерте в таблицу с индексом
23 сообщений из 23, страница 1 из 1
Хинт append при инсерте в таблицу с индексом
    #39834248
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
Всем доброго дня.
Удивительный эффект обнаружил. Таблица ежедневно транкейтится (с опцией drop storage) и заполняется 20 миллионами записей. Простое перекладывание из одной таблицы в другую. У таблицы есть primary key.
мне казалось, что append тут никак не повлияет на скорость вставки. однако на тестовом контуре выигрыш в 4 раза. на продуктивном - в 2 раза. Если убрать индекс из таблицы то разница в скорости (с хинтом и без) незначительная.
С чем это связано? Выглядит нелогично. По идее, append не должен повлиять на скорость вставки в пустую таблицу.
Триггеров у таблицы нет. после транкейта проверял - количество экстентов как у таблицы, так и у индекса - 1.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834279
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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. *
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834296
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
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 секунд.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834307
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bhr,

append пишет меньше undo и, соответственно, redo этого undo.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834357
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
-2-bhr,

append пишет меньше undo и, соответственно, redo этого undo.
очень может быть. спасибо. Но почему тогда разница с append и без append исчезает при отсутствии индекса?
Создается такое впечатление, что при append - оракл сперва вставляет все, не проверяя уникальность, а потом делает вставку в индекс, заодно проверяя уникальность. фактически делает rebuild index в конце вставки.
а без append - проверяет уникальность каждой вставляемой строки.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834368
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
APPEND [почти] не генерирует UNDO (а на него и REDO) только для таблицы
Для индекса все идет как обычно
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834369
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, Direct-path Insert (APPEND) разбирается с индексами по завершении всего оператора, а не построчно
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834472
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
Вячеслав Любомудров,

спасибо. похоже на правду. буду выяснять, зачем и кому этот индекс понадобился. индексы в хранилищах - зло, от которого по возможности надо избавляться. в скором времени обновление данных будет более частым чем раз в сутки. и ускорение процессов обновления будет на первом месте.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834537
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничто не мешает (а часто и рекомендуют) перед заливкой переводить индекс в unusable, а после перестроить
Скорее всего, суммарно по времени это будет столько же, только разнесено во времени
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834542
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровСкорее всего, суммарно по времени это будет столько же, только разнесено во времениТ.е. при прочих равных время недоступности индекса больше. Спрашивается зачем?
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834580
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря, сам не очень понимаю, но это рекомендация от Оракла
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 и т.д.), что повышает нагрузку в целом?

Честно, я не исследовал этот вопрос. Как-то не было нужды
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834597
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bhrиндексы в хранилищах - зло, от которого по возможности надо избавлятьсяа для чего хранилище? Как используется? как SELECT * FROM <20 млн строк> WHERE true?
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834616
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxкак SELECT * FROM <20 млн строк> WHERE true?Проблема хранилища, что оно используется по всякому и на каждовыдумываемый запрос индексов не напасешься. Но и утверждать, что индексы зло, нелепо.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834904
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
трудно судить, кто как использует конечную витрину. Они могут не отчитываться. фантазии конечного пользователя не предугадать. но не думаю, что делают поиск инфы для конкретного id клиента (по которому индекс). как правило делаются статистические отчеты с группировками и связками с другими витринами.
практика показала, что при проектировании таких витрин, индекс создают по принципу "по этому полю будет осуществляться связь, дай-ка я создам индекс по нему". я общался с сторонниками создания этих индексов "на всякий случай". Их аргументы в стиле "ну это же бытрее!!!". Что именно быстрее, что с чем сравнивают - загадка. Убрать индекс обычно тоже вызывает протест - "а вдруг". Хотя почти уверен, что таблица вся целиком переносится в сас и там строятся отчеты.. А индекс - просто следствие primary key, контроль отсутствия дублей. Наличие такого констреинта только испортит загрузку данных. Ибо лучше загрузить, что есть, а потом программно разобраться с наличием дублей, чем получить ошибку и остановку всего процесса.
Отключение индекса и rebuild после вставки - пробовал. и эффект даже лучше чем от append. но не подходит. постепенно готовим базу к более частому обновлению данных (не раз в сутки, а чаще). Витрины в момент загрузки могут использоваться другими процессами. И как следствие нельзя использовать ни транкейтов, ни ребилдов индексов. проще и правильнее добиться удаления индекса.
раньше убедить удавалось с трудом. сейчас руководство и старожилы увидели положительный эффект, думаю, пойдет легче.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834929
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровтолько разнесено во времени
Суть этой рекомендации - сократить время загрузки новых данных в хранилище.
Данные таблицы становятся доступны раньше, их можно начинать использовать параллельно с перестроением индекса.
Кроме того, несколько понижаются риски сбоя собственно загрузки.

Ну и обычно под регламент загрузки стараются подгонять схему partitioning с тем, чтобы не затрагивать не участвующие в процессе данные.
И да, глобальные индексы в хранилище - зло, хотя некоторые нововведения в области управления индексами жизнь несколько упрощают.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39834931
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxbhrиндексы в хранилищах - зло, от которого по возможности надо избавлятьсяа для чего хранилище? Как используется? как SELECT * FROM <20 млн строк> WHERE true?
Хранилища обычно используются для наведения всевсяческой аналитики-статистики на существенных объемах, и partitioning тут заметно удобнее индексов.
Хотя и индексы тоже приходится делать - как для конечных витрин под наиболее типовое использование, так и для прочих слоев под технологические нужды (например, если строится какое-нибудь SCD2, то при трансформациях приходится решать задачу поиска актуальной записи по ключу).
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39835370
watson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
APPEND хинт [почти] не будет генерировать undo, в том случае, если база запущена в режиме NOARCHIVELOG.

Если база запущена в режиме ARCHIVELOG, то APPEND сработает в том случае, если на таблице отключено логирование (NOLOGGING).

Если у вас разные показатели на тестовой и продукционной средах, проверьте одинаковые ли параметры таблицы/индекса.
А именно:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
select logging, degree
from all_tables
where table_name = :1;

select logging, degree
from all_indexes
where index_name = :1;
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39835377
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
watsonЕсли база запущена в режиме ARCHIVELOG, то APPEND сработает в том случае, если на таблице отключено логирование (NOLOGGING).Читаешь документацию задом наперед?
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39835399
watson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

что вас не устраивает?
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39835481
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
watson,

Append включает direct-path insert независимо от logging и archivelog. Утверждение, что append не сработает ложно.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39835490
watson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-bhr,

append пишет меньше undo и, соответственно, redo этого undo.

ОК, я упустил уточнение, что описываю свойства APPEND касательно генерации UNDO.
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39835492
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как говорится, слышал звон

Более корректно утверждение звучит так: операция, которая может быть выполнена в режиме [сегмента] NOLOGGING (включая Direct-Path Insert) в режиме NOARCHIVELOG и будет выполняться как NOLOGGING

Т.е. в режиме ARCHIVELOG если на сегменте не стоит атрибут NOLOGGING Direct-path Insert будет генерировать REDO, но не UNDO (и, соответсвенно, REDO на UNDO)
В режиме NOARCHIVELOG REDO (за исключением минимального) на вставку генерироваться не будет, так же как и UNDO и REDO на UNDO
...
Рейтинг: 0 / 0
Хинт append при инсерте в таблицу с индексом
    #39835537
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровможет быть выполнена в режиме [сегмента] NOLOGGING
И тут сразу следует оговорка про тип сегмента :)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хинт append при инсерте в таблицу с индексом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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