Vous êtes sur la page 1sur 34

Objetos de la Base de Datos

Todos los datos de una base de datos de Microsoft SQL Server 2005/8
estn contenidos en objetos llamados tablas. Cada tabla representa algn tipo
de objeto con significado para los usuarios. Por ejemplo, en una base de datos
de una escuela podramos encontrar una tabla de clases, una tabla de
profesores y una tabla de alumnos.
Las tablas de SQL Server tienen dos componentes principales:
Columnas
Cada columna representa algn atributo del objeto representado por la tabla,
por ejemplo, una tabla de piezas tendra columnas para Id., color y peso.
Rows
Cada fila representa una nica aparicin del objeto representado por la tabla.
Por ejemplo, la tabla de piezas tendra una fila por cada una de las piezas
comercializadas por la empresa.

Objetos de la Base de Datos


Como cada columna representa un atributo de un objeto, los datos de cada
aparicin de la columna son similares.
Una de las propiedades de las columnas es su tipo de datos, que define el tipo
de datos que la columna puede alojar.
SQL Server tiene varios tipos de datos base que se pueden especificar para las
columnas:
Binary

Bigint

bit

Char

datetime

decimal

Float

image

Ent

Money

Nchar

Ntext

nvarchar

Numrico

Real

smalldatetime

smallint

smallmoney

sql_variant

sysname

Text

timestamp

tinyint

varbinary

varchar

uniqueidentifier
2

Objetos de la Base de Datos


Adems, los usuarios pueden crear sus propios tipos de datos definidos
por el usuario

ejemplo:
-- Crea un tipo de datos Cumpleaosque permite nulos
EXEC sp_addtype cumpleaos, datetime,'NULL'
GO
-- Crea una tabla que utiliza el mismo tipo de datos
CREATE TABLE empleado
(
emp_id
char(5),
emp_first_nameemp_first_name
char(30),
emp_last_nameemp_last_name
char(40),
emp_birthdayemp_birthday
cumpleaos
)

Objetos de la Base de Datos

Aqu se puede observar los valores del nuevo tipo generado, a continuacin se
insertan datos en esta nueva tabla:
insert into empleado values ('1','apellido1','apellido2','1776-7-4');
4

Objetos de la Base de Datos


Leemos los resultados:

SELECT TOP 1000 [emp_id]


,[emp_first_nameemp_first_name]
,[emp_last_nameemp_last_name]
,[emp_birthdayemp_birthday]
FROM [AdventureWorks].[dbo].[empleado]

Ejemplo:

Objetos de la Base de Datos

A la misma base de datos, se agregar otro tipo de datos, llamado imss, el cual
debe ser tipo varchar y tener una longitud de 11 dgitos, la columna no puede ser
NULL. Este tipo de dato despus se agregar a la tabla empleado.
EXEC sp_addtype IMSS, 'varchar(11)', 'NOT NULL';
GO
Posteriormente agregaremos una columna llamada IMSS, la cual utilizar el
mismo tipo de dato IMSS
ALTER TABLE empleado ADD IMSS IMSS
GO
Finalmente se introducirn datos en la tabla empleado usando la columna IMSS:
insert into empleado values('2','apellido1','apellido2','2-21-1923','12345678901')
go

Objetos de la Base de Datos


Revisemos los valores insertados:
Select * from empleado;
GO

Objetos de la Base de Datos


Ejercicio:
1.- Crear 2 tipos de datos nuevos:
telefono: el cual debe ser de tipo INT y no puede ser NULL
descripcion: Este tipo de dato debe ser de tipo varchar y con longitud de 54
caracteres y puede ser NULL.
2.- Agregar a la tabla empleado dos columnas nuevas llamadas TELEFONO y
descripcin, cada una de su tipo correspondiente:
Columna

Tipo_de_dato

TELEFONO

telefono

Descripcion

descripcion

3.- Finalmente introducir 2 registros y mostrar la salida de la query:


