jueves, 2 de febrero de 2017

Consultas BD

Hola a todos, cree esta nueva entrada para puedan realizar preguntas sobre SQL Server, también pudiera ayudarles con Laravel (PHP) o C# (ASP.NET Webform, ASP.NET MVC, Winform).

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.