sábado, 27 de octubre de 2012

Crear una tabla en SQL Server con script T-SQL

Hola a todos, en esta entrada seguiremos con este minitutorial sobre la creación de una base de datos desde 0 por medio de T-SQL. En la entrada anterior Crear una base de datos se explicó un poco como crear y eliminar una base de datos por medio de un script, hoy les coloco la creación de tablas, crearemos una tabla, la tabla se llamará Estudiante y lo haremos de la siguiente manera:

   1: USE COLEGIO
   2: GO
   3:  
   4: CREATE TABLE Estudiante
   5: (
   6:     EstudianteId int IDENTITY(1,1) NOT NULL,
   7:     Nombre varchar(50) NOT NULL,
   8:     Apellido varchar(50) NOT NULL
   9:     CONSTRAINT cp_Estudiante PRIMARY KEY CLUSTERED 
  10:     (
  11:         EstudianteId ASC
  12:     )
  13: )
  14: ON [PRIMARY]


Como vemos en la primera línea colocamos Use y el nombre de la base de datos que creamos en la entrada anterior, luego colocamos "CREATE TABLE” y el nombre que le daremos a la tabla, luego colocaremos los campos que necesitaremos en nuestra tabla, en este caso colocamos un campo tipo entero y auto numérico de nombre EstudianteId que será nuestra clave primaria, además agregamos dos campos tipo varchar de 50 caracteres de longitud uno será el campo Nombre y el otro el Apellido, fíjense que se está colocando como parámetro a la creación de los campos lo que se describe como “NOT NULL” esto debemos colocarlo en aquellos campos que son obligatorios (El campo EstudianteId es obligatorio de por sí por pertenecer al campo clave de la tabla). Además podemos observar que se creará un índice de tipo clúster para el campo clave (EstudianteId). En la línea 14 nos indica que la tabla se creará en el filegroup predeterminado de la base de datos de nombre “PRIMARY”. Hay algunas definiciones como índices, filegroup que se estarán detallando a medida que vayamos avanzando en este minitutorial.


Para eliminar la tabla se usa esta simple instrucción SQL:



   1: USE COLEGIO
   2: GO
   3: DROP TABLE Estudiante

Cualquier pregunta no duden en realizarla.


Saludos.

lunes, 22 de octubre de 2012

Obtener la fragmentación de los índices de una Base de datos y aplicar mantenimiento

Hola a todos, hoy les coloco esta entrada que considero muy importante siguiendo la línea de la optimización de nuestras bases de datos, el script que les coloco a continuación me permite visualizar el % de fragmentación que tiene nuestros índices en el cual les coloco como parámetro en la consulta que me indique los que sean mayores a 30%.

   1: SELECT top 60 OBJECT_NAME(i.OBJECT_ID) AS TableName,
   2: i.name AS IndexName,
   3: indexstats.avg_fragmentation_in_percent
   4: FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') indexstats
   5: INNER JOIN sys.indexes i ON i.OBJECT_ID = indexstats.OBJECT_ID
   6: AND i.index_id = indexstats.index_id
   7: WHERE indexstats.avg_fragmentation_in_percent > 30

Se recomienda que aquellos índices que estén entre el rango de 5% a 30% se les aplique una reorganización usando para ello la siguiente función:



   1: ALTER INDEX 'NombreDelIndice' REORGANIZE

En cuanto a los índices que sobrepasen el 30% se recomienda aplicar el rebuild que realiza una regeneración del índice. Se aplica de la siguiente forma:



   1: ALTER INDEX 'NombreDelIndice' REBUILD WITH (ONLINE = ON)

El parámetro “ONLINE=ON” nos índica que regeneración de un índice se puede ejecutar en línea o sin conexión. En cambio la reorganización de un índice siempre se ejecuta en línea. Para lograr una disponibilidad similar a la opción de reorganización, debe volver a generar los índices en línea.

viernes, 19 de octubre de 2012

Windows 8 se acerca a la prueba de fuego

Una semana antes de la presentación de Windows 8 de Microsoft, a los consumidores les espera una sorpresa. Windows, utilizado de una forma u otra por toda una generación, tendrá un formato completamente distinto que obligará a los usuarios a aprender nuevos modos de operar.

