¿Que es más eficiente en términos de velocidad de ejecución en consultas SQL? ¿Usar índices únicos del tipo number o usar varchar2?
Hace unos días hice unas pruebas en una base de datos Oracle 10g R2 sobre CentOS 5 para ver que es más eficiente en términos de tiempos de búsqueda evaluando los tipos number versus varchar2. Al hacer búsquedas simples (usando solo una tabla) los planes de ejecución son equivalentes al usar índices únicos con una columna NUMBER(10) o si la columna indexada es VARCHAR2(10). Para preparar un ambiente de ejecución usé como base la tabla objetos (imagen de la tabla all_objects) creando dos columnas ID_OBJETO y COD_OBJETO e indexandolas separadamente con una clave única
Varios select usando la columna number
ALTER SESSION SET sql_trace = TRUE;
SELECT id_objeto, cod_objeto, object_name, object_type
FROM mherrera.objetos
WHERE id_objeto = 22000;
.....
ALTER SESSION SET sql_trace=FALSE;
Varios select usando la columna varchar2
ALTER SESSION SET sql_trace = TRUE;
SELECT id_objeto, cod_objeto, object_name, object_type
FROM mherrera.objetos
WHERE cod_objeto = '0000022000';
.....
ALTER SESSION SET sql_trace=FALSE;
Usando tkprof para evaluar la ejecución:
Select usando NUMBER
SELECT id_objeto, cod_objeto, object_name, object_type
FROM mherrera.objetos
WHERE id_objeto = 22000
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.00 0.00 0 0 0 0
Execute 2 0.00 0.00 0 0 0 0
Fetch 4 0.00 0.00 0 6 0 2
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 8 0.00 0.00 0 6 0 2
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 65 (MHERRERA)
Rows Row Source Operation
------- ---------------------------------------------------
1 TABLE ACCESS BY INDEX ROWID OBJETOS (cr=3 pr=0 pw=0 time=62 us)
1 INDEX UNIQUE SCAN UK01_OBJETOS (cr=2 pr=0 pw=0 time=33 us)(object id 68777)
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT MODE: ALL_ROWS
1 TABLE ACCESS MODE: ANALYZED (BY INDEX ROWID) OF 'OBJETOS' (TABLE)
1 INDEX MODE: ANALYZED (UNIQUE SCAN) OF 'UK01_OBJETOS' (INDEX(UNIQUE))
Select usando VARCHAR2
SELECT id_objeto, cod_objeto, object_name, object_type
FROM mherrera.objetos
WHERE cod_objeto = '0000022000'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.00 0.00 0 0 0 0
Execute 2 0.00 0.00 0 0 0 0
Fetch 4 0.00 0.00 0 6 0 2
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 8 0.00 0.00 0 6 0 2
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 65 (MHERRERA)
Rows Row Source Operation
------- ---------------------------------------------------
1 TABLE ACCESS BY INDEX ROWID OBJETOS (cr=3 pr=0 pw=0 time=46 us)
1 INDEX UNIQUE SCAN UK02_OBJETOS (cr=2 pr=0 pw=0 time=25 us)(object id 68778)
Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT MODE: ALL_ROWS
1 TABLE ACCESS MODE: ANALYZED (BY INDEX ROWID) OF 'OBJETOS' (TABLE)
1 INDEX MODE: ANALYZED (UNIQUE SCAN) OF 'UK02_OBJETOS' (INDEX (UNIQUE))
Los planes son equivalentes y el uso de recursos y lecturas son los mismos, por lo tanto, la conclusión es que desde el punto de vista de velocidad de ejecución de una query, es lo mismo indexar por NUMBER o por VARCHAR2
Para ejecutar estas pruebas usé los siguientes scripts:
Crear escenario base
Varios select usando Number
Varios select usando Varchar2
Después, ejecute unas queries con un join entre dos tablas (Tipos_Objetos y Objetos)y los resultados son equivalentes. Para complementar el escenario anterior:
Complementa escenario con columnas Number
Select con Number
Complementa escenario con columnas Varchar2
Select con Varchar2
Los resultados generados por TRACE + TKPROF en este nuevo escenario:
Select con Number
Select con Varchar2
Contexto: Oracle 10g R2; SO: Centos 5.2
No hay comentarios:
Publicar un comentario