Bases de Datos en Oracle
Bases de Datos en Oracle
Bases de Datos en Oracle
PRESENTADO POR
ID: 593892
PRESENTADO A
NRC: 6672
BOGOTA D.C
8 DE MAYO 2019
1. Describa las unidades lógicas de almacenamiento utilizadas por Oracle. Dé un
ejemplo de cómo Oracle almacenaría una tabla que usted desea crear y cómo puede
optimizar el acceso a la información de dicha tabla usando parámetros de
almacenamiento. TABLESPACE, DATAFILE, EXTENDS, SEGMENTOS,
BLOQUES…
Una base de datos Oracle es una colección de datos tratada como una unidad. El propósito
general es almacenar y recuperar información relacionada.
Una instancia Oracle consta de una estructura de memoria, llamada Área Global del Sistema
(SGA), y de unos procesos background utilizados por el servidor Oracle para manejar una
base de datos. Cada instancia Oracle puede abrir y utilizar sólo una base datos en cualquier
punto y momento.
Figura 1
Estructura lógica
Esquemas y objetos del esquema:
Un esquema es una colección de objetos de la base de datos. Los objetos del esquema son
estructuras lógicas que hacen referencia directa a datos de la base de datos (tablas, vistas,
secuencias, procedimientos almacenados, sinónimos, índices, clusters y enlaces con otras
bases de datos).
b. Data Base:
Es un conjunto de datos que tienen un representan una información captada del mundo real,
con ellos se puede realizar diversos procesos.
TABLESPACE
Un tablespace es un almacén lógico de los ficheros de la base de datos. Cada tablespace posee
uno o varios ficheros (datafiles) donde almacena toda la información; estos ficheros deben
tener una estructura lógica.
Cuando se crea una base de datos, hay que crear al menos un tablespace, que por defecto es
SYSTEM. Igualmente, cuando se crea un tablespace, se debe indicar al menos un datafile que
formará parte de este datafile (posteriormente se pueden añadir más datafiles del tablespace).
El datafile es un fichero físico al que tendremos que asignar un directorio, un nombre y un
tamaño inicial que posteriormente se podrá ampliar según las necesidades (y de las
limitaciones) de la instalación. Este tablespace es el que contendrá la información de los
usuarios SYS y SYSTEM que son los usuarios que tienen la información necesaria para que
funcione la base de datos.
Por tanto, el tablespace SYSTEM es una pieza clave para el buen funcionamiento de nuestra
base de datos, por lo que es una buena práctica crear el menos otro tablespace donde
almacenar el resto de usuarios que vayamos creando en nuestra base de datos. Podría
ahorrarnos:
– Un bloqueo completo de la base de datos si ocurre algo grave al tablespace SYSTEM.
– Llenar el tablespace SYSTEM pudiendo provocar la parálisis de toda la base de datos.
El uso de múltiples espacios de tablas le permite una mayor flexibilidad para realizar
operaciones de base de datos. Cuando una base de datos tiene múltiples espacios de tabla,
puede:
- Separe los datos de usuario de los datos del diccionario de datos para reducir la
contención de E / S.
- Separe los datos de una aplicación de los datos de otra para evitar que varias
aplicaciones se vean afectadas si se debe desconectar un espacio de tablas.
- Almacene diferentes archivos de datos de diferentes espacios de tabla en diferentes
unidades de disco para reducir la contención de E / S.
- Desconecte los espacios de tablas individuales mientras otros permanecen en línea, lo
que proporciona una mejor disponibilidad general.
- Optimice el uso del espacio de tablas reservando un espacio de tablas para un tipo
particular de uso de base de datos, como actividad de alta actualización, actividad de
solo lectura o almacenamiento temporal de segmentos.
- Copia de seguridad de espacios de tabla individuales.
– Borrar un tablespace:
drop tablespace TEST;
* Otros usos de tablespace:
– Estado de un tablespace:
Un tablespace puede estar online u offline, esto indica si se puede operar con él o no. Para
conocer el estado de un tablespace se puede consultar con la siguiente sentencia:
select tablespace_name, status from dba_tablespaces;
DATA FILE
Los datafiles son los ficheros físicos en los que se almacenan los objetos que forman parte de
un tablespace. Un datafile pertenece solamente a un tablespace y a una instancia de base de
datos. Un tablespace puede estar formado por uno o varios datafiles. Cuando se crea un
datafile, se debe indicar su nombre, su ubicación o directorio, el tamaño que va a tener y el
tablespace al que va a pertenecer. Además, al crearlos, ocupan ya ese espacio aunque se
encuentran totalmente vacíos, es decir, Oracle reserva el espacio para poder ir llenándolo
poco a poco con posterioridad. Por supuesto, si no hay sitio suficiente para crear un fichero
físico del tamaño indicado, se producirá un error y no se creará dicho fichero.
EXTEND
es uno de los métodos de colección de Oracle PL / SQL que se utiliza con tablas anidadas y
VARRAYS para agregar elementos únicos o múltiples a la colección. Tenga en cuenta que
EXTEND no se puede utilizar con matrices asociativas. EXTEND tiene tres formas:
EXTEND, que agrega una sola instancia NULL.
EXTEND ( n ) que agrega múltiples instancias NULL. El número de instancias se especifica
mediante n .
EXTENDER ( n, m ) que adjunta n copias de la instancia m a la colección.
Ejemplo:
DECLARE
TYPE PSOUG_TAB IS TABLE OF NUMBER;
PTAB PSOUG_TAB;
BEGIN
PTAB := PSOUG_TAB();
PTAB.EXTEND;
PTAB(1) := 100;
DBMS_OUTPUT.PUT_LINE('VALUE AT INDEX(1) IS '||PTAB(1));
PTAB.EXTEND(5,1);
DBMS_OUTPUT.PUT_LINE(´VALUE AT INDEX(4) IS '||PTAB(4));
END;
VALUE AT INDEX(1) IS 100
VALUE AT INDEX(4) IS 100
Segment:
Un segmento almacena la información de una estructura lógica de Oracle dentro de un
Tablespace. Está formado por una o más extensiones y, a medida que va creciendo el
segmento se van asignando nuevas extensiones al mismo. Hay cuatro tipos de segmentos: de
datos, de índices, temporales y de rollback.
Tendremos segmentos de datos para tablas o clusters, segmentos de índices para índices,
segmentos de rollback para poder deshacer o rehacer cambios por transacciones y segmentos
temporales.
Un segmento de datos es el lugar donde se almacenan todos los datos de una tabla que no esté
particionada o que no forme parte de un cluster, de una partición de una tabla particionada o,
de un cluster de tablas. Se crea el segmento de datos a la hora de ejecutar la sentencia create
que crea la tabla, cluster o partición. En dicha sentencia se indican también los valores de la
cláusula storage, en el cuál se va a determinar la forma en que dicho segmento va a ir
asignando y designando las extensiones.
El nivel de almacenamiento de base de datos lógica por encima de un punto que se llama un
segmento. Un segmento de es un conjunto de extensiones asignadas a una estructura lógica
determinada. Por ejemplo, los diferentes tipos de segmentos incluyen los siguientes:
· Data Segment
Cada uno no agrupado tabla tiene un segmento de datos. Todos los de la tabla de los datos se
almacenan en las extensiones de su segmento de datos. Cada grupo tiene un segmento de
datos. Los datos de cada tabla en el grupo son almacenados en el segmento de datos del
cluster.
· Index Segment
Cada índice tiene una serie de sesiones de índice que almacena todos sus datos.
· Rollback Segment
Uno o más segmentos rollback son creados por la base de datos administrador de una base de
datos para almacenar temporalmente "deshacer" la información. Esta información se utiliza:
· para generar la información base de datos de lectura consistente
· durante la recuperación de la base de datos comprometido a revertir las transacciones
para los usuarios.
· Temporary Segment
Se crean cuando un Oracle SQL declaración de las necesidades de un área de trabajo
temporal para completar la ejecución.
Cuando la instrucción termine su ejecución, el temporal use extensiones segmento son
devueltos al sistema para su uso futuro.
Oracle asigna dinámicamente el espacio, cuando las extensiones existentes de un segmento se
lleno. Por lo tanto, cuando las extensiones existentes de un segmento están llenas asigna otra
medida de ese segmento, según sea necesario. Debido a que las extensiones están asignadas
como necesarias, las extensiones de un segmento pueden o no ser contiguo en el disco.
SEGMENTOS
Un segmento almacena la información de una estructura lógica de Oracle dentro de un
Tablespace. Está formado por una o más extensiones y, a medida que va creciendo el
segmento se van asignando nuevas extensiones al mismo. Hay cuatro tipos de segmentos: de
datos, de índices, temporales y de rollback.
BLOQUES
Un bloque es la unidad mínima de almacenamiento de información de Oracle. A los bloques
también se les conoce como "bloques de datos", "bloques lógicos" o "bloques oracle". Cada
uno de estos bloques está formado por un número determinado de bloques del sistema
operativo. A la hora de crear una nueva base de datos se debe indicar cuántos bloques de
sistema operativo formarán un bloque de datos o bloque oracle. Es muy importante decidir
bien este valor de antemano ya que una vez creada la base de datos ya no se puede modificar
más que en migraciones a versiones más actuales del producto.
Un bloque de datos es la mínima unidad de Lectura / Escritura en una base de datos Oracle,
es decir, Oracle no lee y escribe en bloques del sistema operativo sino que lo hace en
unidades lógicas que son los bloques de datos y que varían de una base de datos a otra en la
misma máquina ya que es un valor que se debe indicar en la creación de cada base de datos
Oracle.
Oracle recomienda que el tamaño de un bloque de datos o, data block, sea siempre un
múltiplo del bloque de datos del sistema operativo.
PL/SQL es un lenguaje estructurado con bloques. Un bloque PL/SQL es definido por las
palabras clave DECLARE, BEGIN, EXCEPTION, y END, que dividen el bloque en tres
secciones
1. Declarativa: sentencias que declaran variables, constantes y otros elementos de código, que
después pueden ser usados dentro del bloque
2. Ejecutable: sentencias que se ejecutan cuando se ejecuta el bloque
3. Manejo de excepciones: una sección especialmente estructurada para atrapar y manejar
cualquier excepción que se produzca durante la ejecución de la sección ejecutable
Sólo la sección ejecutable es obligatoria. No es necesario que usted declare nada en un
bloque, ni que maneje las excepciones que se puedan lanzar.
Un bloque es en sí mismo una sentencia ejecutable, por lo que se pueden anidar los bloques
unos dentro de otros.
El clásico “¡Hola Mundo!” es un bloque con una sección ejecutable que llama al
procedimiento DBMS_OUTPUT.PUT_LINE para mostrar texto en pantalla:
BEGIN
DBMS_OUTPUT.put_line('¡Hola Mundo!');
END;
Las funciones y procedimientos —tipos de bloques con un nombre— son discutidos con
mayor detalle más adelante en este artículo, así como los paquetes. En pocas palabras, sin
embargo, un paquete es un contenedor de múltiples funciones y procedimientos. Oracle
extiende PL/SQL con muchos paquetes incorporados en el lenguaje.
El siguiente bloque declara una variable de tipo VARCHAR2 (un string) con un largo
máximo de 100 bytes para contener el string ‘¡Hola Mundo!’. Después, el procedimiento
DBMS_OUTPUT.PUT_LINE acepta la variable, en lugar del literal, para desplegarlo:
DECLARE
l_mensaje VARCHAR2(100) := '¡Hola Mundo!';
BEGIN
DBMS_OUTPUT.put_line(l_mensaje);
END;
Note que he llamado a la variable l_mensaje. Normalmente uso el prefijo l_ para variables
locales —variables definidas dentro del código de un bloque— y el prefijo g_ para variables
globales definidas en un paquete.
El siguiente ejemplo de bloque agrega una sección de manejo de excepciones que atrapa
cualquier exception (WHEN OTHERS) que pueda ser lanzada y muestra el mensaje de error,
que es retornado por la función SQLERRM (provista por Oracle).
DECLARE
l_mensaje VARCHAR2(100) := '¡Hola Mundo!';
BEGIN
DBMS_OUTPUT.put_line(l_mensaje);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line(SQLERRM);
END;
DECLARE
l_mensaje VARCHAR2(100) := '¡Hola';
BEGIN
DECLARE
l_mensaje2 VARCHAR2(100) := l_mensaje || ' Mundo!';
BEGIN
DBMS_OUTPUT.put_line(l_mensaje2);
END;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
END;
"un sistema manejador de base de datos, es un sistema computacional cuya finalidad general
es almacenar información y permitir a los usuarios recuperar y actualizar esa información con
base en peticiones. La información en cuestión puede ser cualquier cosa que sea de
importancia para la empresa u organización; es decir, todo lo que sea necesario como auxiliar
en el proceso general de su administración." (Date, 2001).
"Se puede definir el Sistema Manejador de Base de Datos (SMBD) como un conjunto
coordinado de programas, procedimientos, lenguajes, etc., que suministra a los distintos tipos
de usuarios los medios necesarios para describir y manipular los datos almacenados en la
base, garantizando su seguridad." (Miguel y Piattini, 1999).
la finalidad de un sistema manejador de bases de datos es establecer las adecuadas interfaces
entre ésta y los diferentes tipos de usuarios (diseñadores, administradores, analistas,
programadores y usuarios finales). También podemos afirmar que las operaciones típicas que
debe realizar un SMBD pueden resumirse en aquellas que afectan a la totalidad de los datos y
las que tienen lugar sobre registros concretos.
Función de manipulación
La función de manipulación nos permite consultar la base de datos, ya sea la totalidad de la
información o por partes. También nos permite realizar actualizaciones (inserción, borrado y
modificación). En general, podemos observar que la función de manipulación permite a los
usuarios de la base, informáticos o no, buscar, añadir, suprimir o modificar los datos de la
misma, siempre de acuerdo con las especificaciones y normas de seguridad dictadas por el
administrador (DBA).
La función de control reúne todas las interfaces que necesitan los diferentes usuarios para
comunicarse con la base de datos y proporciona un conjunto de procedimientos para el
administrador. Las exigencias o necesidades de cómo utilizar la base de datos son diferentes,
según los tipos de procesos y según los usuarios. De manera especial, esta función debe
integrar una serie de instrumentos que faciliten las tareas del administrador.
El motor de la base de datos acepta peticiones lógicas de los otros subsistemas del SGBD, las
convierte en su equivalente físico y accede a la base de datos y diccionario de datos en el
dispositivo de almacenamiento.
El subsistema de definición de datos ayuda a crear y mantener el diccionario de datos y
define la estructura del fichero que soporta la base de datos.
El subsistema de manipulación de datos ayuda al usuario a añadir, cambiar y borrar
información de la base de datos y la interroga para extraer información. El subsistema de
manipulación de datos suele ser el interfaz principal del usuario con la base de datos. Permite
al usuario especificar sus requisitos de la información desde un punto de vista lógico.
El subsistema de generación de aplicaciones contiene utilidades para ayudar a los usuarios en
el desarrollo de aplicaciones. Usualmente proporciona pantallas de entrada de datos,
lenguajes de programación e interfaces.
El subsistema de administración ayuda a gestionar la base de datos ofreciendo
funcionalidades como almacenamiento y recuperación, gestión de la seguridad, optimización
de preguntas, control de concurrencia y gestión de cambios.
3. Los índices se usan para mejorar el rendimiento de las operaciones sobre una tabla.
En general mejoran el rendimiento las SELECT y empeoran (mínimamente) el rendimiento
de los INSERT y los DELETE.
Una vez creados no es necesario nada más, oracle los usa cuando es posible (ver EXPLAIN
PLAN).
En oracle existen tres tipos de índices:
TABLE INDEX
en la mayoría de los casos los sistemas gestores de bases de datos generan un índice
automáticamente para los valores de las tablas que se indican como llaves primaria.
de tal manera que si se tiene la siguiente estructura con los siguientes campos para la
siguiente tabla
Usuarios:
Id
Nombre
Fecha_Nacimiento
Teléfono
Normalmente se opta por asignar la clave primaria al Id, de tal manera que este se creará
también como un índice que a su vez también es único.
4. ¿Qué criterios deben analizarse para optar por el uso de un índice?
• Si al acceder a una tabla la consulta visita un número pequeño de bloques (sobre el total de
bloques que componen la tabla) filtrando por la(s) columna(s) que compongan) el índice. A
este concepto se le denomina selectividad de bloque que debe prevalecer sobre el de
selectividad de columna.
• Para mejorar el rendimiento de las joins sobre varias tablas, indexar las columnas empleadas
en la join. Las FKs han de indexarse siempre salvo que se cumplan TODOS los siguientes
supuestos:
• Todas las tablas sin excepción (sean pequeñas o grandes) deberían tener una PK y por tanto
al menos un índice. La creencia de que una tabla pequeña no necesita índices para acceder a
ella puede llevar a un volumen desorbitado de lecturas lógicas si dicha tabla es accedida
frecuentemente por la aplicación. Si una columna no selectiva es la más frecuentemente
utilizada n sentencias sobre tablas grandes, posiblemente sería necesario revisar el diseño de
la aplicación o de los datos.
Si una columna muy selectiva no es muy usada en las condiciones de sentencias, sólo es
recomendable crear un índice sobre ella si se trata de una foreign key. Para determinar que
columnas son candidatas (siempre teniendo en cuenta el concepto de selectividad de bloque):
• Las columnas que, aunque contengan valores nulos, las consultas solicitan todas las filas
que contienen valores pueden ser indexadas. En el caso de que se observe que el índice no es
utilizado cuando se realizan consultas del tipo WHERE COL_X IS NOT NULL y se esté
absolutamente seguro de que debería ser utilizado, se recomienda emplear la siguiente
sintaxis WHERE COL_X > - 9,99 * POWER (10,25) como solución temporal. No son
candidatas a indexar, en principio, las siguientes columnas:
• Las columnas con tipos LONG y LONG RAW no pueden ser indexadas.
El orden de las columnas al crear un índice puede afectar de forma notable al rendimiento.
Normalmente, se deben especificar las columnas más utilizadas en las consultas. Si por
ejemplo se crea un índice para acelerar las consultas sobre las columnas COL_A, COL_B y
COL_C, las consultas deberían acceder a COL_A, a COL_A y COL_B. Si accede a COL_B,
a COL_C o a COL_B y a COL_C, el índice podría no llegar a utilizarse aunque el camino de
acceso INDEX SKIP SCAN (introducido en 9i) permitiría utilizarlo. Será el CBO el que
determine la idoneidad de su uso.
A pesar de que una tabla soporta múltiples índices, hay que tener en cuenta que esto llevaría
una sobrecarga adicional, sobre todo en operaciones de INSERT y DELETE, dado que todos
los índices de la tabla deben ser actualizados junto con la tabla (se debe tener en cuenta
también que si se actualiza la tabla, los índices implicados deben ser actualizados también).
Por lo tanto, se debe tener muy en cuenta el tipo de transacciones que se van a lanzar contra
la tabla, la naturaleza de la misma; si una tabla se usa básicamente para consultas o es una
tabla read-only, el tener varios índices puede ser efectivo. Si, por el contrario, la tabla es
modificada de forma frecuente y pesada, será preferible que tenga un número menor de
índices.
En resumen, se deberán crear todos los índices que sean necesarios pero siendo su número tan
limitado como sea posible.
Si se tienen varias columnas muy selectivas, podemos pensar en crear varios índices, cada
uno de ellos con una columna, si las consultas de nuestra aplicación tienen condiciones de
igualdad para esas columnas unidas por AND. Por ejemplo, para sentencias del tipo
Podría interesar tener dos índices, uno para cada columna. El plan de ejecución sería el
siguiente:
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 20 | 2280 | 10 |
| 1 | TABLE ACCESS BY INDEX ROWID | EMP | 20 | 2280 | 10 |
| 2 | BITMAP CONVERSION TO ROWIDS | | | | |
| 3 | BITMAP AND | | | | |
| 4 | BITMAP CONVERSION FROM ROWIDS| | | | |
|* 5 | INDEX RANGE SCAN | IX_DEPTNO | 611 | | 2 |
| 6 | BITMAP CONVERSION FROM ROWIDS| | | | |
|* 7 | INDEX RANGE SCAN | IX_JOB | 611 | | 2 |
Aquí debe valorarse cómo se harán menos lecturas: si en un INDEX RANGE SCAN del
índice concatenado, seguido del acceso a tabla por ROWID; o con los dos INDEX RANGE
SCAN y la conversión bitmap seguida del acceso a tabla por ROWID, por lo que se
recomienda comprobar y analizar el plan de ejecución siempre que sea posible.
Para poder crear índices basados en funciones, se deben cumplir los siguientes requisitos:
• Se debe poseer el privilegio de sistema QUERY REWRITE para crear índices en el propio
esquema.
• Si se quieren crear índices de este tipo en cualquier esquema, se debe poseer el privilegio
GLOBAL QUERY REWRITE y CREATE ANY INDEX
o QUERY_REWRITE_INTEGRITY=TRUSTED
o QUERY_REWRITE_ENABLED=TRUE
o COMPATIBLE=8.1.0.0.0 (o superior)
La SELECT puede usar tanto una index range scan (en la siguiente consulta la expresión de
la sentencia es un prefijo del índice) o un index full scan (preferible cuando el índice
especifica un alto grado de paralelismo)
• Situaciones en las que el usuario inserta valores ascendentes y borra los valores inferiores
de una tabla.
Toda consulta SELECT se ejecuta dentro del servidor en varios pasos. Para la misma
consulta, pueden existir distintos caminos para conseguir el mismo resultados, por lo que el
servidor es el responsable de decidir qué camino seguir para conseguir el mejor tiempo de
respuesta.
La parte de la base de datos que se encarga de estas decisiones se llama Optimizador. El
camino seguido por el servidor para la ejecución de una consulta se denomina "Plan de
ejecución" (ver EXPLAIN PLAN).
Hay que tener en cuenta que:
se basa en ciertas reglas para realizar las consultas. Por ejemplo, si se filtra por un campo
indexado, se utilizará el índice. Si la consulta contiene un ORDER BY, se utilizará un
algoritmo Quick Sort, etc. No tiene en cuenta el estado actual de la base de datos, ni el
número de usuarios conectados, ni la carga de datos de los objetos, etc. Es un sistema de
optimización estático, no varía de un momento a otro.
se basa en las reglas básicas, pero teniendo en cuenta el estado actual de la base de
datos. Es decir, tiene en cuenta el número de registros de las tablas, el número de usuarios
accediendo a ellas, etc. Por ejemplo, si se hace una consulta utilizando un campo indexado,
mirará primero el número de registros y si es suficientemente grande entonces merecerá la
pena acceder por el índice, si no, accede directamente a la tabla.
Para averiguar el estado actual de la base de datos se basa en los datos del catálogo público,
por lo que es recomendable que esté lo más actualizado posible (a través de la sentencia
ANALYZE), ya que de no ser así, se pueden tomar decisiones a partir de datos desfasados (la
tabla tenía 10 registros hace un mes pero ahora tiene 10.000).
REFERENCIAS