Select * from empleado;

Objetos de la Base de Datos


Los tipos de datos definidos por el usuario hacen que la estructura de las tablas
tenga mayor significado para los programadores y contribuyen a asegurar que
las columnas que almacenan clases de datos similares tengan el mismo tipo de
datos base
Cuando se ha asignado un tipo de datos a una columna, todos los valores que
se coloquen en la columna deben ser de ese tipo de datos.
Las instrucciones SQL pueden especificar que se utilicen valores de distintos
tipos de datos como valor de origen slo si SQL Server puede convertir
implcitamente el tipo de datos del valor de origen al tipo de datos de la
columna.
Por ejemplo, SQL Server admite la conversin implcita de valores int a
decimal; por tanto, las instrucciones SQL pueden especificar valores int como
el valor que se va a asignar a una columna decimal.
9

Entendiendo las Estadsticas en SQL SERVER

Las estadsticas de SQL Server son informacin


sobre la distribucin de los datos existentes en las
columnas de las tablas de nuestra base de datos.
A travs de las estadsticas, el servidor conoce
como es la informacin de una columna, como por
ejemplo, si vara mucho, si todos los datos son
iguales y los niveles de variacin que hay.

10

Entendiendo las Estadsticas en SQL SERVER

Esta informacin la utiliza cuando nosotros le


pedimos datos de ciertas tablas que cumplan
con ciertas condiciones (select.. from .. where).
Las condiciones que especificamos en el
where de una consulta son analizadas por el
optimizador de consultas para determinar cual
es la forma ms rpida de obtener la
informacin requerida.
11

Entendiendo las Estadsticas en SQL SERVER


Suponiendo que tenemos una consulta con varias condiciones en
el where, el servidor examina las estadsticas asociadas a las
columnas referenciadas en el where, como tambin los ndices
existentes en la tablas, y donde participan esas columnas.
Para el caso de los ndices, SQL Server maneja un conjunto de
estadsticas de forma similar que para una columna de una tabla,
independiente del tipo de ndice (agrupado o no agrupado).
Si hay un ndice sobre la columna en que estamos buscando, en la
mayora de los casos lo usar (depender de las estadsticas y de
otros factores) y en caso contrario, realizar un SCAN sobre la
tabla o el ndice agrupado (en caso de tener).
12

Cmo se consultan los catlogos internos?


Algunas de las tablas a las que hacemos referencia en las consultas no
necesariamente existen fsicamente y muchas de ellas, o son vistas solamente o
se construyen al momento de ejecutar
Los objetos (tablas, procedimientos, etc.) rara vez estn almacenados por el
nombre que nosotros le damos, sino que por un identificador interno.
Para obtener el identificador interno de un objeto, existe una funcin llamada
object_id('objeto') que lo retorna, pudiendo usarse en una consulta o una
instruccin set.
El catlogo donde se almacena la informacin de los ndices y estadsticas de
una tabla se llama sysindexes.
Para consultarlo se debe entonces filtrar la informacin por el id de la tabla
HumanResources.Employee, como se muestra en la siguiente consulta:
use AdventureWorks
select * from sysindexes where id = object_id('HumanResources.Employee')
go
13

Cmo se consultan los catlogos internos?


Como resultado de esta consulta se obtiene lo siguiente:

El resultado indica que para esta consulta, se han creado 7 ndices con diferentes
tamaos (dpages)
14

Estadsticas en SQL SERVER


EJEMPLO 1
Se crear la siguiente tabla dentro de la base de datos AdventureWorks:
use AdventureWorks
CREATE TABLE [dbo].[Test] (
[identificador] [int] IDENTITY (1, 1) NOT NULL ,
[nombre] [varchar] (50) NOT NULL ,
[apellido] [varchar] (50) NOT NULL ,
[direccion] [varchar] (50) NOT NULL ,
[fechanacimiento] [datetime] NOT NULL ,
[login] [varchar] (20) NOT NULL
) ON [PRIMARY]
GO
15

