Archivo

Entradas Etiquetadas ‘SQL SERVER 2005’

¿Cómo saber el SP instalado del SQL Server?

Jueves, 12 de Febrero de 2009

No voy a explicar algo que ta está suficientemente bien explicado en el siguiente articulo de Microsoft, Cómo identificar la versión y la edición de SQL Server.

Antes nosotros lo averiguábamos desde el Analizador de Consultas (ISQL) poniendo la instrucción:
SELECT @@VERSION
GO

Lo que si que vamos hacer es ampliar esta información. Como ya es sabido, microsoft ya no da soporte para la versión 6.0 y por tanto no lo ha puesto en el articulo antes mencionado. Por si alguien le sirve, adjuntamos la equivalencia para este producto.

Versión Sqlservr.exe
RTM 6.00.121
Service Pack 1 de SQL Server 6.0 6.00.124
Service Pack 2 de SQL Server 6.0 6.00.139
Service Pack 2 de SQL Server 6.0 6.00.151

Amando Olcina SQL Server ,

Reducir archivo de trasacciones de una base de datos SQL Server

Martes, 10 de Febrero de 2009

En algunas ocasiones las base de datos de Microsoft SQL generan archivos de trasacciones de gran tamaño, siendo en muchos casos innecesarios el almacenaje de esta información y en muchas ocasiones la consola de administración no consigue reducir el tamaño de la base de datos.

El siguiente script consigue reducir el fichero de trasaciones del SQL Server al tamaño que se le especifique, solamente hay que modificar el nombre de la base de datos ‘BBDD’.

-- Muestra el nombre y caracteristicas de los ficheros de la BBDD
HP_HELPDB 'BBDD'

-- Muestra la version y el SP de SQL
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

SET NOCOUNT ON

-- Borrado del registro de transacciones
dump transaction BBDD with no_log
go

-- Declaración de variables que se van a usar en la configuración
DECLARE @NombreLogicoArchivo sysname,
@MaxMinutos INT,
@NuevoTamano INT

--Indique aquí su configuración.

--Base de datos con la que se va a interactuar.
USE BBDD

-- Use sp_helpfile para identificar el nombre de archivo lógico que desea reducir.
-- en el ejemplo le hemos denominado BBDD_Log, suele tener este formato.
SELECT @NombreLogicoArchivo = 'BBDD_Log',
@MaxMinutos = 10, --Límite de tiempo permitido para dar la vuelta al registro.
@NuevoTamano = 100 --en MB

-- Configuración e inicio
DECLARE @TamanoOriginal int

SELECT @TamanoOriginal = size --en páginas de 8 KB
FROM sysfiles
WHERE name = @NombreLogicoArchivo

SELECT 'El tamaño original del registro de' + db_name() + ' es ' +
CONVERT(VARCHAR(30),@TamanoOriginal) + ' páginas de 8 KB ó ' +
CONVERT(VARCHAR(30),(@TamanoOriginal *8/1024)) + 'MB'
FROM sysfiles
WHERE name = @NombreLogicoArchivo

CREATE TABLE DummyTrans (DummyColumna char (8000) not null)

-- Dar la vuelta al registro y truncarlo.
DECLARE @Contador INT,
@HoraInicio DATETIME,
@TruncReg VARCHAR(255)

SELECT @HoraInicio = GETDATE(),
@TruncReg = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

-- Intentar una reducción inicial.
DBCC SHRINKFILE (@NombreLogicoArchivo, @NuevoTamano)

EXEC (@TruncReg)

-- Dar la vuelta al registro, si es necesario.
-- no se ha excedido el máximo tiempo establecido
WHILE @MaxMinutos > DATEDIFF (mi, @HoraInicio, GETDATE())
-- no se ha reducido el registro
AND @TamanoOriginal = (SELECT size FROM sysfiles WHERE name = @NombreLogicoArchivo)
-- El valor pasado para el tamaño nuevo es más pequeño que el tamaño actual.
AND (@TamanoOriginal * 8 /1024) > @NuevoTamano

BEGIN --Bucle externo.

SELECT @Contador = 0

WHILE ((@Contador < @TamanoOriginal / 16) AND (@Contador < 50000))

BEGIN -- Actualización

-- Como es un campo de tipo char, inserta 8000 bytes.
INSERT DummyTrans VALUES ('Llenar registro')

DELETE DummyTrans

SELECT @Contador = @Contador + 1

END -- Actualización

