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

.

Cómo borrar cualquier aplicación en Android sin root


El proceso de rooteo de un terminal   destinado  a conceder permisos de super-usuario al usuario con el que se accede a  Androud esta destinado a usuarios un poco más avanzados y que saben lo que hacen, porque con una modificación del sistema incorrecta podemos dejar nuestro sistema corrupto pero en efecto una vez que tengamos acceso a root podemos suprimir aquellas aplicaciones que el fabricante haya pre-instalado    así como incluso algunas  propias de aplicaciones de Android   que vengan incluidas con el sistema operativo  y que no necesitamos ( por ejemplo  salvapantallas , animaciones , clientes de correo, etc. )  , lo cual   en muchos  casos nos permitirá  rebajar en gran medida  no  solo  la tasa de ocupación de la memoria interna    sino  también el numero de procesos que tenemos corriendo en nuestro terminal contribuyendo así a mejorar el rendimiento del terminal

Sin embargo como ya adelantábamos, no todo es perfecto al tener privilegios de root   , sobre todo cuando se desconocen los riesgos, pues llegar a este punto  también tiene sus inconvenientes :

  1. Se pierde la garantía: es decir ,realizando el proceso de root en el terminal e instalando las aplicaciones necesarias, se anula la garantía del fabricante ( a no ser  que el fabricante lo comercialice ya rooteado ) . Afortunadamente  no obstante el proceso de rooteo en casi todos los terminales es revertible.  

  2. Se pierden las actualizaciones vía OTA: Al hacer root estamos modificando el sistema, por lo que en los pasos previos a una actualización OTA se detectará que el sistema ha sido modificado, inhabilitando el servicio de actualización oficial. En algunos casos podrá llevar a cabo la actualización, pero lo más probable es que se elimine el root del terminal.

  3. Disminuye la seguridad del sistema: El fin principal de hacer root a un terminal es poder dar permisos de super-usuario ( es decir sin restricciones  )  a determinadas aplicaciones para que realicen cambios en el sistema lo cual puede generar bastantes problemas  cuando desde las propias aplicaciones se tiene acceso a todo el sistema de ficheros  y proceso en cursos sin limitaciones .

  4. Puede crear conflicto con algunas aplicaciones: Como cualquier modificación de software, este proceso puede entrar en conflicto con otras aplicaciones. 

  5. Inestabilidad del sistema: Aunque por norma general este proceso se realiza para mejorar el sistema, si no sabemos bien lo que hacemos podemos provocar mucha inestabilidad en el sistema, haciendo que este disminuya su rendimiento o aumente su uso de batería. Por ejemplo, si no prestamos atención al dar permisos podemos dotar de privilegios a una aplicación para que consulte nuestra ubicación constantemente, cualquier aplicación del tiempo por ejemplo, con lo que esto aumentará el uso de batería y disminuirá el rendimiento al tener constantemente un proceso realizando operaciones en nuestro sistema.

Vemos que rootear un terminal tiene  sus peligros , pero ¿y  si pudiésemos  tener las ventajas del rooteo   pero sin disminuir la seguridad,ni perder la garantía ni las actualizaciones?  Pues en efecto se puede  como a vamos a ver a  continuación  

 

Una de las utilidades  mas interesantes del rooteo es desinstalar aplicaciones que no podemos  quitar desde el propio dessistalador al estar incluidas enla rom del so  bien porque se han incluido por el propio fabricante o bien porque vengan incluidas en el propio SO

Para desistalar estas aplicaciones «especiales » vamos a necesitar la aplicación App Inspector, disponible gratis en la Google Play Store. Esta app sirve para inspeccionar las propiedades detalladas de todas las aplicaciones instaladas en su dispositivo. Estas propiedades están disponibles desde  PackageManager interno de Android, por lo general muchas de ellas no están expuestas por la interfaz de usuario por defecto del sistema (como el código de la versión, Target SDK versión, etc)  de modo que esta app es util  no solo para los desarrolladores   sino para  usuarios curiosos por igual.

 

Captura de pantalla

 

Al abrirla, entonces podremos ver el nombre de ‘paquete’ de cualquiera de las aplicaciones que estén instaladas en nuestro teléfono inteligente. Es decir, que lo que deberíamos hacer con ella es identificar cuál es el ‘nombre interno’ de la app pre-instalada de la que nos queremos deshacer. Y a partir de aquí podremos continuar.

Captura de pantalla

Esta interesante aplicación   incluso no  da acceso a información del bloatware preinstalado, para que sin necesidad de tener el móvil rooteado podemos  desinstalarlo   ,como vamos a  ver a continuación mediante la utilidad  adb

Si sólo necesita el ADB no hay necesidad de instalar el SDK completo pues es posible  instalar una versión versión mínima de dicha herramienta.

El  ADB es básicamente un software o programa de PC a través del cual se puede darle órdenes especiales al móvil, usando comandos de texto. Estos comandos incluyen órdenes básicas que se usan en el sistema Linux (copiar, pegar, mover, son algunos ejemplos) así como una variedad de comandos específicos para desarrolladores.

Los comandos ADB se pueden mandar al teléfono cuando el mismo está encendido/arrancado, y también cuando se encuentra en modo recovery. La herramienta ADB se puede utilizar para enviar comandos hacia dispositivos con y sin root.

Si tiene instalado Android Studio , este se instala por defecto  junto con el resto del software , pero  tendremos después que invocarlo o donde hayamos almacenado los archivos binarios de ADB, para lo cual pulsaremos Shift y clic derecho en la carpeta correspondiente, para que la consola de comandos se abra exactamente ahí.