Microsoft rompe violentamente con el pasado para mantenerse relevante en un mundo en el que los teléfonos multiusos y las tabletas han erosionado el dominio de tres décadas de las computadoras personales. Windows 8 se propone vincular entre sí las computadoras personales de Microsoft, las tabletas y los programas de sus teléfonos. Pero a juzgar por las reacciones de algunas personas que han probado la versión, es una medida que podría confundir y alienar a los clientes.

Tony Roos, un misionero estadounidense en París, instaló una versión gratuita anticipada de Windows 8 en su vieja portátil para ver si el nuevo sistema operativo le daría mayor velocidad y respuesta. No fue así, dijo, y se dio cuenta pronto de que operar con el nuevo sistema requiere olvidarse mucho de lo que había aprendido sobre Windows.

"Era muy difícil acostumbrarse", afirmó. "Tengo hijos de 8 y de 10 años, y nunca se acostumbraron. Decían 'Preferimos usar la computadora de mami'''.

Windows 8 es la mayor revisión del sistema operativo de Microsoft desde que presentó Windows 95 con bombos y platillos hace 17 años.

En definitiva, Windows creció hasta convertirse en un negocio de 14,000 millones de dólares anuales y durante un tiempo hizo del exdirector ejecutivo Bill Gates el hombre más rico del mundo. Ahora, debido a los teléfonos multiusos y las tabletas, la industria de las computadoras personales está declinando. Las compañías de computadoras están desesperadas por producir algo que vuelva a levantar las ventas.

Se calcula que las ventas de computadoras personales caerá este año por primera vez desde el 2001, según IHS iSuppli, una firma de investigación del mercado.

La cuestión es si la nueva versión, que puede usarse en tabletas y teléfonos multiusos, además de la tradicional computadora personal, puede satisfacer las necesidades de los diferentes tipos de usuarios.

"Me preocupa mucho que a Microsoft le salga el tiro por la culata", advirtió Michael Mace, director general de Cera Technology y exempleado de Apple.

Windows 8 es tan diferente, dijo, que muchos usuarios de Windows poco prácticos en tecnología se sentirán perdidos, agregó.

Microsoft presentará Windows 8 el 26 de octubre. Las compañías de computadoras usarán ese sistema operativo prácticamente en todas las computadoras personales que salgan al mercado.

Crear una base de datos

Hola a todos, estaré realizando algunas entradas que son básicas para la creación de bases de datos, tablas, consultas, vistas, procedimientos almacenados, desencadenadores, índices y otras hierbas. Trataré de partir de lo inicial, recuerden que pueden consultar. Hoy arrancaremos con la creación de una base de datos, voy a obviar la parte de seguridad en el inicio por que se vuelve un poco complejo y prefiero explicarlo un poco más detallado en las próximas entradas.

Para crear una base de datos podemos usar el administrador SQL Server que viene en el paquete de instalación de las diferentes versiones de SQL Server, pero también la podemos crear por medio de TSQL, usando un script para crearlo.

Crearemos una base de datos con el nombre de Colegio.

   1: Create Database Colegio


También podríamos realizar el borrado de la base de datos (ojo con esto, cuidado) mediante el siguiente script:



   1: Drop Database Colegio

Crear la base de datos no es solo darle un nombre y ya, existen muchos parámetros que debemos especificar para que esta se encuentre lo más optima posible dependiendo del escenario en donde vayamos a implantarlo. Lo estaré detallando en los próximos artículos.

Usando DMV’s para optimizar nuestra BD (Índices)

Hola a todos, en algún momento no han necesitado obtener que índices pueden estar afectando nuestro sistema, o que índices hacen falta en nuestro sistema para que las consultas se realicen mas rápido. Les voy a colocar varios scripts que he estado armando para obtener algunos indicadores que nos permitirán optimizar nuestras bases de datos, los scripts son los siguientes:

