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:
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.
Node.js framework fue creado por Bocoup para controlar placas de desarrollo en una configuración de host-cliente aunque realmente su uso mayoritario sea como plataforma web siendo Johnny-Five la plataforma open source de Robótica e IoT de JavaScript
En realidad existen diferentes plataformas donde se puede ejecutar el programa Johnny-Five :
En un entorno Linux a bordo: beagleBone Black,Chip,Intel Galileo gen 1,Intel Galileo Gen 2,Intel Edison Arduino,Intel Edison Mini, SparkFun Edison GPIO Block,SparkFun Arduino Block, Intel Joule 570x (Carrier Board),Linino One,pcDuino3 Dev Board,Raspberry Pi 3 Model B, Raspberry Pi 2 Model B. Raspberry Pi Zero,Raspberry Pi Model A Plus,Raspberry Pi Model B Plus, Raspberry Pi Model B Rev 1, Raspberry Pi Model B Rev 2, Tessel 2
En una máquina host conectada (a través de Serial USB o Ethernet) a un cliente.: Arduino Uno,SparkFun RedBoard, On a host machine communicating over Bluetooth to the client. Arduino Uno,Arduino Leonardo, Arduino Mega, Arduino Fio,Arduino Micro,Arduino Mini,arduino Nano,Arduino pro Mini,Boatduino,chipKit uno32,Spider robot Controller,DfRobot Romeo,Teensy 3,
En una máquina host que se comunica por wifi al cliente: Electric Imp April, pinoccio Scout, Particle Core ( Spark Core) ,Particle Photon, Sparkfun Photon RedBoard
En una máquina host que se comunica a través de Bluetooth al cliente :Blend Micro v1.0,LightBlue bean,
Johnny-Five como vemos hacer un énfasis especial en la robótica, pero tambien puede hacer muchas cosas diferentes con el software.De hecho ha existido durante hacer más tiempo que la mayoría de los marcos de JavaScript para hardware . Ademas iene una API clara y «fresca» ,ambas cosas ideales para los principiantes de hardware.
Lanzado porBocoup en 2012, Johnny-Five esta mantenido por una comunidad de desarrolladores de software apasionados e ingenieros de hardware. De hecho más de 75 desarrolladores han hecho contribuciones para construir un ecosistema robusto, extensible y muy versatil.
Hola Mundo!
A los microcontroladores y las plataformas SoC nos gusta decir «Hola mundo» con un simple LED parpadeante, así que veamos en primer lugar un ejemplo como lo hariamos usando el Ide clásico de Arduino
Como vemos en la imagen ,conectaremos un led entre el pin 13 y masa , respetando la polaridad (el ánodo al pin13 y el cátodo o pin corto a masa )
Para hacer destellear el citado led, estos son los pasos básicos que tenemos que seguir en nuestro sketch programandolo desde el IDE de Arduino:
Configurar el pin 13 (con LED incorporado) como una SALIDA
Establecer el pin 13 ALTO para encender el LED
Esperamos 500 ms (medio segundo)
Establecer el pin 13 BAJO para apagar el LED
Y este es el código completo para ejecutar desde el Ide de Arduino:
Y ahora vamos a ver el mismo ejemplo , pero ejecutandolo en Javascript por medio de node-js,
Desgraciadamente si usamos un Arduino o alguno de sus variantes (Arduino Uno,SparkFun RedBoard, On a host machine communicating over Bluetooth to the client. Arduino Uno,Arduino Leonardo, Arduino Mega, Arduino Fio,Arduino Micro,Arduino Mini,arduino Nano,Arduino pro Mini,Boatduino,chipKit uno32,Spider robot Controller,DfRobot Romeo,Teensy 3,) necesitaremos que el programa JavaScript se ejecute en una máquina host que ejecute Node.js. de modo que el programa transmitirá instrucciones básicas de E / S a la placa a través de una interfaz serie USB , que actuara como un cliente ligero .
El método host-cliente implica la comunicación a través de una API común entre el host y el cliente. El marco Node.js usado con Arduino y placas similares , Johnny-Five, se comunica (de forma predeterminada) con las placas utilizando un protocolo llamado Firmata, protocolo que permite que los hosts (computadoras) y los clientes (microcontroladores) intercambien mensajes de ida y vuelta en un formato basado en mensajes MIDI. El protocolo Firmata especifica cómo deben ser esos mensajes de comando y datos. La implementación de Firmata de Arduino proporciona el firmware real que puede poner en su tablero para hacer que «hable» Firmata. Toma la forma de un boceto de Arduino que sube al tablero.
Firmata es lo suficientemente popular como para que los bocetos de Firmata que necesita vengan empaquetados con el IDE de Arduino asi que bastara con subir este a Arduino una única vez ya que el código javascript correra en el host usando node.js.
Puede seguir estos pasos para cargar el interfaz correcto de Firmata en su Arduino para que se pueda utilizar como cliente en una configuración de host-cliente:
Resumidamente estos son los pasos previos para ejecutar el mismo ejemplo del led parpadeante que hemos visto pero en javascript en una placa Arduino;
En primer lugar conectar su Arduino mediante USB a su ordenador
Lanzar el IDE de Arduino.
Asegurarse que esta configurada la version de su placa, así como el puerto COM virtual al que esta conectado
Acceda al menú Archivo> Ejemplos> Firmata
Seleccione StandardFirmataPlus de la lista y despliegue este sw sobre su Arduino
Ahora Instale Node.js en su pc . Funciona con ultima version 11.3.0 de 64 bit que incluye npm 6.4 (no olvidar de chequear que se instalen otros componentes )Este es el link de descarga https://nodejs.org/en/download/
En la instalación de Node.js, repetimo no debemos olvidar de chequear que se instalen otros componentes pues con ellos se instalara automáticamente
Visual Studio Express 2010 de 32 bits (con las dependencias de C ++)
El comando npm
Alternativamente si dispusiésemos de npm podríamos instalar ambos entornos con npm --add-python-to-path install --global --production windows-build-tools
Este pasos anterior ( instalacion de componentes ) es innecesario si chequeamos en la instalación de node.js pues se instalaran esos componentes automáticamente
Ya puede crear su primer proyecto Johnny-Five, por lo que en primer lugar cree un directorio para él e instale el paquete framework npm, como se muestra en la siguiente lista:
< mkdir hello-world
< cd hello-world
< npm install johnny-five
Ejecute el comando «npm install johnny-five» desde la carpeta del proyecto
Ya por fin podemos crear el fichero javascript con su editor de texto que contendrá el código en javascript .
Realmente estos son los pasos que tenemos que seguir:
Requerir el paquete johnny-five
Inicializar un nuevo objeto Board que represente a su placa .
Esperar a que el tablero dispare el evento listo
Crear una instancia de un objeto LED en el pin 13 (el pin LED incorporado de Uno)
Hacer que el LED parpadee cada 500 ms
Este es el código en js :
const five = require(‘johnny-five’); const board = new five.Board(); board.on(‘ready’, () => { const led = new five.Led(13); led.blink(500); });
Guarde el archivo como hello-world.js y conecte su Arduino a un puerto USB en su ordenador si aún no está conectado.
En una terminal de windows vaya al directorio del proyecto y ejecute este comando:
<node hello-world.js
Verá una salida como la siguiente en su terminal ejecutando hello-world.js en una terminal
Si el LED incorporado parpadea ,!enhorabuena ! !acaba de controlar una placa Arduino con JavaScript! ¿a que es realmente sencillo?.
Aunque en el caso de la familia Arduino tiene la innegable penalización de necesitar un host para operar , la ventajas de este modelo son evidentes pues no tenemos que estar constantemente compilando y subiendo el sketch con el ide de Arduino ya que el programa corre en host . Ademas podemos usar un simple editor de texto para cambiar el código en javascript fácilmente
Asimismo el lenguaje javascript ha ido evolucionando hasta un ritmo que no podemos imaginar incluyendo muchas características que no son soportadas de forma directa desde Arduino
Por ultimo mencionar la autentica potabilidad del código , pues el código que hemos visto en el ejemplo podremos usarlos en múltiples plataformas tan diferentes como Raspberry pi, Intel Edison , etc usando siempre el mismo código fuente aun siendo soportado por placas muy diferentes ¿ a que es interesante?
Placas soportadas
Johnny-Five ha sido probado con una variedad de tableros compatibles con Arduino .
Para los proyectos que no están basados en Arduino, los complementos de IO específicos de la plataforma están disponibles. Los complementos IO permiten que el código Johnny-Five se comunique con cualquier hardware en cualquier idioma que la plataforma hable.
Como comentábamos existen diferentes formas de ejecutar el programa Johnny-Five segun la placa:
En un entorno Linux a bordo: beagleBone Black,Chip,Intel Galileo gen 1,Intel Galileo Gen 2,Intel Edison Arduino,Intel Edison Mini, SparkFun Edison GPIO Block,SparkFun Arduino Block, Intel Joule 570x (Carrier Board),Linino One,pcDuino3 Dev Board,Raspberry Pi 3 Model B, Raspberry Pi 2 Model B. Raspberry Pi Zero,Raspberry Pi Model A Plus,Raspberry Pi Model B Plus, Raspberry Pi Model B Rev 1, Raspberry Pi Model B Rev 2, Tessel 2) , Es facil adivinar qeu este es el mabiente ideal pues dentro de la placa se oprtan tanto el host como el cliente por lo qeu no ncesitamos conectarnos con otro dispositivo
En una máquina host conectada (a través de Serial USB o Ethernet) a un cliente.: Arduino Uno,SparkFun RedBoard, On a host machine communicating over Bluetooth to the client. Arduino Uno,Arduino Leonardo, Arduino Mega, Arduino Fio,Arduino Micro,Arduino Mini,arduino Nano,Arduino pro Mini,Boatduino,chipKit uno32,Spider robot Controller,DfRobot Romeo,Teensy 3,
En una máquina host que se comunica por wifi al cliente.: Electric Imp April, pinoccio Scout, Particle Core ( Spark Core) ,Particle Photon, Sparkfun Photon RedBoard
En una máquina host que se comunica a través de Bluetooth al cliente :Blend Micro v1.0,LightBlue bean,
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las extensiones STEPPER_* cuando se usa con AdvancedFirmata o ConfigurableFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las extensiones STEPPER_* cuando se usa con AdvancedFirmata o ConfigurableFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las extensiones STEPPER_* cuando se usa con AdvancedFirmata o ConfigurableFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las extensiones STEPPER_* cuando se usa con AdvancedFirmata o ConfigurableFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las extensiones STEPPER_* cuando se usa con AdvancedFirmata o ConfigurableFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere amarre.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las extensiones STEPPER_* cuando se usa con AdvancedFirmata o ConfigurableFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tethering.
Plataforma específica
Eche un vistazo a chipkit.net!
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las STEPPER_* cuando se utilizan con AdvancedFirmata o ConfigurableFirmat .
Los pines digitales 26-41 y los pines analógicos A6-A11 actualmente no son compatibles con StandardFirmataPlus, a la espera de una actualización de la definición de pines en Boards.h
Esta bifurcación tiene los cambios relevantes y debe cargarse en el tablero a través del IDE proporcionado por chipKit
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere tetehering.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las extensiones STEPPER_* cuando se usa con AdvancedFirmata o ConfigurableFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere amarre.
Plataforma específica
Admite la extensión PING_READ , cuando se usa con PingFirmata .
Admite las extensiones STEPPER_* cuando se usa con AdvancedFirmata o ConfigurableFirmata .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a la placa a través de una serie USB , que actúa como un cliente ligero .Requiere amarre.
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a través de Bluetooth a la placa, que actúa como un cliente ligero .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a través de WiFi a la placa, que actúa como un cliente ligero .
Plataforma específica
Requiere una conexión WiFi conectada a Internet y está sujeto a la limitación de la tasa de solicitud por parte del servidor de Electric Imp API.
El programa JavaScript se ejecuta directamente a bordo, en un entorno Linux que ejecuta Node.js.
Plataforma específica
El hardware es capaz de soportar solo 4 salidas PWM. Como resultado, los enlaces nativos no admiten PWM en los pines 10 y 11.
Aunque Galileo-io / Edison-io / Joule-io todavía no admite comunicaciones en serie, puede enlazar a / dev / ttyFMD1 en la placa Edison Arduino usando el módulo serialport .
El programa JavaScript se ejecuta directamente a bordo, en un entorno Linux que ejecuta Node.js.
Plataforma específica
Este bloque no utiliza enlaces mraa nativos. Por favor, vea el Bloque Arduino de SparkFun Edison , en el repositorio de Galileo-IO , para obtener ayuda para comenzar.
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a través de Bluetooth a la placa, que actúa como un cliente ligero .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a través de WiFi a la placa, que actúa como un cliente ligero .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a través de WiFi a la placa, que actúa como un cliente ligero .
Plataforma específica
Los temporizadores se comparten en grupos: Temporizador 2: A0 , A1 , Temporizador 3: A4 , A5 , A6 , A7 , Temporizador 4: D0 , D1
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a través de WiFi a la placa, que actúa como un cliente ligero .
El programa JavaScript se ejecuta en una máquina host que ejecuta Node.js. El programa transmite instrucciones básicas de E / S a través de WiFi a la placa, que actúa como un cliente ligero .
Debe estar conectado para enviar un comentario.