Oracle Database
Советы
Поиск…
параметры
параметры | подробности |
---|---|
Степень параллелизма (DOP) | Это количество параллельных подключений / процессов, которые вы хотите, чтобы ваш запрос открывался. Обычно это 2, 4, 8, 16 и так далее. |
Название таблицы | Имя таблицы, на которой будет применяться параллельная подсказка. |
Параллельный намек
Параллельные подсказки на уровне инструкций являются самыми легкими:
SELECT /*+ PARALLEL(8) */ first_name, last_name FROM employee emp;
Параллельные подсказки на уровне объекта дают больше контроля, но более подвержены ошибкам; разработчики часто забывают использовать псевдоним вместо имени объекта или забывают включать некоторые объекты.
SELECT /*+ PARALLEL(emp,8) */ first_name, last_name FROM employee emp;
SELECT /*+ PARALLEL(table_alias,Degree of Parallelism) */ FROM table_name table_alias;
Предположим, что для выполнения запроса требуется 100 секунд без использования параллельного намека. Если мы изменим DOP на 2 для одного запроса, тогда в идеале один и тот же запрос с параллельным намеком займет 50 секунд. Аналогично, используя DOP как 4, потребуется 25 секунд.
На практике параллельное выполнение зависит от многих других факторов и не масштабируется линейно. Это особенно справедливо для небольших периодов времени, когда параллельные накладные расходы могут быть больше, чем выгоды от работы на нескольких параллельных серверах.
USE_NL
Используйте вложенные петли.
Использование: use_nl(AB)
Этот подсказку попросит движок использовать метод вложенных циклов, чтобы присоединиться к таблицам A и B. Это сравнение по ряду строк. Подсказка не форсирует порядок соединения, просто запрашивает NL.
SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
ПРИЛОЖЕНИЕ СОВЕТ
Msgstr "Использовать метод DIRECT PATH для вставки новых строк".
В подсказке APPEND
указывается, что двигатель использует нагрузку прямого пути . Это означает, что двигатель не будет использовать обычную вставку с использованием структур памяти и стандартных блокировок, но будет записывать непосредственно в табличное пространство данные. Всегда создает новые блоки, которые добавляются к сегменту таблицы. Это будет быстрее, но есть некоторые ограничения:
- Вы не можете прочитать из таблицы, которую вы добавили в тот же сеанс, пока вы не объявите или не отмените транзакцию.
- Если на таблице определены триггеры, Oracle не будет использовать прямой путь (это другая история для загрузок sqlldr).
- другие
Пример.
INSERT /*+append*/ INTO Employees
SELECT *
FROM Employees;
USE_HASH
Поручает движку использовать хэш-метод для объединения таблиц в аргумент.
Использование: use_hash(TableA [TableB] ... [TableN])
Как объяснялось во многих местах , «в HASH-соединении Oracle обращается к одной таблице (обычно к меньшим из объединенных результатов) и создает хэш-таблицу в ключе соединения в памяти. Затем она сканирует другую таблицу в соединении (обычно больше один) и проверяет хэш-таблицу для совпадений с ней ».
Это предпочтительнее, чем метод вложенных циклов, когда таблицы большие, индексов нет и т. Д.
Примечание : подсказка не форсирует порядок соединения, просто запрашивает метод HASH JOIN.
Пример использования:
SELECT /*+use_hash(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
ПОЛНЫЙ
FULL hint сообщает Oracle о выполнении полного сканирования таблицы в указанной таблице, независимо от того, может ли использоваться индекс.
create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);
Без подсказок индекс используется:
select count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | INDEX RANGE SCAN| IDX | 2 | 26 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
FULL hint заставляет полностью сканировать:
select /*+ full(f) */ count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 47 (3)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | TABLE ACCESS FULL| FULLTABLE | 2 | 26 | 47 (3)| 00:00:01 |
--------------------------------------------------------------------------------
Кэш результатов
Oracle ( 11g и выше ) позволяет SQL-запросам кэшироваться в SGA и повторно использовать для повышения производительности. Он запрашивает данные из кеша, а не из базы данных. Последующее выполнение одного и того же запроса происходит быстрее, поскольку теперь данные извлекаются из кеша.
SELECT /*+ result_cache */ number FROM main_table;
Выход -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:02.20
Если я снова запустил тот же запрос, время выполнения будет уменьшаться, поскольку данные теперь извлекаются из кеша, который был установлен во время первого выполнения.
Выход -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:00.10
Обратите внимание, как прошедшее время сократилось с 2.20 секунд до 0,10 секунды .
Кэш результатов хранит кеш, пока данные в базе данных не будут обновлены / изменены / удалены. Любое изменение освободит кеш.