1. Identifica los índices que están siendo mantenidos pero que no se están utilizando, recuerden que los índices ocupan espacio y a su vez pueden causar ciertos efectos negativos a nuestro sistema dependiendo de como fueron creados.

   1: --Identifica los índices que están siendo mantenidos mas no usados.
   2:  
   3: SELECT  '[' + DB_NAME() + '].[' + su.[name] + '].[' + o.[name] + ']'
   4:             AS [statement] ,
   5:         i.[name] AS [index_name] ,
   6:         ddius.[user_seeks] + ddius.[user_scans] + ddius.[user_lookups]
   7:             AS [user_reads] ,
   8:         ddius.[user_updates] AS [user_writes] ,
   9:         SUM(SP.rows) AS [total_rows]
  10: FROM    sys.dm_db_index_usage_stats ddius
  11:         INNER JOIN sys.indexes i ON ddius.[object_id] = i.[object_id]
  12:                                      AND i.[index_id] = ddius.[index_id]
  13:         INNER JOIN sys.partitions SP ON ddius.[object_id] = SP.[object_id]
  14:                                         AND SP.[index_id] = ddius.[index_id]
  15:         INNER JOIN sys.objects o ON ddius.[object_id] = o.[object_id]
  16:         INNER JOIN sys.sysusers su ON o.[schema_id] = su.[UID]
  17: WHERE   ddius.[database_id] = DB_ID() -- current database only
  18:         AND OBJECTPROPERTY(ddius.[object_id], 'IsUserTable') = 1
  19:         AND ddius.[index_id] > 0
  20: GROUP BY su.[name] ,
  21:         o.[name] ,
  22:         i.[name] ,
  23:         ddius.[user_seeks] + ddius.[user_scans] + ddius.[user_lookups] ,
  24:         ddius.[user_updates]
  25: HAVING  ddius.[user_seeks] + ddius.[user_scans] + ddius.[user_lookups] = 0
  26: ORDER BY ddius.[user_updates] DESC ,
  27:         su.[name] ,
  28:         o.[name] ,
  29:         i.[name ]
  30:  

2. Identifica los índices non-clustered potencialmente ineficiente. Este indicador es importante para optimizar nuestra base de datos.



   1: --Identifica los indices non-clustered potencialmente ineficiente. O sea las escrituras son mayor a las lecturas.
   2: SELECT  OBJECT_NAME(ddius.[object_id]) AS [Table Name] ,
   3:         i.name AS [Index Name] ,
   4:         i.index_id ,
   5:         user_updates AS [Total Writes] ,
   6:         user_seeks + user_scans + user_lookups AS [Total Reads] ,
   7:         user_updates - ( user_seeks + user_scans + user_lookups )
   8:             AS [Difference]
   9: FROM    sys.dm_db_index_usage_stats AS ddius WITH ( NOLOCK )
  10:         INNER JOIN sys.indexes AS i WITH ( NOLOCK )
  11:             ON ddius.[object_id] = i.[object_id]
  12:             AND i.index_id = ddius.index_id
  13: WHERE   OBJECTPROPERTY(ddius.[object_id], 'IsUserTable') = 1
  14:         AND ddius.database_id = DB_ID()
  15:         AND user_updates > ( user_seeks + user_scans + user_lookups )
  16:         AND i.index_id > 1
  17: ORDER BY [Difference] DESC ,
  18:         [Total Writes] DESC ,
  19:         [Total Reads] ASC ;

3. Identifica los índices que faltan en nuestra base de datos según el orden de ventaja para la optimización.



   1: --Identifica que indices faltantes son mas beneficiosos.
   2:         SELECT  user_seeks * avg_total_user_cost * ( avg_user_impact * 0.01 ) AS [index_advantage] ,
   3:         dbmigs.last_user_seek ,
   4:         dbmid.[statement] AS [Database.Schema.Table] ,
   5:         dbmid.equality_columns ,
   6:         dbmid.inequality_columns ,
   7:         dbmid.included_columns ,
   8:         dbmigs.unique_compiles ,
   9:         dbmigs.user_seeks ,
  10:         dbmigs.avg_total_user_cost ,
  11:         dbmigs.avg_user_impact
  12: FROM    sys.dm_db_missing_index_group_stats AS dbmigs WITH ( NOLOCK )
  13:         INNER JOIN sys.dm_db_missing_index_groups AS dbmig WITH ( NOLOCK )
  14:                     ON dbmigs.group_handle = dbmig.index_group_handle
  15:         INNER JOIN sys.dm_db_missing_index_details AS dbmid WITH ( NOLOCK )
  16:                     ON dbmig.index_handle = dbmid.index_handle
  17: WHERE   dbmid.[database_id] = DB_ID()
  18: ORDER BY index_advantage DESC ;

