Oracle Live

25/08/2016

Laboratorios – Explain plan proporciona plan de ejecucion erroneo

Filed under: Laboratorios — mogukiller @ 9:05 am

En este laboratorio intento mostrar como ante una conversion implicita, el comando de explain plan nos proporciona un plan de ejecución distinto al que luego va a utilizar el CBO.

La partida de este laboratorio es una tabla que uno de los campos (id) se ha creado de tipo VARCHAR2, pero los datos que se les pasa es de tipo number, obligando a oracle hacer una conversion implicita.

-- Creamos el entorno

SQL> create table t (id varchar2(10), name varchar2(100));
/*
	Table created.
*/
SQL> insert into t select to_char(object_id), object_name from dba_objects;
/*
	75516 rows created.
*/
SQL> commit;

SQL> create index i on t(id);
/*
	Index created.
*/
SQL> exec dbms_stats.gather_table_stats(user,'T',cascade=>true);


-- Obtenemos el plan de ejecución
'nota: se le pasa un NUMBER en lugar de un VARCHAR2'

SQL> var x number
SQL> exec :x:=99999

SQL> explain plan for
  2  select sum(length(name)) from t where id >  :x;

SQL> select * from table(dbms_xplan.display) ;
/*
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3694077449

-------------------------------------------------------------------------------------
| Id  | Operation                    | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |      |     1 |    30 |   101   (0)| 00:00:02 |
|   1 |  SORT AGGREGATE              |      |     1 |    30 |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID| T    |  3776 |   110K|   101   (0)| 00:00:02 |
|*  3 |    INDEX RANGE SCAN          | I    |   680 |       |     3   (0)| 00:00:01 | <<< Te dice que va a utilizar un indice.
-------------------------------------------------------------------------------------

*/


-- Ahora ejecutamos la query; OJO: observar que se le pasa un NUMBER en lugar de un VARCHAR2
-----

SQL> SELECT SUM(LENGTH(NAME)) FROM T WHERE ID >  :X;
/*
SUM(LENGTH(NAME))
-----------------
0
*/

SQL> select * from table(dbms_xplan.display_cursor);
/*
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |   103 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |    30 |            |          |
|*  2 |   TABLE ACCESS FULL| T    |  3776 |   110K|   103   (1)| 00:00:02 | <<<< Realmente hace un FULL !!!
---------------------------------------------------------------------------
*/

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: