Buscar..


Parámetros

Parámetros Detalles
Grado de Paralelismo (DOP) Es el número de procesos / conexión en paralelo que desea que se abra su consulta. Por lo general es 2, 4, 8, 16, etc.
Nombre de la tabla El nombre de la tabla a la que se aplicará la sugerencia paralela.

Pista paralela

Las sugerencias paralelas a nivel de declaración son las más fáciles:

SELECT /*+ PARALLEL(8) */ first_name, last_name FROM employee emp;

Las sugerencias paralelas a nivel de objeto dan más control pero son más propensas a errores; los desarrolladores a menudo olvidan usar el alias en lugar del nombre del objeto, u olvidan incluir algunos objetos.

SELECT /*+ PARALLEL(emp,8) */ first_name, last_name FROM employee emp;

SELECT /*+ PARALLEL(table_alias,Degree of Parallelism) */ FROM table_name table_alias;

Digamos que una consulta tarda 100 segundos en ejecutarse sin utilizar una sugerencia paralela. Si cambiamos DOP a 2 para la misma consulta, lo ideal sería que la misma consulta con una sugerencia paralela tomara 50 segundos. De manera similar, usar DOP como 4 tomará 25 segundos.

En la práctica, la ejecución paralela depende de muchos otros factores y no se escala linealmente. Esto es especialmente cierto para tiempos de ejecución pequeños en los que la sobrecarga paralela puede ser mayor que las ganancias de la ejecución en múltiples servidores paralelos.

USE_NL

Usa bucles anidados.

Uso: use_nl(AB)

Esta sugerencia le pedirá al motor que use el método de bucle anidado para unir las tablas A y B. Eso es comparación fila por fila. La sugerencia no fuerza el orden de la unión, solo solicita NL.

SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID

APÉNDATE A LA PISTA

"Usar el método DIRECT PATH para insertar nuevas filas".

La sugerencia APPEND indica al motor que use la carga de ruta directa . Esto significa que el motor no utilizará una inserción convencional que use estructuras de memoria y bloqueos estándar, sino que escribirá directamente en el espacio de tablas los datos. Siempre crea nuevos bloques que se agregan al segmento de la tabla. Esto será más rápido, pero tiene algunas limitaciones:

  • No puede leer de la tabla que adjuntó en la misma sesión hasta que cometa o restituya la transacción.
  • Si hay activadores definidos en la tabla, Oracle no usará la ruta directa (es una historia diferente para las cargas de sqlldr).
  • otros

Ejemplo.

INSERT /*+append*/ INTO Employees
SELECT *
FROM Employees;

USE_HASH

Indica al motor que use el método hash para unir tablas en el argumento.

Uso: use_hash(TableA [TableB] ... [TableN])

Como se explica en muchos lugares , "en una combinación HASH, Oracle accede a una tabla (generalmente el más pequeño de los resultados combinados) y crea una tabla hash en la clave de combinación en la memoria. Luego escanea la otra tabla en la combinación (generalmente la más grande). uno) y sondea la tabla hash para coincidencias con ella ".

Se prefiere el método de bucles anidados cuando las tablas son grandes, no hay índices disponibles, etc.

Nota : la sugerencia no fuerza el orden de la unión, solo solicita el método HASH JOIN.

Ejemplo de uso:

SELECT /*+use_hash(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID

COMPLETO

La sugerencia COMPLETA le dice a Oracle que realice una exploración completa de la tabla en una tabla específica, sin importar si se puede usar un índice.

create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);

Sin sugerencias, se utiliza el índice:

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 |
--------------------------------------------------------------------------

La sugerencia completa obliga a una exploración completa:

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 |
--------------------------------------------------------------------------------

Caché de resultados

Oracle ( 11g y superior ) permite que las consultas SQL se almacenen en caché en el SGA y se reutilicen para mejorar el rendimiento. Consulta los datos de la caché en lugar de la base de datos. La ejecución posterior de la misma consulta es más rápida porque ahora los datos se extraen de la memoria caché.

SELECT /*+ result_cache */ number FROM main_table;

Salida -

Number
------
   1
   2
   3
   4
   5
   6
   7
   8
   9
   10

Elapsed: 00:00:02.20

Si vuelvo a ejecutar la misma consulta ahora, el tiempo de ejecución se reducirá ya que los datos ahora se recuperan del caché que se estableció durante la primera ejecución.

Salida -

Number
------
   1
   2
   3
   4
   5
   6
   7
   8
   9
   10

Elapsed: 00:00:00.10

Observe cómo el tiempo transcurrido se redujo de 2,20 segundos a 0,10 segundos .

La memoria caché de resultados mantiene la memoria caché hasta que los datos en la base de datos se actualicen / modifiquen / eliminen. Cualquier cambio liberará el caché.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow