Anda di halaman 1dari 14

Diseo y Arquitectura de Base

de Datos






Al finalizar el captulo, el alumno podr:


Reconocer los distintos formatos de disco.
Definir la mejor arquitectura para crear una base de datos.
Elegir el mejor arreglo de disco para el propsito de su base de datos.
Aplicar la mejor distribucin de sus objetos de base de datos.


Temas:


1. Formateo y alineamiento de Disco

2. Arreglo de Disco

3. Diseo de la Base de datos TEMPDB

4. Diseo de Base de datos










Mejores prcticas con Transac SQL 2008 2
CIBERTEC

1. Formateo y alineamiento de Disco







Muchas veces cuando se quiere mejorar los tiempos de I/O (entradas y salidas de disco) los
factores a tomar en cuenta son: velocidad y tamao de disco, siempre que los discos sean
dedicados, compartidos, virtuales o el tipo de RAID.
El contar con particiones alineadas, justifica en un 30% aproximadamente, del rendimiento de
nuestros sistemas.

1.1 Alineamiento de Disco
La pgina es la unidad bsica del almacenamiento de datos en SQL Server. El espacio
en disco asignado a un archivo de datos (.mdf o .ndf) de una base de datos, se divide
lgicamente en pginas numeradas de forma contigua de 0 a n. Las operaciones de E/S
de disco se realizan a nivel de pgina; es decir, SQL Server, lee o escribe pginas de
datos enteras. El tamao de pgina es de 8 KB, esto significa que las bases de datos de
SQL Server tienen 128 pginas por megabyte.
Asimismo, existen 3 datos importantes para alinear las particiones:
Partition Offset: es el tamao de primer sector y a partir de ste, empiezan las
particiones, lo cual garantiza la omisin de asignacin de pginas en este sector
(creado por el hadware de almacenamiento). El Partition Offset alberga MBR
(Master Boot Record) de 512KB, Tabla de partiones, la firma del disco y los cdigos
de mquina que se encargan de recibir el control de la BIOS.
La primera partion no empieza despus de esta particin, sino que se reserva un
nmero de sectores, como en los sistemas operativos Windows, que reporta un
nmero de sectores ocultos (63 sectores)
Stripe Unit Size: las controladoras de disco definen un tamao mnimo para cada
una de las bandas que se utilizarn para almacenar datos y paridades en los
sistemas de RAID, esto es en los sistemas en los que los volmenes comprende
ms de un disco fsico. Estas bandas comprenden un cierto nmero de sectores de
Mejores prcticas con Transac SQL 2008 3
CIBERTEC
disco y su tamao ser mltiplo de la cantidad de sectores de disco. En los sistemas
operativos Windows, el Windows Volume Maneger, define un valor de 64k para el
Stripe Unit Size.
Allocation Unit: es el menor tamao posible que puede ocupar un fichero. Su valor
se puede especificar, explcitamente, a la hora de formatear. En NTFS es de 4K y
toma un valor mximo de 64K.
Ahora, el alineamiento de las particiones se base en buscar una buena relacin entre
estos tres datos, de manera que las operaciones de lectura/escritura no busquen la data
en ms de un disco que conformen el volumen. Esto lleva a que al momento de leer o
escribir se deba hacer en diferentes discos y la acumulacin de esto, hace que se pierda
performance. Para evitar esto, las siguientes relaciones, se debe entregar un nmero
entero.
Patition Offset / Stripe Size Unit
Stripe Size Unit / Allocation Unit

Ejemplo 1
Suponiendo que el servidor de produccin tiene problemas de performance, lo primero a
realizarse es verificar el tamao del Partition Offset; luego, se ingresar al Men
Inicio\Ejecutar y escribir Cmd.
Seguidamente, se escribir C:\\Windows\\System32-
Estando es esta carpeta, se deber escribir: wmicpartition get BlockSize,
StartingOffset, Name, Index.

Esto devolver el tamao del StartingOffSet






Ahora, para hacerlo ms simple, se dividir el valor del StartingOffSet entre 1024 y si el
valor devuelto es entero, entonces se indicar que la particin est alineada.
Si el valor devuelto no fuera entero, entonces se ingresar por el Men Inicio\Ejecutar y
se escribir Cmd. Luego, regedit.
Ahora, se ubicar en la carpeta
\\Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vds\Alignme
nt
Mejores prcticas con Transac SQL 2008 4
CIBERTEC
Todas las variables debern ser alineadas a 1024Mb o (1048576 bytes)















