Vistas e Indices SQL Server

CENTRO DE SERVICIOS Y GESTIÓN EMPRESARIAL ÁREA DE TELEINFORMÁTICA ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN Vers

Views 64 Downloads 0 File size 445KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

CENTRO DE SERVICIOS Y GESTIÓN EMPRESARIAL ÁREA DE TELEINFORMÁTICA ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN

Versión: 1 Agosto de 2014

CONSTRUIR LA BASE DE DATOS SENTENCIAS DDL (VISTAS E INDICES)

Página 1 de 7

ANTIOQUIA

VISTAS E ÍNDICES VISTAS Una vista es una alternativa para mostrar datos de varias tablas. Una vista es como una tabla virtual que almacena una consulta. Los datos accesibles a través de la vista no están almacenados en la base de datos como un objeto. Entonces, una vista almacena una consulta como un objeto para utilizarse posteriormente. Las tablas consultadas en una vista se llaman tablas base. En general, se puede dar un nombre a cualquier consulta y almacenarla como una vista. Una vista suele llamarse también tabla virtual porque los resultados que retorna y la manera de referenciarlas es la misma que para una tabla. Las vistas permiten: 

Ocultar información: Permitiendo el acceso a algunos datos y manteniendo oculto el resto de la información que no se incluye en la vista. El usuario opera con los datos de una vista como si se tratara de una tabla, pudiendo modificar tales datos.



Simplificar la administración de los permisos de usuario: Se pueden dar al usuario permisos para que solamente pueda acceder a los datos a través de vistas, en lugar de concederle permisos para acceder a ciertos campos, así se protegen las tablas base de cambios en su estructura.



Mejorar el rendimiento: Se puede evitar tipear instrucciones repetidamente almacenando en una vista el resultado de una consulta compleja que incluya información de varias tablas.

Podemos crear vistas con: un subconjunto de registros y campos de una tabla; una unión de varias tablas; una combinación de varias tablas; un resumen estadístico de una tabla; un subconjunto de otra vista, combinación de vistas y tablas. Una vista se define usando un "SELECT". La sintaxis básica parcial para CREAR una vista es la siguiente: CREATE VIEW NombreVista AS -- SENTENCIAS SELECT FROM Tablas;

El contenido de una vista se muestra con un " SELECT ": SELECT * FROM NombreVista;

Recopilado y Adaptado por: Vanessa Cristina Miranda

CENTRO DE SERVICIOS Y GESTIÓN EMPRESARIAL ÁREA DE TELEINFORMÁTICA ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN

Versión: 1 Agosto de 2014

CONSTRUIR LA BASE DE DATOS SENTENCIAS DDL (VISTAS E INDICES)

Página 2 de 7

ANTIOQUIA

En el siguiente ejemplo creamos la vista "vista_empleados", que es resultado de una combinación en la cual se muestran 4 campos: CREATE VIEW Vista_Empleados AS SELECT (Apellido +' '+ E.Nombre) AS NOMBRE, Sexo, S.Nombre AS SECCION, CantidadHijos FROM EMPLEADOS AS E JOIN SECCIONES AS S ON CODIGO=SECCION

Para ver la información contenida en la vista creada anteriormente tipeamos: SELECT * FROM Vista_Empleados;

Podemos realizar consultas a una vista como si se tratara de una tabla: SELECT Seccion, COUNT(*) AS Cantidad FROM Vista_Empleados;

Los nombres para vistas deben seguir las mismas reglas que cualquier identificador. Para distinguir una tabla de una vista podemos fijar una convención para darle nombres, por ejemplo, colocar el sufijo “vista” y luego el nombre de las tablas consultadas en ellas. Los campos y expresiones de la consulta que define una vista DEBEN tener un nombre. Se debe colocar nombre de campo cuando es un campo calculado o si hay 2 campos con el mismo nombre. Note que en el ejemplo, al concatenar los campos "apellido" y "nombre" colocamos un alias; si no lo hubiésemos hecho aparecería un mensaje de error porque dicha expresión DEBE tener un encabezado, SQL Server no lo coloca por defecto. Los nombres de los campos y expresiones de la consulta que define una vista DEBEN ser únicos (no puede haber dos campos o encabezados con igual nombre). Note que en la vista definida en el ejemplo, al campo "s.Nombre" le colocamos un alias porque ya había un encabezado (el alias de la concatenación) llamado "nombre" y no pueden repetirse, si sucediera, aparecería un mensaje de error. Otra sintaxis es la siguiente: CREATE VIEW NombreVista (Nombres_Encabezados) AS -- SENTENCIAS SELECT FROM Tablas

Creamos otra vista de "empleados" denominada "vista_empleados_ingreso" que almacena la cantidad de empleados por año:

Recopilado y Adaptado por: Vanessa Cristina Miranda

ANTIOQUIA

CENTRO DE SERVICIOS Y GESTIÓN EMPRESARIAL ÁREA DE TELEINFORMÁTICA ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN

Versión: 1 Agosto de 2014

CONSTRUIR LA BASE DE DATOS SENTENCIAS DDL (VISTAS E INDICES)

Página 3 de 7

CREATE VIEW Vista_Empleados_Ingreso (FECHA,CANTIDAD) AS SELECT DATEPART(YEAR,FechaIngreso), COUNT(*) FROM Empleados GROUP BY DATEPART(YEAR,FechaIngreso)

La diferencia es que se colocan entre paréntesis los encabezados de las columnas que aparecerán en la vista. Si no los colocamos y empleamos la sintaxis vista anteriormente, se emplean los nombres de los campos o alias (que en este caso habría que agregar) colocados en el "SELECT" que define la vista. Los nombres que se colocan entre paréntesis deben ser tantos como los campos o expresiones que se definen en la vista. Las vistas se crean en la base de datos activa. Al crear una vista, SQL Server verifica que existan las tablas a las que se hacen referencia en ella. Se aconseja probar la sentencia "SELECT" con la cual definiremos la vista antes de crearla para asegurarnos que el resultado que retorna es el imaginado. Existen algunas restricciones para el uso de "CREATE VIEW", a saber: 

No puede incluir las cláusulas "COMPUTE" ni "COMPUTE BY" ni la palabra clave "into";



No se pueden crear vistas temporales ni crear vistas sobre tablas temporales.



No se pueden asociar reglas ni valores por defecto a las vistas.



No puede combinarse con otras instrucciones en un mismo lote.

Para modificar una vista utilizamos ALTER, así: ALTER VIEW Vista_Empleados_Ingreso (AÑO,CANTIDAD) AS SELECT YEAR(FechaIngreso), COUNT(*) FROM Empleados WHERE YEAR(FechaIngreso) != '2008'

Para eliminar una vista utilizamos DROP, así: DROP VIEW Vista_Empleados_Ingreso;

Recopilado y Adaptado por: Vanessa Cristina Miranda

ANTIOQUIA

CENTRO DE SERVICIOS Y GESTIÓN EMPRESARIAL ÁREA DE TELEINFORMÁTICA ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN

Versión: 1 Agosto de 2014

CONSTRUIR LA BASE DE DATOS SENTENCIAS DDL (VISTAS E INDICES)

Página 4 de 7

ÍNDICES SQL Server accede a los datos de dos maneras:  

Recorriendo las tablas; comenzando en el principio y extrayendo los registros que cumplen las condiciones de la consulta. Empleando índices; recorriendo la estructura de árbol del índice para localizar los registros y extrayendo los que cumplen las condiciones de la consulta.

