Поиск…


параметры

параметры подробности
Степень параллелизма (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 секунды .

Кэш результатов хранит кеш, пока данные в базе данных не будут обновлены / изменены / удалены. Любое изменение освободит кеш.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow