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

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

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

спасибо. похоже на правду. буду выяснять, зачем и кому этот индекс понадобился. индексы в хранилищах - зло, от которого по возможности надо избавляться. в скором времени обновление данных будет более частым чем раз в сутки. и ускорение процессов обновления будет на первом месте.
...
Рейтинг: 0 / 0
06.07.2019, 05:05
    #39834537
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
Ничто не мешает (а часто и рекомендуют) перед заливкой переводить индекс в unusable, а после перестроить
Скорее всего, суммарно по времени это будет столько же, только разнесено во времени
...
Рейтинг: 0 / 0
06.07.2019, 07:20
    #39834542
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
Вячеслав ЛюбомудровСкорее всего, суммарно по времени это будет столько же, только разнесено во времениТ.е. при прочих равных время недоступности индекса больше. Спрашивается зачем?
...
Рейтинг: 0 / 0
06.07.2019, 13:01
    #39834580
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
Честно говоря, сам не очень понимаю, но это рекомендация от Оракла
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
06.07.2019, 14:06
    #39834597
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
bhrиндексы в хранилищах - зло, от которого по возможности надо избавлятьсяа для чего хранилище? Как используется? как SELECT * FROM <20 млн строк> WHERE true?
...
Рейтинг: 0 / 0
06.07.2019, 16:19
    #39834616
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
andreymxкак SELECT * FROM <20 млн строк> WHERE true?Проблема хранилища, что оно используется по всякому и на каждовыдумываемый запрос индексов не напасешься. Но и утверждать, что индексы зло, нелепо.
...
Рейтинг: 0 / 0
08.07.2019, 10:44
    #39834904
bhr
bhr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
трудно судить, кто как использует конечную витрину. Они могут не отчитываться. фантазии конечного пользователя не предугадать. но не думаю, что делают поиск инфы для конкретного id клиента (по которому индекс). как правило делаются статистические отчеты с группировками и связками с другими витринами.
практика показала, что при проектировании таких витрин, индекс создают по принципу "по этому полю будет осуществляться связь, дай-ка я создам индекс по нему". я общался с сторонниками создания этих индексов "на всякий случай". Их аргументы в стиле "ну это же бытрее!!!". Что именно быстрее, что с чем сравнивают - загадка. Убрать индекс обычно тоже вызывает протест - "а вдруг". Хотя почти уверен, что таблица вся целиком переносится в сас и там строятся отчеты.. А индекс - просто следствие primary key, контроль отсутствия дублей. Наличие такого констреинта только испортит загрузку данных. Ибо лучше загрузить, что есть, а потом программно разобраться с наличием дублей, чем получить ошибку и остановку всего процесса.
Отключение индекса и rebuild после вставки - пробовал. и эффект даже лучше чем от append. но не подходит. постепенно готовим базу к более частому обновлению данных (не раз в сутки, а чаще). Витрины в момент загрузки могут использоваться другими процессами. И как следствие нельзя использовать ни транкейтов, ни ребилдов индексов. проще и правильнее добиться удаления индекса.
раньше убедить удавалось с трудом. сейчас руководство и старожилы увидели положительный эффект, думаю, пойдет легче.
...
Рейтинг: 0 / 0
08.07.2019, 12:05
    #39834929
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
Вячеслав Любомудровтолько разнесено во времени
Суть этой рекомендации - сократить время загрузки новых данных в хранилище.
Данные таблицы становятся доступны раньше, их можно начинать использовать параллельно с перестроением индекса.
Кроме того, несколько понижаются риски сбоя собственно загрузки.

Ну и обычно под регламент загрузки стараются подгонять схему partitioning с тем, чтобы не затрагивать не участвующие в процессе данные.
И да, глобальные индексы в хранилище - зло, хотя некоторые нововведения в области управления индексами жизнь несколько упрощают.
...
Рейтинг: 0 / 0
08.07.2019, 12:11
    #39834931
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
andreymxbhrиндексы в хранилищах - зло, от которого по возможности надо избавлятьсяа для чего хранилище? Как используется? как SELECT * FROM <20 млн строк> WHERE true?
Хранилища обычно используются для наведения всевсяческой аналитики-статистики на существенных объемах, и partitioning тут заметно удобнее индексов.
Хотя и индексы тоже приходится делать - как для конечных витрин под наиболее типовое использование, так и для прочих слоев под технологические нужды (например, если строится какое-нибудь SCD2, то при трансформациях приходится решать задачу поиска актуальной записи по ключу).
...
Рейтинг: 0 / 0
09.07.2019, 11:35
    #39835370
watson
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
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
09.07.2019, 11:48
    #39835377
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
watsonЕсли база запущена в режиме ARCHIVELOG, то APPEND сработает в том случае, если на таблице отключено логирование (NOLOGGING).Читаешь документацию задом наперед?
...
Рейтинг: 0 / 0
09.07.2019, 12:35
    #39835399
watson
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хинт append при инсерте в таблицу с индексом
-2-,

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

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

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

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

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

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


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