Si no tiene el adb instalado , siga estos pasos:

  • Descargue la ultima versión disponible(en este momento la 1.4.3)   para 32 y 64 bits para Windows en el foro  de xda-developes http://forum.xda-developers.com/showthread.php?t=2317790.
  • Ejecute el instalador haciendo doble clic en  minimal_adb_fastboot_v1.4.3_setup.exe
  • Instale normalmente siguiendo las instrucciones.
  • Se instalara: en C:\Program Files (x86)\Minimal ADB and Fastboot
  • Al finalizar se abrirá la ventana a través de la cual podrás enviar los comandos a tu móvil.

 

Ahora tendremos que abrir nuestro ordenador, y con el móvil conectado por el cable USB, abriremos Símbolo del sistema mediante el comando  cmd

 Hecho esto, tendremos que irnos  a  la ruta  C:\Program Files (x86)\Minimal ADB and Fastboot     e   introducir el  comando :

  • adb shell pm disable-user –user 0  <package_to_disable>
  • package_to_disable>  : indica  el nombre de paquete de la aplicación que queremos eliminar de nuestro dispositivo  y que hemos conseguido con la aplicación App Inspector )

En el  siguinte ejemplo  con el citado comadno vamos a desactivar el instalador de facebook :

Ahroa en el caso de que quisiéramos recuperar unlistado de las aplicaciones que hemos deshabilitado siguiendo este método, entonces tendríamos que ejecutar el siguiente comando:

  • adb shell pm list packages -d

Con este  comando  se mostrarán las aplicaciones que han sido deshabilitadas , dpnde como vemos  donde ya se ha incluido el instalador de la app de facebook que desactivamos con el comando del ejemplo anterior:

Para habilitar  una app , el comando que tendríamos que ejecutar es el siguiente, sustituyendo , de nuevo, por el nombre de paquete que corresponda

  • adb shell pm enable

Algunos ejemplos  de  app que se pueden desinstalar o congelar sin peligro:

  • Calculadora: No es necesaria, aunque tal vez si la borra  nos convenga en otro momento  instalar otra  alternativa.
  • Calendario: Igual que la calculadora, esta aplicación no afectará al funcionamiento de tu smartphone.
  • Cámara: La aplicación de Cámara no supondría ningún problema para su terminal para  ser desinstalada, pero   personalmente nunca la eliminaria  puesto que si desistalamos no podremos acceder a la cámara.
  • Correo: Si no le interesa el cliente de correo nativo de Android siempre podemos desinstalarlo y con ello liberarnos memoria interna, Sobre todo tiene sentido cuando usamos otros gestores de correo como gmail o el propio outlook  para este cometido.
  • Fondos Animados: Esta es una de las funciones que, personalmente, veo más inútiles. Mediante estos desinstaladores podremos borrar los fondos animados, aunque no vienen todos en un pack. Algunos de estos fondos son: Burbujas, Agujero Negro, Humo Mágico o Phase Beam. Dependiendo del dispositivo y del fabricante  incluso puede haber muchos más.
  • Galería: si utilizá alguna alternativa, como Quickpic, tal vez no necesita la galería por defecto (o la que os haya instalado el fabricante).
  • Gmail: Por la misma razón  que exponíamos anteriormente con el cliente de correo nativo , si no le interesa el cliente de correo de Google puede desinstalarlo sin problemas.
  • Google+: Esta red social de Google cada  vez tiene menos adeptos desde que Google decidió dejarla  solo para  clientes empresariales.     Sin duda , si no es un lciemte empresarial , lo mejor  es desinstalarla.
  • Google Chrome: Si sois usuarios de otros navegadores, tal vez no queráis tener en vuestro smartphone el navegador de Google.
  • Google Maps: Se puede borrar sin que tenga ningún efecto en el rendimiento del terminal.La aplicación de mapas de Google  está rastreando la ubicación todo el tiempo, para lanzar notificaciones cuando se acerca a un sitio u otro  por lo que su so en primer plano consume muchísima batería, y en segundo plano, si tiene el GPS activado, también
  • Google Play: Google Play y sus diversas aplicaciones (Music, Libros, Kiosco, Películas y Games) se pueden desinstalar sin efectos graves, aunque siempre es recomendable tener una tienda alternativa.
  • StreetView: Si hemos borrado Google Maps esta app no nos servirá para nada puesto que es complementaria.
  • YouTube: La aplicación de YouTube no afecta en nada al sistema.
  • Google Calendar: La aplicación de calendario de Google no deja de sincronizar en segundo plano, y además sabe perfectamente qué estás haciendo, cuándo y dónde lo estás haciendo. La única forma de limitarlo es o bien desactivando la sincronización automática o deshabilitándola / desinstalándola.
  • Google Now:La aplicación de Google es el asistente virtual que, hasta que llegue Google Assistant, hay instalado en todos los terminales. Dicha app no deja de actualizarse en segundo plano, obteniendo información del tráfico, del tiempo, noticias, información de interés… Eso consume muchísima batería sin que nos demos cuenta. Si no usas el desbloqueo por voz o no eres demasiado fan de Google Now, no pierdes nada por desinstalarla de tu terminal.
  • Google Photos:Aunque es una de las apps más útiles que nos podemos encontrar en el panorama Android, la aplicación de sincronización en la nube y galería de Google consume muchísima batería. Cada vez que hacemos una foto o un vídeo y estamos conectados a una red WiFi, Google Fotos se pone a sincronizar en segundo plano y a subir todos los nuevos archivos a la nube. Si no la tenemos bien configurada, puede llegar a consumir mucha batería. Sobre todo , si no se hace uso de su servicio, lo mejor es deshabilitarla o desistalarala