Estadsticas en SQL SERVER


Insertemos algunos registros en la base tabla de prueba,
copindolos de la tabla HumanResources.Employee en la
base de la misma base de datos.
use AdventureWorks
--SET IDENTITY_INSERT Test ON
--GO
insert into Test (identificador, nombre, apellido, direccion,
fechanacimiento)
(select EmployeeID,NationalIDNumber,LoginID, Title,
BirthDate
from AdventureWorks.HumanResources.Employee)
GO

16

Estadsticas en SQL SERVER


Verificando que la tabla se encuentre con datos:

17

Estadsticas en SQL SERVER


Ahora tenemos nuestra tabla, con un ndice agrupado
(cluster) en la columna de identidad, y con un cantidad de
registros pequea.
Para el objetivo de nuestro ejemplo no es necesario tener
gran cantidad de registros.
Existen dos formas tradicionales de ver las estadsticas.
Una de ellas es consultando el catlogo interno de SQL
Server o la otra es a travs de la interfaz grfica asociada
al plan de ejecucin de una consulta.
18

Estadsticas en SQL SERVER


Si realizamos ahora una consulta simple sobre la tabla buscando
por la columna apellido, que sabemos no est considerada en
ningn ndice, se realizarn cambios sobre sysindexes.
Por ejemplo, si la siguiente consulta retorna o no registros, las
estadsticas sern creadas (por que nuestras base de datos est
configurada para que las cree automticamente).

select * from test where apellido = 'gonzlez'

19

Estadsticas en SQL SERVER


Haciendo nuevamente la consulta sobre sysindexes, el
resultado cambia, obtenindose un nuevo registro. Se sabe
que es una estadstica ya que la cantidad de paginas
(dpages = 0) y el grupo (groupid=0) son cero.

20

Estadsticas en SQL SERVER


Ahora, si se quiere conocer que hay en la estadstica,
existe una instruccin de administracin llamada dbcc
showstatistics (tabla, indice|estadstica) para hacerlo.
El resultado de la ejecucin
de dbcc show_statistics (test,
Nombre_de_la_estadistica)
se despliega ahora. El
nombre de la estadstica se
muestra a continuacin

21

Estadsticas en SQL SERVER

22

Estadsticas en SQL SERVER


 El resultado se divide en tres grupos:
 El primer grupo nos entrega informacin general de la
estadstica.
Ac encontramos el nombre, fecha de actualizacin, la
cantidad de filas de la tabla (Rows = 290), la cantidad
de filas que se consideraron para obtener la muestra
(Rows Sampled = 290), la cantidad de pasos (steps =
188) (explicado ms adelante), la densidad y el largo
promedio de los datos de la columna en el caso de una
estadstica o el largo promedio de los datos del ndice
en caso de ser un ndice.
23

Estadsticas en SQL SERVER


El segundo grupo muestra datos especficos asociados a
la columna.
En este caso, la densidad (0.003448276), el largo
promedio y la columna. Para el caso de un ndice,
presenta varias lneas con informacin y densidades
para las columnas del ndice, mostrando desde la
primera columna hasta todas las columnas juntas.
La densidad se obtiene de calcular la siguiente
ecuacin:
Densidad = 1 / (cardinalidad de la llave del ndice)

24

Estadsticas en SQL SERVER


La cardinalidad de la llave corresponde a la cantidad de datos
nicos de la columna o columnas.
Lo importante es que la densidad sea el valor ms chico
posible. Mientras ms pequeo, SQL Server obtendr mejores
resultados en las bsquedas.
Por ejemplo, si la densidad de un ndice es 0,3, significa que
slo se puede filtrar hasta un 30% de los datos con ese ndice,
resultado que puede considerarse muy malo.
 Un buen valor debe estar por debajo del 5%. En nuestro