-- Probar si un truncamiento reduce de tamaño el registro.
EXEC (@TruncReg)

END -- Bucle externo

SELECT ' El tamaño final del registro de ' + db_name() + ' es de ' +
CONVERT(VARCHAR(30),size) + ' páginas de 8 KB ó ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @NombreLogicoArchivo

DROP TABLE DummyTrans

PRINT '*** RECUERDE: DEBE REALIZAR UNA COPIA DE SEGURIDAD COMPLETA DE LA BASE DE DATOS***'

SET NOCOUNT OFF

nmiralles SQL Server ,

¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

Miércoles, 4 de Febrero de 2009

Artículo extraido de ¿Cuanto ocupan mis tablas y mis vistas indexadas en Sql Server?

A menudo es importante conocer que tablas o vistas indexadas ocupan un mayor espacio en nuestras bases de datos. Es importante sabe que las vistas indexadas ocupan espacio, ya que mantienen una copia de los datos, por lo tanto tambien incrementan el numero de escrituras a discos cuando se realizan inserciones.

Por ejemplo, la información devuelta por este script es muy util para detectar situaciones de ‘fugas de datos’, en las que tablas que se limpian periodicamente o en respuesta a un evento, dejan de hacerlo y en consecuencia nuestra base de datos crece desmesuradamente. Para una de estas situaciones escribí el script que se encuentra abajo.

Tambien puede ser muy útil en otras situaciones, como por ejemplo detectar las tablas que más ocupan para optimizar su almacenamiento, o para detectar las tablas con más filas, para pensar en su particionado.

 –Cursor que contiene todos los objetos que ocupan espacio

DECLARE objects_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR

  SELECT name

  FROM sysobjects o

  WHERE

   o.xtype = ‘S’ or –Tablas de sistema

   o.xtype = ‘U’ or –Tablas de usuario

   o.xtype = ‘V’ –Vistas (solo las indexadas devuelven tamaño)

 –Tabla temporal para albergar los resultados

CREATE TABLE #results (

  name SYSNAME, rows CHAR(11),

  reserved VARCHAR(18), data VARCHAR(18),

  index_size VARCHAR(18),Unused VARCHAR(18))

 –Recorremos el cursor obteniendo la información de espacio ocupado

DECLARE @object_name AS SYSNAME

OPEN objects_cursor

 

FETCH NEXT FROM objects_cursor

INTO @object_name;

 WHILE @@FETCH_STATUS = 0

  BEGIN

    INSERT INTO #results

    EXEC sp_spaceused @object_name

    FETCH NEXT FROM objects_cursor

    INTO @object_name;

  END 

CLOSE objects_cursor;

DEALLOCATE objects_cursor;

 – Quitamos “KB” para poder ordenar

UPDATE #results

SET

 reserved = LEFT(reserved,LEN(reserved)-3),

 data = LEFT(data,LEN(data)-3),

 index_size = LEFT(index_size,LEN(index_size)-3),

 Unused = LEFT(Unused,LEN(Unused)-3)

  –Ordenamos la información por el tamaño ocupado

SELECT

 Name, reserved AS [Tamaño en Disco (KB)],

 data AS [Datos (KB)], index_size AS [Indices (KB)],

 Unused AS [No usado (KB)], Rows AS Filas

FROM #results

ORDER BY CONVERT(bigint, reserved) DESC

 –Eliminar la tabla temporal

DROP TABLE #results

Reseñar que el script anterior solo funciona en SQL Server 2000, para que funcione en SQL Server 2005, tenemos que modificar la declaración del cursor. Esto es debido a que en SQL Server, el procedimiento almacenado sp_spaceused espera el nombre de los objetos calificados con el nombre del esquema al que pertnenecen. Además los tipos de objetos que devuelven en SQL Server información sobre su tamaño son más. En SQL Server 2005 debemos hacer la declaración del cursor como sigue:

DECLARE objects_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY for
SELECT s.name + ‘.’+ o.name
from sys.schemas s INNER JOIN sys.objects o
ON o.schema_id = s.schema_id
WHERE
 o.type = ‘S’ or –Tablas de sistema
 o.type = ‘U’ or –Tablas de usuario
 o.type = ‘V’ or –Vistas (solo las indexadas devuelven tamaño)
 o.type = ‘SQ’ or –Cola de servicio
 o.type = ‘IT’ – Tablas internas usadas p.e. por el Service Broker o los indices XML

jmiro SQL Server ,