1.2 Formatear un Disco
Formatear un disco significa borrar todo lo que contiene y esto se puede hacer en dos
formatos NTS y FAT32. Los formatos significan la forma en que los discos guardarn
informacin.
El formato NTFS se puede utilizar a partir de Windows 2000 en adelante, mientras que
FAT32 no permite tener archivos mayores a 4GB.
El formato del disco permite definir el tamao lgico del sector o bloque y esto es
independiente del tamao de la particin. Los formatos NTFS permiten utilizar tamao,
que va desde los 512 bytes hasta los 64K.
Cuando se desea formatear un disco, solo se hace clic derecho sobre la unidad a
formatear.



Mejores prcticas con Transac SQL 2008 5
CIBERTEC
Luego, se dar clic sobre Format.




Se elegirn las opciones necesarias:

Capacity: tamao que se desea que tenga la unidad a formatear.
File System: tipo de Formato (NTFS o FAT)
Allocation unit Size: tamao de bloque a definir (va desde 512 bytes hasta los
64K).
Format options: opcin para formatear. Si se elige Quick Format los archivos
existentes en el disco van hacer retirados, pero no se evaluarn los posibles
sectores defectuosos del disco y si se marca Enable Compression, se comprimirn
los archivos para ser eliminados.









Mejores prcticas con Transac SQL 2008 6
CIBERTEC

2. Arreglo de disco







Antes de conocer cules son los distintos tipos de RAID que existen para una distribucin de
disco en el motor de base de datos, primero se empezar diciendo que RAID es un conjunto de
redundante de discos independientes (Redundant Array of Indeoendent Disk).
El concepto de RAID se basa en el almacenamiento de la data en un arreglo de discos para
mejorar la performance que solo tendra un disco duro. Adicional a esto, la PC asume este
arreglo como una sola unidad lgica o disco.

Cabe mencionar que RIAD se dise para mejorar la fiabilidad de los datos, un mejor
desempeo de I/O, mejorar la tolerancia a fallos y errores.

Existen 10 niveles de RAID, que va desde RAID nivel 0, RAID nivel 1 hasta RAID nivel 10.
Entre ellos, los ms usados son los que se mencionan a continuacin.

RAID 0 o sin paridad: proporciona un mejor rendimiento y almacenamiento pero no
contiene tolerancia a fallos, es decir, que si un disco falla, se perder toda la
informacin. Este arreglo est recomendado para cualquier aplicacin que utilice gran
cantidad de ancho de banda como son las aplicaciones de manipulacin de videos.


Mejores prcticas con Transac SQL 2008 7
CIBERTEC

RAID 1: proporciona una mejor tolerancia a fallos; es comnmente conocida como
RAID Mirror. Asimismo, facilita una copia idntica al disco seleccionado, ya que todos
los datos que se escriben en el disco principal se escriben en el disco seleccionado.
Este arreglo est recomendado para aplicaciones financieras o de oficina.


RAID 5: posee la ms alta tasa de lectura de datos y en caso de fallos, se requiere una
unidad de reemplazo. Si un disco falla, las posteriores lecturas pueden calcularse por
las paridades distribuidas, de tal forma que la unidad siempre est enmascarando el
fallo para los usuarios finales. Este tipo de arreglos se recomienda para los sistemas de
Datamart.



RAID 1 + 0: incluye la tolerancia a fallos y mejora en rendimiento. Pero su
configuracin es ms compleja.








Mejores prcticas con Transac SQL 2008 8
CIBERTEC

3. Diseo de la TempDB







TempDB almacena tambin, informacin de objetos internos creados por el motor como son
las tablas de almacenamiento de informacin para atender solicitudes de cursores. Debido a
esto, muchas veces, existen problemas de lentitud, originados por las transacciones que
trabajan con esta base de datos.

Es importante tener en cuenta la ubicacin y tamao de la Tempdb para evitar cuellos de
botellas cuando se deseen realizar transacciones; por ello, es necesario considerar algunos
puntos para mejorar la performance al momento de utilizar la Tempdb.


3.1 Modelo de recuperacin y ubicacin de la Tempdb

Es recomendado configurar el modelo de recuperacin de la base de datos Tempdb en
modo Simple, para evitar que el Log de transacciones crezca o se mantenga con
informacin que es utilizada de forma temporal.

Tambin, se recomienda que esta base de datos, tenga una unidad independiente de las
utilizadas para colocar las base de datos del usuario y los datafile de log de dichas
bases. Esto debido a que es una base de una escritura constante y el acceso a disco
debe ser el apropiado. Adems, si la Tempdb crece por alguna mala manipulacin de
objetos temporales, esto no afectar el proceso de escritura en la base de datos de
usuario.