ejemplo, un densidad de 0.003448276 (3%) significa que en
la tabla hay 1/0.0034 valores diferentes, o bien 294.11. La
consulta select count(distinct(apellido)) from test confirma el
resultado:
25

Estadsticas en SQL SERVER


Recordemos que Distinct
devuelve el nmero de
valores diferentes dentro
de una tabla

El tercer bloque corresponde a la distribucin de los datos de la


columna en la tabla.
Para un ndice de varias columnas se considera slo al valor de
la primera columna.
La informacin se segmenta por rangos (los pasos = 188),
donde en cada lnea se encuentran los valores
correspondientes a los datos que estn entre el
RANGE_HI_KEY de esa lnea y son menores a
RANGE_HI_KEY de la lnea de ms abajo.
26

Estadsticas en SQL SERVER


 En el resultado desplegado antes, se obtiene que entre
adventure-works\alan0 y adventure-works\alex0, no hay
ms valores (RANGE_ROWS = 0), hay 1 valor igual
(EQ_ROWS = 1), no hay valores diferentes en el rango sin
considerar el mismo valor administrador
(DISTINCT_RANGE_ROWS = 0), y para finalizar, el
promedio de filas (cantidad) por cada valor distinto en el
rango es uno (AVG_RANGE_ROWS = 1).
 Corresponde notar que DISTINCT_RANGE_ROWS no
incluye las filas que son iguales a RANGE_HI_KEY ya que
estas estn incluidas en EQ_ROWS.

27

Estadsticas en SQL SERVER


Toda esta informacin le permite saber al optimizador
de consultas como es la informacin de la columna o
ndice, sin necesidad de "tocar" los datos.
Y por el mismo motivo, si queremos que el analizador
siempre encuentre la mejor opcin y el servidor
responda al mximo, debemos proveer a ste de las
estadsticas actualizadas.

28

Estadsticas en SQL SERVER


Por lo tanto, podemos decir que las estadsticas pueden
actualizarse o eliminarse manualmente a travs de la
interfaz grfica o de consultas sql (drop statistics).
Para borrar las estadsticas se utiliza el siguiente
comando:
use AdventureWorks
DROP STATISTICS dbo.Test._WA_Sys_00000002_7ABC33CD

Adems, conviene saber que SQL Server se encarga de


actualizarlas y eliminarlas cuando estima que es
necesario, pero tambin puede agregarse una tarea de
mantencin que las actualice cada cierto tiempo.
29

Estadsticas en SQL SERVER


Observemos el comportamiento de las estadsticas grficamente

Se realiza la siguiente consulta:


select * from Test where nombre='136%'

Al final de la consulta se puede


Observar la creacin de nuevas
estadsticas
30

Estadsticas en SQL SERVER

De la misma manera se pueden


generar estadsticas a la
medida:
create statistics Stats_apellido
on dbo.Test(apellido)
with FULLSCAN

31

Estadsticas en SQL SERVER


Se muestran los resultados:
DBCC SHOW_statistics('dbo.Test','Stats_apellido') with histogram

La configuracin de las
estadsticas
automticas se
realizan de la siguiente
manera:

32

Estadsticas en SQL SERVER


Set Statistics IO, con esta opcin podemos observar, cuantos scans
fueron realizados, cuantas lecturas lgicas y fsicas fueron realizadas
y cuantas pginas fueron colocadas en cache anticipadamente:
use AdventureWorks
SET STATISTICS IO ON
GO
select COUNT(*) From dbo.Test
GO
SET STATISTICS IO OFF
Resultados:

Table 'Test'. Scan count 1, logical reads 4, physical reads


0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.

33

Estadsticas en SQL SERVER


Set Statistics Time: Regresa tiempos concernientes a la query ejecutada:
use AdventureWorks
SET STATISTICS TIME ON
GO
select COUNT(*) From dbo.Test
GO
SET STATISTICS TIME OFF

Resultados
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 11 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

34

Vous aimerez peut-être aussi