miércoles, 15 de junio de 2011

Tunning SQL Oracle: 3ra Sesión

EXPLAIN PLAN
No Ejecuta la sentencia SQL, sino que extrae el plan de ejecución de un query.

EXPLAIN PLAN FOR
SELECT *
FROM CUSTOMERS
WHERE CUST_ID= 100;

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY());

- Esto es similar a presionar F6 en Oracle SQL Developer
- En este caso Dysplay retorna una colección (Nested Table)

EXPLAIN PLAN FOR
SELECT e.last_name, e.first_name,
d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id

Esto solo es para ver cómo serían los planes de ejecución, pero cómo podríamos ver el plan de ejecución de una sentencia del SharedPool? Busquemos su ID:

SELECT  SQL_ID, SQL_TEXT
FROM V$SQL
WHERE SQL_TEXT LIKE '%MINISTERIO%';

Como vemos, estamos usando el comentario puesto anteriormente en el Query para identificar el SQL.

El resultado serán dos registros, donde el primero correspone al sql que buscamos. Su ID es "ds2hz95tuOw5j"

Luego:

SELECT PLAN_TABLE_OUTPUT
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('ds2hz95tuOw5j'));


* En SQL Plus existen las siguientes funciones:

SET AUTOTRACE ON
SELECT SYSDATE FROM DUAL
/
Muestra el Plan de Ejecución y ejecuta la sentencia

SET AUTOTRACE TRACEONLY
SELECT SYSDATE FROM DUAL
/
Muestra el Plan de Ejecución y Estadísticas, pero no ejecuta la sentencia

SET AUTOTRACE TRACEONLY EXPLAIN
SELECT SYSDATE FROM DUAL
/
Muestra solo el Plan de Ejecución

5. Estadísticas

SELECT owner, job_name, enabled
FROM DBA_SCHEDULER_JOBS
WHERE JOB_NAME = 'GATHER_STATS_JOBS'
/


Nota:

Vistas de Performance (Info de la Instancia)
V$SQL_ARGA, V$FILE_STATS

Vistas de Diccionario
DBA_
USER_
ALL_

Ideas:
- El Proceso de Asistencia y de Planilla podría estar en packages,
- El Proceso de Generación Contable podría estar en packages,

Sampling
Minimizar recursos para recolectar estadísticas.
Histogramas
Información Valiosa para la distribución es máximo y mínimo
SELECT table_name, column_name, num_distinct, num_buckets, last_analysed
FROM DBA_TAB_COL_STATISTICS
WHERE OWNER = 'HR'
AND HISTOGRAM = 'FREQUENCY'
/

SELECT *
FROM DBA_HISTOGRAMS
WHERE TABLE_NAME='JOB_HISTORY' AND COLUMN_NAME='DEPARTMENT_ID'
/

  • Histogramas de Alto Baloanceado (Heigh-Balanced)
  • Histogramas de Frecuencia
* Se puede bloquear con estadísticas y bloquear sin estadísticas: Dinamic Sampling

6. Indices

Es mejor eliminar índices que no se usan.
El desarrollador puede saber los índices q se usan con el Explain plan

B*-tree
  • Normal
  • Function: create index funcindex on clientes (upper(cust_last_name));
    Composite Indexes
    Skip Scanning

Bitmap Index
Solo para reporting
Para columnas de baja cardinalidad: genero, estado civil, ubicación geográfica (no más de 8% del total de registros)

SELECT CUST_ID, CUST_GENDER, CUST_MARITAL_STATUS, CUST_INCOME,_LEVEL FROM CLIENTES SAMPLE(0.05)

SELECT *
FROM CUSTOMERS
WHERE CUST_GENDER = 'M'
AND CUST_INCOME_LEVEL IN('F:110,00 - 129,999', 'E:90,000 - 109,999')

CREATE BITMAP INDEX CUST_SALES_BJI
ON SALES(C.CUST_CITY)
FROM SALES S, CUSTOMERS C
WHERE C.CUST_ID=S.CUST_ID;


SHOW PARAMETER QUERY;
Debe presentar true

No hay comentarios:

Publicar un comentario