Con el siguiente comando, se podrn mover los datafile de la base de datos Tempdb.



ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQLData\tempdb.mdf')
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'E:\SQLData\templog.ldf')
GO
Mejores prcticas con Transac SQL 2008 9
CIBERTEC
Cabe indicar que cuando se ejecute este movimiento, para que tome efecto el cambio se
tendrn que reiniciar los servicios del motor de base datos.


3.2 Tamao inicial de Tempdb

Es recomendado que el tamao inicial de la base de datos Tempdb sea del 15% al 25%
del tamao total de todas las base de datos almacenadas en el servidor de base de
datos. Esto, con el propsito de evitar que Tempdb se expanda con frecuencia y afecte
la performance de la aplicacin. Estos crecimientos automticos deben hacerse en
nmeros enteros; por ello, es recomendable evitar que Tempdb crezca en %, adems, su
crecimiento tiene que ser en mltiplos de 2 Mb.


3.3 Un dataFile de Tempdb por cada procesador

Es recomendado generar un datafile en Tempdb por cada procesador del servidor con el
objetivo de maximizar la afinidad del CPU, esto significa que las operaciones de entrada
y salida puedan paralelizarse y as obtener un mejor rendimiento. Sera preferible que
cada datafile agregado, tenga su propio disco y con esto, se estara optimizando al
mximo el acceso a los discos.

Se recomienda, tambin, que los data file agregados tengan el mismo tamao y mismo
crecimiento con el fin de maximizar el proceso de llenado en Tempdb.
El siguiente script ayuda a visualizar el tamao actual, cantidad de datafile y crecimiento
de Tempdb.






















Al ejecutar el script, se podr ver lo siguiente.






SELECT
name AS FileName,
size*1.0/128 AS FileSizeinMB,
CASE max_size
WHEN 0 THEN 'Autogrowth is off.'
WHEN -1 THEN 'Autogrowth is on.'
ELSE 'Log file will grow to a maximum size of 2 TB.'
END Autogrow,
growth AS 'GrowthValue',
'GrowthIncrement' =
CASE
WHEN growth = 0 THEN 'Size is fixed and will not grow.'
WHEN growth > 0 AND is_percent_growth = 0
THEN 'Growth value is in 8-KB pages.'
ELSE 'Growth value is a percentage.'
END
FROM tempdb.sys.database_files order by 1 asc;
GO
Mejores prcticas con Transac SQL 2008 10
CIBERTEC
La cantidad de Datafile asociado a esta base de datos Tempdb, corresponde a la
cantidad de procesadores que se tiene en el servidor.

























Mejores prcticas con Transac SQL 2008 11
CIBERTEC

4. Diseo de Base de datos






Cuando se desea crear una base de datos, por lo general se piensa en cmo se llamar y en
qu servidor se alojar, y sobre esto se determina si se tiene espacio en disco para poder
crearla.

Sin embargo, las consideraciones a tener en cuenta son:

El tamao proyectado que va a tener la base de datos.
La velocidad con la que se acceder a la informacin.
La velocidad con la que podr ingresar la informacin.
El tipo de informacin que almacenar la base de datos.

Adems, se puede decir que uno de los pasos ms importantes en la creacin de una
aplicacin que maneja una base de datos es el diseo de la misma, ya que si no se tiene en
cuenta las buenas definiciones de las tablas, tipos de datos y ubicacin de la base de datos, es
muy probable tener problemas de performance al momento de utilizar una aplicacin.


4.1 Capacity Planning

Cuando se tiene la necesidad de crear una base de datos, se debe realizar un anlisis
sobre los recursos con los que cuenta (CPU, Memoria y disco).

4.1.1. Tamao del servidor:
No existe un servidor de tamao estndar que se deba comprar para cubrir la
necesidad de crear una nueva aplicacin, pero s existen ciertas preguntas a
realizarse:
Cuntos usuarios se conectarn al servidor? Cunta base de datos soportar
el servidor? Cuntas transacciones se harn?
Asimismo, se deber tener en cuenta, el nmero de registros de la tabla ms
grande. Aunque las variables para determinar el tamao del servidor se hace
cada vez ms grande, segn la cantidad de carga que soporte el objetivo.
Mejores prcticas con Transac SQL 2008 12
CIBERTEC

