¿Cómo se puede probar la conectividad de Oracle?


Conectarse a una base de datos de Oracle mediante ODBC requiere dos cosas:
  • Un Nombre de servicio Oracle (conocido como un Alias en las versiones anteriores de Oracle 8.0) el cual define la ubicación (nombre del servidor y puerto) y la base de datos (instancia) para la conexión.
  • Un Origen de datos ODBC define simplemente el nombre del servicio debe utilizarse para la conexión ODBC.
Cada uno de estos elementos debe configurarse correctamente para que una conexión funcione  así que cuando se producen problemas de conexión, es mejor probar cada parte de la conexión para determinar dónde reside el problema. La utilidad TNSPING determina si se puede llegar con éxito al oyente de un servicio en una red de Oracle Net. Si puede conectarse con éxito de un cliente a un servidor (o de un servidor a otro servidor) utilizando la utilidad TNSPING, entonces muestra una estimación del tiempo de viaje de ida y vuelta (en milisegundos) que se necesita para alcanzar el servicio Oracle Net. Si falla, entonces muestra un mensaje que describe el error que ocurrió. Esto le permite ver el error de red que está ocurriendo sin la sobrecarga de una conexión de base de datos. Use el siguiente comando para probar la conectividad:
 tnsping net_service_name count
En el comando anterior, se utilizan los siguientes argumentos:
  • net_service_name debe existir en el archivo tnsnames.ora o en el servicio de nombres en uso, como NIS.
  • count determina cuántas veces el programa intenta alcanzar el servidor. Este argumento es opcional.
Si el nombre de servicio de red especificado es un nombre de base de datos, TNSPING intentará comunicarse con el oyente correspondiente.En realidad no determina si la base de datos se está ejecutando. Utilice SQL * Plus para intentar una conexión a la base de datos.

Probar el nombre del servicio Oracle

La utilidad TNSPING puede utilizarse para probar un nombre de servicio de Oracle. Uso: 1. Abra un símbolo del sistema (haga clic en Inicio, haga clic en Ejecutar, escriba cmd y, a continuación, haga clic en Aceptar). 2. Escriba tnsping < nombre servicio > (para Oracle 7.3 o Oracle 8i y versiones posteriores) o tnsping80 < nombre servicio > (para Oracle 8.0), y, a continuación, presione ENTRAR. La utilidad de Ping TNS producirá un «Aceptar» o un mensaje de «Error de conexión». En el caso de un «Error al conectar» del mensaje, una causa o motivo se incluirá (por ejemplo, «12545 de TNS: conexión fallado porque el objeto o el host de destino no existe»). Si falla el comando Ping TNS, hay un problema con el nombre del servicio Oracle. La configuración para el nombre del servicio debe comprobarse mediante el Ayudante Net de Oracle o el Asistente para configuración de red. DBA Oracle que necesite proporcionar la información de conexión correcta.

Probar el origen de datos ODBC

La utilidad de prueba ODBC de Oracle puede utilizarse para probar un origen de datos ODBC. Uso:
  1. Haga clic en Inicio, seleccione programas y, a continuación, seleccione la carpeta de programa de Oracle (el nombre de esta carpeta puede variar).
  2. En versiones anteriores de Oracle, el programa de prueba ODBC de Oracle puede mostrarse en la carpeta de programa de Oracle. Si es así, haga clic en él. Si no es así, seleccione la carpeta de Administración de la red y, a continuación, haga clic en Prueba ODBC de Oracle. Aparecerá una ventana de prueba ODBC de Oracle de 32 bits .
  3. Haga clic en el botón Conectar . Aparecerá el cuadro de diálogo Seleccionar origen de datos.
  4. Haga clic en la ficha Machine Data Source y, a continuación, seleccione el origen de datos que desea probar y haga clic en Aceptar.
  5. En el cuadro de inicio de sesión, escriba el Nombre de usuario y la contraseña en los cuadros apropiados y, a continuación, haga clic en Aceptar.
  6. Tras pulsar en Aceptar, el botón Conectar está disponible y se deben habilitar los botones Desconectar, Todas las tablas, Las tablas de usuario y Execute . De lo contrario, se producirá un error.
  7. Si el Ping TNS tuvo éxito, pero se produce un error en la prueba de ODBC, hay un problema con el origen de datos ODBC o con el inicio de sesión y la contraseña proporcionados para realizar la conexión. Compruebe que ambos son correctos y vuelva a intentarlo.

¿Que se puede hacer para mejorar el rendimiento de las consultas en Oracle 11?


Tradicionalmente para mejorar el rendimiento de las consultas en SQL contra una BBDD Oracle , una vez optimizada la consulta con técnicas  de Tuneling ( por ejemplo usando Hints si procede) ,   siempre pasamos a dos técnicas clásicas :

  • Reconstruyendo los  índices existente en base de datos ,para lo cual previamente comprobaremos si esos índices deberían de ser reconstruidos  
  • Actualizando estadísticas sobre las tablas que realizamos las consultas.

Veamos mas despacio de que estamos hablando: 

 

Reconstrucción de indices

El índice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una tabla por lo que se suelen usar sobre aquellos campos sobre los cuales se vayan a realizar búsquedas frecuentes dado que su  funcionamiento es similar al índice de un libro: guardando duplas de elemento que se desea indexar junyo a su posición en la base de datos, de modo que para buscar un elemento que esté indexado, sólo necesitamos que buscar en el índice de dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posición marcada por el índice.