Los índices se emplean para facilitar la obtención de información de una tabla. El índice de una tabla desempeña la misma función que el índice de un libro: permite encontrar datos rápidamente; en el caso de las tablas, localiza registros. Una tabla se indexa por un campo (o varios). Un índice posibilita el acceso directo y rápido haciendo más eficiente las búsquedas. Sin índice, SQL Server debe recorrer secuencialmente toda la tabla para encontrar un registro. El objetivo de un índice es acelerar la recuperación de información. La indexación es una técnica que optimiza el acceso a los datos, mejora el rendimiento acelerando las consultas y otras operaciones. Es útil cuando la tabla contiene miles de registros, cuando se realizan operaciones de ordenamiento y agrupamiento y cuando se combinan varias tablas. La desventaja es que consume espacio en disco y genera costo de mantenimiento (tiempo y recursos). Los índices más adecuados son aquellos creados con campos que contienen valores únicos. Es importante identificar el o los campos por los que sería útil crear un índice, aquellos campos por los cuales se realizan búsqueda con frecuencia: claves primarias, claves externas o campos que combinan tablas. No se recomienda crear índices por campos que no se usan con frecuencia en consultas o no contienen valores únicos. SQL Server permite crear dos tipos de índices: 1) agrupados (clustered) y 2) no agrupados (nonclustered). 1) Un ÍNDICE AGRUPADO es similar a una guía telefónica, los registros con el mismo valor de campo se agrupan juntos. Un índice agrupado determina la secuencia de almacenamiento de los registros en una tabla. Se utilizan para campos por los que se realizan búsquedas con frecuencia o se accede siguiendo un orden.

Recopilado y Adaptado por: Vanessa Cristina Miranda

CENTRO DE SERVICIOS Y GESTIÓN EMPRESARIAL ÁREA DE TELEINFORMÁTICA ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN

Versión: 1 Agosto de 2014

CONSTRUIR LA BASE DE DATOS SENTENCIAS DDL (VISTAS E INDICES)

Página 5 de 7

ANTIOQUIA

Una tabla sólo puede tener UN índice agrupado. El tamaño medio de un índice agrupado es aproximadamente el 5% del tamaño de la tabla.

2) Un ÍNDICE NO AGRUPADO es como el índice de un libro, los datos se almacenan en un lugar diferente al del índice, los punteros indican el lugar de almacenamiento de los elementos indizados en la tabla. Un índice no agrupado se emplea cuando se realizan distintos tipos de búsquedas frecuentemente, con campos en los que los datos son únicos. Una tabla puede tener hasta 249 índices no agrupados.

Si no se especifica un tipo de índice, de modo predeterminado será no agrupado. Los campos de tipo text, ntext e image no se pueden indizar. Es recomendable crear los índices agrupados antes que los no agrupados, porque los primeros modifican el orden físico de los registros, ordenándolos secuencialmente. La diferencia básica entre índices agrupados y no agrupados es que los registros de un índice agrupado están ordenados y almacenados de forma secuencial en función de su clave. Resumiendo, los índices facilitan la recuperación de datos, permitiendo el acceso directo y acelerando las búsquedas, consultas y otras operaciones que optimizan el rendimiento general.

CREACIÓN DE ÍNDICES Para crear índices empleamos la instrucción "CREATE INDEX". La sintaxis básica es la siguiente: CREATE TIPODEINDICE INDEX NOMBREINDICE ON TABLA(CAMPO);

"TIPODEINDICE" indica si es agrupado (clustered) o no agrupado (nonclustered). Si no especificamos crea uno No agrupado. Independientemente de si es agrupado o no, también se puede especificar que sea "unique", es decir, no haya valores repetidos. Si se intenta crear un índice unique para un campo que tiene valores duplicados, SQL Server no lo permite. En este ejemplo se crea un índice agrupado único para el campo "codigo" de la tabla "libros": Recopilado y Adaptado por: Vanessa Cristina Miranda

ANTIOQUIA

CENTRO DE SERVICIOS Y GESTIÓN EMPRESARIAL ÁREA DE TELEINFORMÁTICA ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN

Versión: 1 Agosto de 2014

CONSTRUIR LA BASE DE DATOS SENTENCIAS DDL (VISTAS E INDICES)

Página 6 de 7

CREATE UNIQUE CLUSTERED INDEX I_libros_codigo ON libros(codigo);

Para identificar los índices fácilmente, podemos agregar un prefijo al nombre del índice, por ejemplo "I" y luego el nombre de la tabla y/o campo. En este ejemplo se crea un índice no agrupado para el campo "titulo" de la tabla "libros": CREATE NONCLUSTERED INDEX I_libros_titulo ON libros(titulo);

Un índice puede tener más de un campo como clave, son Índices Compuestos. Los campos de un índice compuesto tienen que ser de la misma tabla (excepto cuando se crea en una vista). Creamos un índice compuesto para el campo "autor" y "editorial": CREATE INDEX I_libros_autoreditorial ON libros(autor,editorial);

SQL Server crea automáticamente índices cuando se establece una restricción "primary key" o "unique" en una tabla. Al crear una restricción "primary key", si no se especifica, el índice será agrupado (clustered) a menos que ya exista un índice agrupado para dicha tabla. Al crear una restricción "unique", si no se especifica, el índice será no agrupado (non-clustered). Ahora podemos entender el resultado del procedimiento almacenado "sp_helpconstraint" cuando en la columna "constraint_type" mostraba el tipo de índice seguido de las palabras "clustered" o "non_clustered". Todos los índices de la base de datos activa se almacenan en la tabla del sistema "sysindexes", podemos consultar dicha tabla tipeando: SELECT NAME FROM SYSINDEXES;

Para ver todos los índices de la base de datos activa creados por nosotros podemos tipear la siguiente consulta: SELECT NAME FROM SYSINDEXES WHERE NAME LIKE 'I_%';

Recopilado y Adaptado por: Vanessa Cristina Miranda

CENTRO DE SERVICIOS Y GESTIÓN EMPRESARIAL ÁREA DE TELEINFORMÁTICA ANÁLISIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN

Versión: 1 Agosto de 2014

CONSTRUIR LA BASE DE DATOS SENTENCIAS DDL (VISTAS E INDICES)

Página 7 de 7

ANTIOQUIA

REGENERAR ÍNDICES Empleando la opción "drop_existing" junto con "create index" permite regenerar un índice, con ello evitamos eliminarlo y volver a crearlo. La sintaxis es la siguiente: CREATE TIPODEINDICE INDEX NOMBREINDICE ON TABLA(CAMPO) WITH DROP_EXISTING;

También podemos modificar alguna de las características de un índice con esta opción, a saber: 

Tipo: cambiándolo de no agrupado a agrupado (siempre que no exista uno agrupado para la misma tabla). No se puede convertir un índice agrupado en No agrupado.



Campo: se puede cambiar el campo por el cual se indexa, agregar campos, eliminar algún campo de un índice compuesto.



Único: se puede modificar un índice para que los valores sean únicos o dejen de serlo.

Retomaremos el ejemplo anterior donde se crea un índice no agrupado para el campo "titulo" de la tabla "libros": CREATE NONCLUSTERED INDEX I_libros_titulo ON libros(titulo);

Regeneramos el índice I_libros_titulo y lo convertimos a agrupado: CREATE CLUSTERED INDEX I_libros_titulo ON libros(titulo) WITH DROP_EXISTING;

Agregamos un campo al índice "I_libros": CREATE CLUSTERED INDEX I_libros_titulo ON libros(titulo, editorial) WITH DROP_EXISTING;

NOTA: Esta opción no puede emplearse con índices creados a partir de una restricción "primary key" o "unique". ELIMINAR ÍNDICES Para eliminar un índice, utilizamos DROP, así: DROP INDEX I_libros_titulo

Recopilado y Adaptado por: Vanessa Cristina Miranda