4.1.2 Tamao de nuestra base de datos
La nica forma de determinar el tamao correcto de una base de datos, consiste
en determinar las necesidades futuras, para lo cual, las base de datos existentes
pueden ayudar a tener un estimado de lnea base, no solo en capacidad del
servidor sino tambin en rendimiento como son CPU y Memoria. Hay varias
formas de determinar el tamao de las bases de datos y una vez esto, se podrn
determinar requerimientos de tamao futuro.
El siguiente script proporciona el tamao actual de las bases de datos en el
servidor.


















































CREATE PROC [dbo].[dba_CapacityPlanning]
AS
BEGIN
SET NOCOUNT ON
IF NOT EXISTS (SELECT * FROM MSDB.sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[tbl_CapacityPlanning]') AND type in (N'U'))
BEGIN

CREATE TABLE [msdb].[dbo].[tbl_CapacityPlanning]
( [ExecuteTime] [datetime] NULL,
[SQLBuild] [nvarchar](57) NULL,
[SQLName] [nvarchar](128) NULL,
[DBName] [sysname] NULL,
[LogicalFileName] [sysname] NULL,
[DBCreationDate] [datetime] NULL,
[DBRecoveryModel] [nvarchar](60) NULL,
[DBCompatibilityLevel] [tinyint] NULL,
[DBCollation] [sysname] NULL,
[FileType] [nvarchar](60) NULL,
[FileName] [nvarchar](260) NULL,
[Growth] [float] NULL,
[GrowthType] [varchar](30) NULL,
[FileID] [int] NULL,
[IsPrimaryFile] [bit] NULL,
[MaxSize(MB)] [float] NULL,
[Size(MB)] [float] NULL,
[UsedSpace(MB)] [float] NULL,
[AvailableSpace(MB)] [float] NULL,
[FileStatus] [nvarchar](60) NULL,
[IsOffline] [bit] NULL,
[IsReadOnly] [bit] NOT NULL,
[IsReadOnlyMedia] [bit] NULL,
[IsSparse] [bit] NULL
)
ON [PRIMARY]
END
CREATE table #tmpspc (Fileid int, FileGroup int, TotalExtents int,
UsedExtents int, Name sysname, FileName nchar(520))
DECLARE @DatabaseName varchar(500)
DECLARE curDB cursor for
SELECT ltrim(rtrim(name)) from master.sys.databases where state_desc='ONLINE'
AND user_access_desc='MULTI_USER'
open curDB
fetch curDB into @DatabaseName
while @@fetch_status = 0
begin
insert into #tmpspc exec ('USE [' + @DatabaseName + '] DBCC SHOWFILESTATS')
fetch curDB into @DatabaseName
end
close curDB
deallocate curDB
create table #tmplogspc (DatabaseName sysname, LogSize float, SpaceUsedPerc float, Status
bit)
insert #tmplogspc EXEC ('dbcc sqlperf(logspace)')

insert into [msdb].[dbo].[tbl_CapacityPlanning] SELECT getdate() AS [ExecuteTime],
left(@@version,57) AS [SQLBuild], @@servername AS [SQLName],
sd.name AS [DBName],
s.name AS [LogicalFileName],
sd.create_date AS [DBCreationDate], sd.recovery_model_desc AS [DBRecoveryModel],
sd.compatibility_level AS [DBCompatibilityLevel], sd.collation_name AS [DBCollation],
s.type_desc AS [FileType],
s.physical_name AS [FileName],
CAST(CASE s.is_percent_growth WHEN 1 THEN s.growth ELSE (s.growth*8)/1024 END AS
float) AS [Growth],
CAST(CASE WHEN s.is_percent_growth=1 THEN '%' Else 'MB' END AS VARCHAR) AS
[GrowthType],
s.file_id AS [FileID],
CAST(CASE s.file_id WHEN 1 THEN 1 ELSE 0 END AS bit) AS [IsPrimaryFile],
CASE when s.max_size=-1 then -1 else (s.max_size * CONVERT(float,8))/1024 END AS
[MaxSize(MB)],
(s.size * CONVERT(float,8))/1024 AS [Size(MB)],
(CAST(tspc.UsedExtents*convert(float,64) AS float))/1024 AS [UsedSpace(MB)],
((tspc.TotalExtents - tspc.UsedExtents)*convert(float,64))/1024 AS [AvailableSpace(MB)],
s.state_desc AS [FileStatus],
CAST(case s.state when 6 then 1 else 0 end AS bit) AS [IsOffline],
s.is_read_only AS [IsReadOnly],
s.is_media_read_only AS [IsReadOnlyMedia],
s.is_sparse AS [IsSparse]
FROM master.sys.master_files AS s
INNER JOIN master.sys.databases sd ON sd.database_id=s.database_id
INNER JOIN #tmpspc tspc ON ltrim(rtrim(tspc.FileName)) = ltrim(rtrim(s.physical_name))
UNION ALL
SELECT getdate() AS [ExecuteTime],left(@@version,57) AS [SQLBuild], @@servername AS
[SQLName],
sd.name AS [DBName],
s.name AS [LogicalName],
sd.create_date AS [DBCreationDate], sd.recovery_model_desc AS [DBRecoveryModel],
sd.compatibility_level AS [DBCompatibilityLevel], sd.collation_name AS [DBCollation],
s.type_desc AS [FileType],
s.physical_name AS [FileName],
CAST(CASE s.is_percent_growth WHEN 1 THEN s.growth ELSE (s.growth*8)/1024 END AS
float) AS [Growth],
Mejores prcticas con Transac SQL 2008 13
CIBERTEC

