Los índices pueden ser creados usando una o más columnas, preparando la base de datos tanto para búsquedas rápidas al azar como para ordenaciones eficientes de los registros.

Los índices son construidos sobre árboles B, B+, B* o sobre una mezcla de ellos, funciones de cálculo u otros métodos.

El espacio en disco requerido para almacenar el índice es típicamente menor que el espacio de almacenamiento de la tabla (puesto que los índices generalmente contienen solamente los campos clave de acuerdo con los que la tabla será ordenada, y excluyen el resto de los detalles de la tabla), lo que da la posibilidad de almacenar en memoria los índices de tablas que no cabrían en ella. En una base de datos relacional un índice es una copia de parte de una tabla.

La siguiente consulta SQL mostrará el tamaño en megabytes de un índice determinado, en nuestro caso del índice PK_FACTURACION_CODIGO perteneciente a la tabla FACTURACION y el campo CODIGO del ejemplo. La consulta SQL para mostrar el tamaño ocupado por un índice es la siguiente:

select segment_name, sum(bytes)/1024/1024 MB
from dba_extents
where segment_name = ‘INDICE DE EJEMPLO’
group by segment_name

 

 

Es importante periódicamente examinar y determinar qué índices son susceptibles de ser reconstruidos. Cuando un índice está descompensado puede ser porque algunas partes de éste han sido accedidas con mayor frecuencia que otras dando como resultado problemas de contención de disco o cuellos de botella en el sistema.

Normalmente reconstruimos un índice con el comando ALTER INDEX  (esta sentencia se utiliza para cambiar o reconstruir un índice existente en la base de datos).

Para poder ejecutar este comando el índice debe de estar en el propio esquema donde intentes ejecutarlo o deberías de tener el privilegio alter any index. También tenemos que tener en cuenta que para realizar la reconstrucción de un índice deberíamos de tener cuota suficiente sobre el tablespace que lo lanzamos.

Para reconstruir un índice bastaría con lazar la siguiente sentencia

ALTER INDEX <index_name> REBUILD;

Para reconstruir una partición de un índice podríamos hacer lo siguiente

ALTER INDEX <index_name> REBUILD PARTITION <nb_partition> NOLOGGING;

Nota: En algunos casos cuando alguno de los índices tiene algún tipo de corrupción no es posible reconstruirlo. La solución en este caso es borrar el índice y recrearlo

 

 

 

Actualización de estadísticas

Cuando una base de datos Oracle recibe una sentencia “SQL” para resolver una consulta, se llevan a cabo diversas acciones para lograr la entrega del resultado.

Dentro de los diversos pasos uno de los más importantes es el llevado a cabo por el optimizador basado en costos “Cost Based Optimizer o CBO”. Para que el “CBO” pueda determinar de forma exacta el plan de ejecución de para un “SQL Query” debe disponer de la información de las estadísticas de las tablas e índices que participan en el “SQL Query”, esta información comúnmente es conocida como «Optimizer statistics» “Estadisticas del optimizador”, la misma describe como esta compuesto y distribuido internamente el objeto.

Estas estadísticas son utilizadas por el optimizador para elegir el mejor plan de ejecución para cada instrucción SQL.

El tiempo necesario para colectar las estadísticas en algunos casos puede ser de gran medida. En el manejador se pueden utilizar diversos métodos para tratar de reducir el tiempo de esta tarea en la mayor proporción posible.

 

Es importante tener por tanto actualizadas las estadísticas de la base de datos. Para saber si las estadísticas se están lanzando correctamente podemos hacer una consulta sobre la tabla ALL_INDEXES en oracle 11  (en Oracle 10  es  dba_indexes )y ver el campo last_analyzed para observar cuando se ejecutaron sobre ese índice las estadísticas.

Nota: la columna “LAST_ANALYZED” la cual puede ser encontrada en vistas tales como: “DBA_TABLES”, “DBA_INDEXES”, “DBA_TAB_COL_STATISTICS” indica la fecha en que fue calculada la estadística para dicho objeto por ultima vez.

 

Como ejemplo  , si queremos  saber cuando fue la ultima vez que se ejecutaron estadísticas sobre todas las tablas perteneciente a un determinado esquema de BBDD  lanzaremos la siguiente consulta:

SELECT LAST_ANALYZED,table_name FROM ALL_INDEXES ;

 

 

Como vemos con las fechas podemos  hacernos una idea , de lo actualizado que están las estadisticas   sobre cada tabla   

Para actualizar las estadísticas de forma global para  un  esquema de BBDD,  podemos utilizar  el paquete DBM_STATS  de la la siguiente forma:

Execute DBMS_STATS.gather_schema_stats(‘Esquema’);

 

Una vez actualizadas las estadísticas de los índices de la base de datos lanzamos la siguiente consulta:

SELECT LAST_ANALYZED,table_name FROM ALL_INDEXES ;
SELECT index_name, blevel,
DECODE(blevel,0,'OK BLEVEL',1,'OK BLEVEL',2,
'OK BLEVEL',3,'OK BLEVEL',4,'OK BLEVEL','BLEVEL HIGH') OK
FROM dba_indexes where table_owner='DBPROD08';

 

Con esta sentencia obtendremos el nombre nombre del índice, el blevel y si es correcto este indice.

Los índices que deberíamos de reconstruir son los que en la columna ok aparecen como BLEVEL HIGH.

Blevel (branch level) es parte del formato del B-tree del índice e indica el número de veces que ORACLE ha tenido que reducir la búsqueda en ese índice. Si este valor está por encima de 4 el índice debería de ser reconstruido.

.