Existen muchos mas beneficios que le podemos sacar provecho a los DMV’s. Si quieren ver mas vayan al siguiente link http://msdn.microsoft.com/en-us/library/ms188754.aspx


Cualquier pregunta no duden en realizarla.


Saludos.

Cerrar conexiones abiertas en una BD

Hola a todos, en algunas ocasiones necesitamos cerrar (como decimos los desarrolladores “Matar”) las conexiones existentes en un momento determinado con el SQL Server en una base de datos X. Podríamos realizarla de varias formas, pero les daré un tip que uso para ello que les permitirá hacer el trabajo de una forma rápida y sin problemas. Ejecuto el script que les coloco mas abajo para cerrar las conexiones:

   1: use master
   2:  
   3: select @@spid
   4: DECLARE @nameBD VARCHAR(100)
   5: SET @nameBD='NombreBaseDatos'
   6: DECLARE @sql VARCHAR(500)
   7: SET @sql = ''
   8: select @sql = @sql + ' KILL ' + CAST(spid AS VARCHAR(4)) + '' FROM DBO.sysprocesses WHERE DB_NAME(dbid) = @nameBD AND spid > 50 
   9: select @sql
  10: EXEC(@sql)

El script realiza una consulta a la base de datos del sistema master en la tabla sysprocesses pasando como parámetro a la consulta el nombre de la bd para realizar el filtro y ejecuta la función KILL para matar las conexiones existentes.

Cambiando el nombre del servidor SQL Server

Hola a todos, hace unos días necesitaba realizar un cambio en el nombre del servidor windows, en ese servidor se tiene instalado SQL Server 2012, la cuestión es que el servidor iba a estar enlazado por medio de replicación con otro servidor y por ende debía estar bien configurado el nombre del servidor SQL Server con respecto al nombre del servidor Windows, o sea, deben ser iguales. Para poder cambiar el nombre del servidor en SQL Server, los pasos necesarios para realizar dicho cambio son los siguientes:

1. Realiza una consulta en el administrador SQL en mi caso Microsoft SQL Management Studio (Depende de la versión SQL que se tenga). Y realiza la siguiente consulta:

   1: Select @@ServerName

El resultado que arrojará será el nombre del servidor que tenían configurado antes de cambiarlo en el sistema operativo.


Algo como se muestra en esta imagen:



2. Lo siguiente sería borrar el nombre del servidor para eliminar la vinculación con el nombre anterior.



   1: sp_dropserver 'NombreQueSeObtuvo'



3. Agregamos el nuevo nombre del servidor para realizar la vinculación:



   1: sp_addserver 'NuevoNombre',local


4. Debemos reiniciar los servicios relacionados al SQL Server y realizar nuevamente el paso 1, o sea, volvemos a consultar el nombre del servidor. El resultado debería indicarnos que el servidor SQL tiene como nombre el que le indicamos en el paso 3.


Los pasos completos serían los siguientes:



   1: Select @@ServerName
   2: sp_dropserver 'NombreQueSeObtuvo'
   3: sp_addserver 'NuevoNombre',local

Cualquier pregunta no dudes en realizarla.


Saludos.

Me presento

Hola a todos, mi nombre es Roberto Ferreira y soy ingeniero de sistemas desde el año 2005, estoy en el área de desarrollo desde hace 7 años en los cuales he realizado desarrollos web, escritorios y móviles con lenguajes como asp clásico, asp.net (C#), MVC (Razor), PHP utilizando como motor de base de datos SQL Server en sus diferentes versiones, el fin de este blog es colocar esos tips que me ayudan en el día a día como desarrollador. Siéntase con confianza para realizar cualquier pregunta trataré de responderles lo más rápido posible y de ser posible ayudarlos. Saludos desde Venezuela.