Este script crea un procedimiento almacenado que guarda el tamao actual de
la base de datos, en una tabla llamada dba_CapacityPlanning en la base de
datos MSDB. Este procedimiento se puede utilizar todas las veces necesarias y
almacenar el conjunto de datos en la tabla con la fecha de ejecucin, as se
podr saber el tamao de la base de datos en un momento en el tiempo.
Tambien podr servir para determinar una progresin del tamao de la base de
datos en el tiempo.


4.2 Diseo Conceptual, Lgico y Fsico de la base de datos

Si se parte con un mal requerimiento de la nueva base de datos, se tiende a realizar un
mal diseo lgico de lo que ser una base de datos y con esto, se tendr un mal diseo
fsico, lo que conlleva a un mal rendimiento de dicha base de datos. Entonces para
hacer bien esto, se deber conocer qu es el modelo conceptual, lgico y fsico.

Modelo Conceptual: determina todos los requerimientos de la base de datos.
Modelo Lgico: es donde se transforman todas las necesidades de la nueva base
de datos a entidades, con sus respectivos atributos.
Modelo Fsico: es donde se transforman las entidades y atributos en tablas con sus
campos. En esta parte tambin se crean las relaciones entre tablas y las llaves
primarias.
CAST(CASE WHEN s.is_percent_growth=1 THEN '%' Else 'MB' END AS
VARCHAR) AS [GrowthType],
s.file_id AS [FileID],'0' as [IsPrimaryFile],CASE when s.max_size=-1 then -
1 else (s.max_size * CONVERT(float,8))/1024 END AS [MaxSize(MB)],
(s.size * CONVERT(float,8))/1024 AS [Size(MB)],
(tspclog.LogSize * tspclog.SpaceUsedPerc * 10.24)/1024 AS
[UsedSpace(MB)],
((s.size * CONVERT(float,8))/1024 - (tspclog.LogSize *
tspclog.SpaceUsedPerc * 10.24)/1024) AS [AvailableSpace(MB)],
s.state_desc AS [FileStatus],
CAST(case s.state when 6 then 1 else 0 end AS bit) AS [IsOffline],
s.is_read_only AS [IsReadOnly],
s.is_media_read_only AS [IsReadOnlyMedia],
s.is_sparse AS [IsSparse]
FROM master.sys.master_files AS s
INNER JOIN master.sys.databases sd ON sd.database_id=s.database_id
INNER JOIN #tmplogspc tspclog ON
tspclog.DatabaseName = sd.name
WHERE (s.type = 1 ) ORDER BY sd.name, FileID ASC
DROP TABLE #tmpspc
DROP TABLE #tmplogspc
END
Mejores prcticas con Transac SQL 2008 14
CIBERTEC

4.3 Ubicacin de archivos y tablas

Una vez desarrollados los modelos lgico y fsico, se deber planear cul ser la
ubicacin de los archivos y tablas, ya que dependiendo de la facilidad de acceder a la
informacin, se podr tener una buena performance en la aplicacin. Entonces, las
buenas prcticas indican que se deber:

Tener un FileGroup como discos dedicados a la base de datos que tenga el servidor
Contar con una datafile, por cada FileGroup definido.
Ubicar tablas maestras en distintos FileGroup, para mejorar el acceso a la
informacin.


4.4 Normalizar las tablas

Esto permite minimizar el tamao utilizado por la base datos, adems de asegurar la
integridad de la informacin y mejorar el tiempo que pueden tomar las transacciones,
puesto que stas se hacen, generalmente, entre tablas que contienen un nmero
elevado de registros.

Anda mungkin juga menyukai