Este es el escenario general: En todas mis instancias de SQL Server (desarrollo, testing y producción) la base de datos tempdb está configurada para el crecimiento automático (para la base de datos y registro de transacciones). Durante una reciente actuación de ajuste de performance aprendí mucho acerca de cómo TempDB se está utilizando en mi entorno. Atrajo mi atención lo mucho que la base de datos tempdb está siendo utilizada por nuestras aplicaciones. No tenía idea de que nuestras principales aplicaciones de negocios están utilizando la base de datos tempdb tan fuertemente. Además, yo no sabía cuanto habian aumentado la base de datos tempdb y registro de transacciones. Como tal, yo sé que no puedo cambiar las aplicaciones en poco tiempo así que tengo que conseguir una forma de resolver estas cuestiones y el tamaño de la base de datos tempdb. ¿Cómo puedo hacerlo?
Solución:
En muchas instancias de SQL Server de la base de datos tempdb se establece en las configuraciones por defecto que creo que es una base de datos de 8 MB y 1 MB de registro de transacciones con el crecimiento irrestricto de base de datos y el archivo de registro. En comparación con otros entornos donde TempDB probablemente comenzó con un valor predeterminado, en un futuro tendrá decenas de gigabytes, o un tamaño desconocido para el equipo de TI. Tempdb es una base de datos única por una serie de razones que incluyen:
- La base de datos sólo almacena los datos transitorios tales como
- Tablas Temporales (#temptable or ##temptale)
- Table variables
- Cursores
- Tablas de Trabajo
- Versiones de filas que anteriormente se produjeron en "user defined database transaction log" o para apoyar nuevas características tales como conjuntos de resultados activos (MARS)
- Crear o reconstruir los índices ordenados en tempdb
Tabla - Histórico TempDB y registro de Logs
CREATE TABLE [dbo].[TempDBFileSize] (
[TFSID] [int] IDENTITY (1, 1) NOT NULL ,
[FileID] [int] NULL ,
[File_Logical_Name] [varchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[State_Desc] [varchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Type_Desc] [varchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[File_SizeMB] [int] NULL ,
[File_MaxSize] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[File_Growth] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Growth_Type] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Physical_File_Name] [varchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[DateCaptured] [datetime] NULL
) ON [PRIMARY]
GO ALTER TABLE [dbo].[TempDBFileSize] WITH NOCHECK ADD
CONSTRAINT [PK_TempDBFileSize] PRIMARY KEY CLUSTERED
(
[TFSID]
) ON [PRIMARY]
GO
Procedimiento almacenado - Captura de la base de datos tempdb y archivo de registro de espacio utilizado
CREATE PROCEDURE dbo.spTempdbFileSize
AS
SET NOCOUNT ON
INSERT INTO dbo.TempDBFileSize (FileID, File_Logical_Name, State_Desc, Type_Desc,
File_SizeMB, File_MaxSize, File_Growth, Growth_Type, Physical_File_Name, DateCaptured)
SELECT File_ID,
[Name],
State_Desc,
Type_Desc,
([Size] * 8)/1024 AS 'File_SizeMB',
File_MaxSize = CASE
WHEN [Max_Size] = 0 THEN 'NoGrowth'
WHEN [Growth] = 0 THEN 'NoGrowth'
WHEN [Max_Size] = -1 THEN 'UnlimitedGrowth'
WHEN [Max_Size] = 268435456 THEN 'TLogMax'
ELSE CAST(([Max_Size] * 8)/1024 AS varchar(10))
END,
File_Growth = CASE
WHEN [Growth] = 0 THEN 'NoGrowth'
WHEN [Growth] > 0 AND [is_percent_growth] = 0 THEN CAST(([Growth]* 8)/1024 AS varchar(10))
WHEN [Growth] > 0 AND [is_percent_growth] = 1 THEN CAST([Growth] AS varchar(10))
ELSE 'Unknown'
END,
Growth_Type = CASE
WHEN [Growth] = 0 THEN 'NoGrowth'
WHEN [is_percent_growth] = 0 THEN 'MegaBytes'
WHEN [is_percent_growth] = 1 THEN 'Percentage'
ELSE 'Unknown'
END,
[Physical_Name],
GETDATE() AS 'DateCaptured'
FROM Master.sys.master_files (NOLOCK)
WHERE Database_ID = 2
SET NOCOUNT OFF
GO
JOB De SQL Server- 6 horas de intervalo para recopilar la base de datos tempdb y archivo de registro de espacio utilizado
BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < name =" N'[Uncategorized" name =" N'Admin"> 0
PRINT N'The job "Admin - TempDB Sizing" already exists so will not be replaced.'
ELSE
BEGIN
-- Add the job
EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'Admin - TempDB Sizing', @owner_login_name = N'sa', @description = N'06.16.2007 - ES - Capture the TempDB growth to determine the needed size for the TempDB database', @category_name = N'[Uncategorized (Local)]', @enabled = 1, @notify_level_email = 0, @notify_level_page = 0, @notify_level_netsend = 0, @notify_level_eventlog = 2, @delete_level= 0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the job steps
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N'EXEC dbo.spTempdbFileSize', @command = N'EXEC dbo.spTempdbFileSize', @database_name = N'TestTest', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the job schedules
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'Daily Every 6 Hours', @enabled = 1, @freq_type = 4, @active_start_date = 20070524, @active_start_time = 0, @freq_interval = 1, @freq_subday_type = 8, @freq_subday_interval = 6, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the Target Servers
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
Ejemplo de Consulta
SELECT * FROM dbo.TempDBFileSize;
GO
Próximos pasos
- Cuando usted se enfrenta con la determinación de que tamaño dar a su base de datos tempdb, considerar estas estadisticas como un medio para captar las necesidades de almacenamiento necesaria. Esta información debería servir como una guía para determinar el almacenamiento de la base de datos tempdb. Sin embargo, usted necesita considerar su conocimiento acerca de sus aplicaciones, procesos de negocio y el crecimiento futuro para determinar la configuración final.
- Tempdb puede ser utilizada duramente o no, y dependiendo de la aplicación y el mantenimiento de que se le de a SQL server, habrá que ver de redimensionar el tamaño de la base de datos correctamente, y puede convertirse en misión crítica si nos basamos en cómo se utiliza la base de datos.
- También es digno de su tiempo el revisar el código que se ejecuta durante el periodo cuando tempdb está creciendo rápidamente. Si este código se puede ajustar, tal vez el almacenamiento y los requisitos de E/S puede ser minimizada.