Afinamiento...

05/05/2006 - 21:40 por Edmundo J. Davila | Informe spam
Estimad@s colegas,

Tengo una base con un nivel transaccional elevado (tiene 11 GB) y una
cantidad de indices en tablas altamente transaccionales que en mi opinion es
exagerado. Esta base de datos es de una aplicacion comercial de terceros,
por lo que borrar algunos indices que en mi opinion no son tan relevantes,
me parece una alternativa arriesgada. En mi servidor tengo windows 2000
server y sql server 2000 ent. edi. El servidor tiene 2 procesadores xeon de
3.6GHZ y 2GB de RAM, tengo implementado un raid 1 con 2 DD de 36.4 GB. Este
Raid tiene 2 unidades logicas, una para el SO y otra para la BD.

Para mejorar el rendimiento de la aplicacion, optamos por crear un job que
se ejecuta diariamente para reconstruir indices con un fill factor del 80% y
tambien realiza un chequeo de integridad. Mi pregunta es que tan
recomendable es reconstruir indices diariamente y que tanto pueden afectarse
las estadisticas de uso en el servidor, de tal forma que impacte en el
rendimiento de la aplicacion, ya que apartir de la ejecucion diaria de este
job no se han sentido mejoras significativas.

Adjunto script del job por si les sirve para analizarlo. De antemano
gracias por sus comentarios.

Edmundo J. Davila



BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'Database
Maintenance') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'Database Maintenance'

SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'EXACTUS - Mantenimiento diario')
IF (@JobID IS NOT NULL)
BEGIN
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
RAISERROR (N'Unable to import job ''EXACTUS - Mantenimiento diario''
since there is already a multi-server job with this name.', 16, 1)
GOTO QuitWithRollback
END
ELSE
EXECUTE msdb.dbo.sp_delete_job @job_name = N'EXACTUS - Mantenimiento
diario'
SELECT @JobID = NULL
END

BEGIN

EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT ,
@job_name = N'EXACTUS - Mantenimiento diario', @owner_login_name =
N'MONISAIII\Administrator', @description = N'No description available.',
@category_name = N'Database Maintenance', @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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
1, @step_name = N'LOG BACKUP', @command = N'BACKUP LOG [Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH NOINIT , NOUNLOAD , NAME = N''Exactus Log backup'',
NOSKIP , STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id = 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
2, @step_name = N'LOG TRUNCATE', @command = N'BACKUP LOG Exactus
WITH TRUNCATE_ONLY', @database_name = N'master', @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 = 3, @on_fail_step_id = 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
3, @step_name = N'LOG SHRINK', @command = N'dbcc shrinkfile
(''Exactus_db_log'', 100)', @database_name = N'Exactus', @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 = 3, @on_fail_step_id = 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
4, @step_name = N'INTEGRITY CHECK WITH REPAIR OF MINOR ERRORS', @command =
N'use master

alter database exactus set SINGLE_USER
WITH ROLLBACK IMMEDIATE

DBCC CHECKDB( ''exactus'', REPAIR_FAST)

alter database exactus set MULTI_USER
with ROLLBACK IMMEDIATE
', @database_name = N'master', @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 = 3, @on_fail_step_id = 0, @on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
5, @step_name = N'OPTIMIZATION. INDEX REBUILD', @command = N'EXECUTE
master.dbo.xp_sqlmaint N''-D Exactus -WriteHistory -RebldIdx
15 -RmUnusedSpace 50 10 ''', @database_name = N'master', @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 = 3, @on_fail_step_id = 0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
6, @step_name = N'COMPLETE DB BACKUP', @command = N'BACKUP DATABASE
[Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH INIT , NOUNLOAD ,
NAME = N''Exactus backup'', NOSKIP ,
STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id = 0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
7, @step_name = N'TURN OFF THE SERVER', @command = N'Set wmi =
GetObject("winmgmts:{(Shutdown)}//./root/cimv2")
set objset = wmi.instancesof("win32_operatingsystem")
for each obj in objset
set os = obj : exit for
next

os.win32shutdown (8)', @database_name = N'VBScript', @server = N'',
@database_user_name = N'', @subsystem = N'ActiveScripting',
@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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name
= N'Diario', @enabled = 1, @freq_type = 8, @active_start_date = 20060428,
@active_start_time = 213000, @freq_interval = 62, @freq_subday_type = 1,
@freq_subday_interval = 0, @freq_relative_interval = 0,
@freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time =
235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

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:

Preguntas similare

Leer las respuestas

#1 Isaias
05/05/2006 - 23:15 | Informe spam
Dices que tiene 11 GB, ¿en Datos, en Log?, ¿Tienes un PLAN DE MANTENIMIENTO?,
¿Depuras el Log de transacciones?, ¿Se generan en AUTOMATICO tus estadisticos?
Saludos
IIslas


"Edmundo J. Davila" escribió:

colegas,

Tengo una base con un nivel transaccional elevado (tiene 11 GB) y una
cantidad de indices en tablas altamente transaccionales que en mi opinion es
exagerado. Esta base de datos es de una aplicacion comercial de terceros,
por lo que borrar algunos indices que en mi opinion no son tan relevantes,
me parece una alternativa arriesgada. En mi servidor tengo windows 2000
server y sql server 2000 ent. edi. El servidor tiene 2 procesadores xeon de
3.6GHZ y 2GB de RAM, tengo implementado un raid 1 con 2 DD de 36.4 GB. Este
Raid tiene 2 unidades logicas, una para el SO y otra para la BD.

Para mejorar el rendimiento de la aplicacion, optamos por crear un job que
se ejecuta diariamente para reconstruir indices con un fill factor del 80% y
tambien realiza un chequeo de integridad. Mi pregunta es que tan
recomendable es reconstruir indices diariamente y que tanto pueden afectarse
las estadisticas de uso en el servidor, de tal forma que impacte en el
rendimiento de la aplicacion, ya que apartir de la ejecucion diaria de este
job no se han sentido mejoras significativas.

Adjunto script del job por si les sirve para analizarlo. De antemano
gracias por sus comentarios.

Edmundo J. Davila



BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'Database
Maintenance') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'Database Maintenance'

SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'EXACTUS - Mantenimiento diario')
IF (@JobID IS NOT NULL)
BEGIN
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
RAISERROR (N'Unable to import job ''EXACTUS - Mantenimiento diario''
since there is already a multi-server job with this name.', 16, 1)
GOTO QuitWithRollback
END
ELSE
EXECUTE msdb.dbo.sp_delete_job @job_name = N'EXACTUS - Mantenimiento
diario'
SELECT @JobID = NULL
END

BEGIN

EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT ,
@job_name = N'EXACTUS - Mantenimiento diario', @owner_login_name =
N'MONISAIII\Administrator', @description = N'No description available.',
@category_name = N'Database Maintenance', @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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
1, @step_name = N'LOG BACKUP', @command = N'BACKUP LOG [Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH NOINIT , NOUNLOAD , NAME = N''Exactus Log backup'',
NOSKIP , STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id = 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
2, @step_name = N'LOG TRUNCATE', @command = N'BACKUP LOG Exactus
WITH TRUNCATE_ONLY', @database_name = N'master', @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 = 3, @on_fail_step_id = 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
3, @step_name = N'LOG SHRINK', @command = N'dbcc shrinkfile
(''Exactus_db_log'', 100)', @database_name = N'Exactus', @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 = 3, @on_fail_step_id = 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
4, @step_name = N'INTEGRITY CHECK WITH REPAIR OF MINOR ERRORS', @command =
N'use master

alter database exactus set SINGLE_USER
WITH ROLLBACK IMMEDIATE

DBCC CHECKDB( ''exactus'', REPAIR_FAST)

alter database exactus set MULTI_USER
with ROLLBACK IMMEDIATE
', @database_name = N'master', @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 = 3, @on_fail_step_id = 0, @on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
5, @step_name = N'OPTIMIZATION. INDEX REBUILD', @command = N'EXECUTE
master.dbo.xp_sqlmaint N''-D Exactus -WriteHistory -RebldIdx
15 -RmUnusedSpace 50 10 ''', @database_name = N'master', @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 = 3, @on_fail_step_id = 0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
6, @step_name = N'COMPLETE DB BACKUP', @command = N'BACKUP DATABASE
[Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH INIT , NOUNLOAD ,
NAME = N''Exactus backup'', NOSKIP ,
STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id = 0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id =
7, @step_name = N'TURN OFF THE SERVER', @command = N'Set wmi =
GetObject("winmgmts:{(Shutdown)}//./root/cimv2")
set objset = wmi.instancesof("win32_operatingsystem")
for each obj in objset
set os = obj : exit for
next

os.win32shutdown (8)', @database_name = N'VBScript', @server = N'',
@database_user_name = N'', @subsystem = N'ActiveScripting',
@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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name
= N'Diario', @enabled = 1, @freq_type = 8, @active_start_date = 20060428,
@active_start_time = 213000, @freq_interval = 62, @freq_subday_type = 1,
@freq_subday_interval = 0, @freq_relative_interval = 0,
@freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time =
235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

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:



Respuesta Responder a este mensaje
#2 Antonio Ortiz
06/05/2006 - 20:31 | Informe spam
Cuidado, en una auditoria a una base de detos SQL Server, pense lo mismo que
tu y elimine algunos indices 'innecesario' y el resultado fue que la
aplicacion dejo de funcionar. Por supuesto debido a malos habitos de
programacion, pero podria pasar.


suerte,

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com



"Edmundo J. Davila" escribió en el mensaje
news:
colegas,

Tengo una base con un nivel transaccional elevado (tiene 11 GB) y una
cantidad de indices en tablas altamente transaccionales que en mi opinion
es exagerado. Esta base de datos es de una aplicacion comercial de
terceros, por lo que borrar algunos indices que en mi opinion no son tan
relevantes, me parece una alternativa arriesgada. En mi servidor tengo
windows 2000 server y sql server 2000 ent. edi. El servidor tiene 2
procesadores xeon de 3.6GHZ y 2GB de RAM, tengo implementado un raid 1 con
2 DD de 36.4 GB. Este Raid tiene 2 unidades logicas, una para el SO y
otra para la BD.

Para mejorar el rendimiento de la aplicacion, optamos por crear un job que
se ejecuta diariamente para reconstruir indices con un fill factor del 80%
y tambien realiza un chequeo de integridad. Mi pregunta es que tan
recomendable es reconstruir indices diariamente y que tanto pueden
afectarse las estadisticas de uso en el servidor, de tal forma que impacte
en el rendimiento de la aplicacion, ya que apartir de la ejecucion diaria
de este job no se han sentido mejoras significativas.

Adjunto script del job por si les sirve para analizarlo. De antemano
gracias por sus comentarios.

Edmundo J. Davila



BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'Database
Maintenance') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'Database Maintenance'

SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'EXACTUS - Mantenimiento diario')
IF (@JobID IS NOT NULL)
BEGIN
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
RAISERROR (N'Unable to import job ''EXACTUS - Mantenimiento diario''
since there is already a multi-server job with this name.', 16, 1)
GOTO QuitWithRollback
END
ELSE
EXECUTE msdb.dbo.sp_delete_job @job_name = N'EXACTUS - Mantenimiento
diario'
SELECT @JobID = NULL
END

BEGIN

EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT ,
@job_name = N'EXACTUS - Mantenimiento diario', @owner_login_name =
N'MONISAIII\Administrator', @description = N'No description available.',
@category_name = N'Database Maintenance', @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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 1, @step_name = N'LOG BACKUP', @command = N'BACKUP LOG [Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH NOINIT , NOUNLOAD , NAME = N''Exactus Log backup'',
NOSKIP , STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id = 4, @on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 2, @step_name = N'LOG TRUNCATE', @command = N'BACKUP LOG Exactus
WITH TRUNCATE_ONLY', @database_name = N'master', @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 = 3, @on_fail_step_id =
4, @on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 3, @step_name = N'LOG SHRINK', @command = N'dbcc shrinkfile
(''Exactus_db_log'', 100)', @database_name = N'Exactus', @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 = 3, @on_fail_step_id =
4, @on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 4, @step_name = N'INTEGRITY CHECK WITH REPAIR OF MINOR ERRORS', @command
= N'use master

alter database exactus set SINGLE_USER
WITH ROLLBACK IMMEDIATE

DBCC CHECKDB( ''exactus'', REPAIR_FAST)

alter database exactus set MULTI_USER
with ROLLBACK IMMEDIATE
', @database_name = N'master', @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 = 3, @on_fail_step_id = 0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 5, @step_name = N'OPTIMIZATION. INDEX REBUILD', @command = N'EXECUTE
master.dbo.xp_sqlmaint N''-D Exactus -WriteHistory -RebldIdx
15 -RmUnusedSpace 50 10 ''', @database_name = N'master', @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 = 3, @on_fail_step_id =
0, @on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 6, @step_name = N'COMPLETE DB BACKUP', @command = N'BACKUP DATABASE
[Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH INIT , NOUNLOAD ,
NAME = N''Exactus backup'', NOSKIP ,
STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id =
0, @on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 7, @step_name = N'TURN OFF THE SERVER', @command = N'Set wmi =
GetObject("winmgmts:{(Shutdown)}//./root/cimv2")
set objset = wmi.instancesof("win32_operatingsystem")
for each obj in objset
set os = obj : exit for
next

os.win32shutdown (8)', @database_name = N'VBScript', @server = N'',
@database_user_name = N'', @subsystem = N'ActiveScripting',
@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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name
= N'Diario', @enabled = 1, @freq_type = 8, @active_start_date = 20060428,
@active_start_time = 213000, @freq_interval = 62, @freq_subday_type = 1,
@freq_subday_interval = 0, @freq_relative_interval = 0,
@freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time
= 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

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:

Respuesta Responder a este mensaje
#3 Eladio Rincón
07/05/2006 - 02:19 | Informe spam
Hola Edmundo,

no nos has comentado cuales son los problemas que tienes en el servidor;
antes de focalizarte en resolver problemas (asumes indexación), deberás
saber cual es la causa de que el sistema no rinda eficientemente...

te sugiero una prueba muy rápida y sencilla; ejecuta el siguiente código en
tu servidor (no se va a romper nada, está soportado por MS y no afecta al
rendimiento):
dbcc sqlperf (waitstats, clear)

espera 5-10 minutos, y ejecuta:
dbcc sqlperf (waitstats)

postea el resultado y le echamos un vistazo...

Saludos,

Eladio Rincón,
http://www.siquelnet.com

Mentor, SQL Server MVP
Solid Quality Learning Iberoamericana
http://www.solidqualitylearning.com

"Edmundo J. Davila" wrote in message
news:
colegas,

Tengo una base con un nivel transaccional elevado (tiene 11 GB) y una
cantidad de indices en tablas altamente transaccionales que en mi opinion
es exagerado. Esta base de datos es de una aplicacion comercial de
terceros, por lo que borrar algunos indices que en mi opinion no son tan
relevantes, me parece una alternativa arriesgada. En mi servidor tengo
windows 2000 server y sql server 2000 ent. edi. El servidor tiene 2
procesadores xeon de 3.6GHZ y 2GB de RAM, tengo implementado un raid 1 con
2 DD de 36.4 GB. Este Raid tiene 2 unidades logicas, una para el SO y
otra para la BD.

Para mejorar el rendimiento de la aplicacion, optamos por crear un job que
se ejecuta diariamente para reconstruir indices con un fill factor del 80%
y tambien realiza un chequeo de integridad. Mi pregunta es que tan
recomendable es reconstruir indices diariamente y que tanto pueden
afectarse las estadisticas de uso en el servidor, de tal forma que impacte
en el rendimiento de la aplicacion, ya que apartir de la ejecucion diaria
de este job no se han sentido mejoras significativas.

Adjunto script del job por si les sirve para analizarlo. De antemano
gracias por sus comentarios.

Edmundo J. Davila



BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'Database
Maintenance') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'Database Maintenance'

SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'EXACTUS - Mantenimiento diario')
IF (@JobID IS NOT NULL)
BEGIN
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
RAISERROR (N'Unable to import job ''EXACTUS - Mantenimiento diario''
since there is already a multi-server job with this name.', 16, 1)
GOTO QuitWithRollback
END
ELSE
EXECUTE msdb.dbo.sp_delete_job @job_name = N'EXACTUS - Mantenimiento
diario'
SELECT @JobID = NULL
END

BEGIN

EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT ,
@job_name = N'EXACTUS - Mantenimiento diario', @owner_login_name =
N'MONISAIII\Administrator', @description = N'No description available.',
@category_name = N'Database Maintenance', @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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 1, @step_name = N'LOG BACKUP', @command = N'BACKUP LOG [Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH NOINIT , NOUNLOAD , NAME = N''Exactus Log backup'',
NOSKIP , STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id = 4, @on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 2, @step_name = N'LOG TRUNCATE', @command = N'BACKUP LOG Exactus
WITH TRUNCATE_ONLY', @database_name = N'master', @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 = 3, @on_fail_step_id =
4, @on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 3, @step_name = N'LOG SHRINK', @command = N'dbcc shrinkfile
(''Exactus_db_log'', 100)', @database_name = N'Exactus', @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 = 3, @on_fail_step_id =
4, @on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 4, @step_name = N'INTEGRITY CHECK WITH REPAIR OF MINOR ERRORS', @command
= N'use master

alter database exactus set SINGLE_USER
WITH ROLLBACK IMMEDIATE

DBCC CHECKDB( ''exactus'', REPAIR_FAST)

alter database exactus set MULTI_USER
with ROLLBACK IMMEDIATE
', @database_name = N'master', @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 = 3, @on_fail_step_id = 0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 5, @step_name = N'OPTIMIZATION. INDEX REBUILD', @command = N'EXECUTE
master.dbo.xp_sqlmaint N''-D Exactus -WriteHistory -RebldIdx
15 -RmUnusedSpace 50 10 ''', @database_name = N'master', @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 = 3, @on_fail_step_id =
0, @on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 6, @step_name = N'COMPLETE DB BACKUP', @command = N'BACKUP DATABASE
[Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH INIT , NOUNLOAD ,
NAME = N''Exactus backup'', NOSKIP ,
STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id =
0, @on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id
= 7, @step_name = N'TURN OFF THE SERVER', @command = N'Set wmi =
GetObject("winmgmts:{(Shutdown)}//./root/cimv2")
set objset = wmi.instancesof("win32_operatingsystem")
for each obj in objset
set os = obj : exit for
next

os.win32shutdown (8)', @database_name = N'VBScript', @server = N'',
@database_user_name = N'', @subsystem = N'ActiveScripting',
@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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name
= N'Diario', @enabled = 1, @freq_type = 8, @active_start_date = 20060428,
@active_start_time = 213000, @freq_interval = 62, @freq_subday_type = 1,
@freq_subday_interval = 0, @freq_relative_interval = 0,
@freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time
= 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

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:

Respuesta Responder a este mensaje
#4 Miguel Egea
08/05/2006 - 12:37 | Informe spam
No edmndo, no trunques el log, no le hagas shrink ?porque has de hacerselo?,
voy a ver si escribo un artículo para portalsql con estas recomendaciones.

De todas formas 11 GB es una base de datos pequeña, y debería sobrarte con
el server que tienes, tendrás que buscar consultas agresivas, pon una traza
de profiler que te caze todas las consultas con duración mayor que 500 y de
las 5 o 6 que más se repitan postea alguna aquí a ver si te ayudamos a
optimizar esto.


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar para
obtener soluciones y educación avanzada para la plataforma completa de
sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"Edmundo J. Davila" escribió en el mensaje
news:Olc%
Isaias,

Son 11 GB de datos, aunque el dispositivo tiene solamente 10 GB ocupados y
casi 2GB vacios, pese a que he hecho shrink de la BD. El job siempre se
mantiene al minimo porque se hacen 2 Backups completos de la BD en el dia
y antes de hacerlos "shrinkeo" y trunco el log. Las estadisticas en el
server estan configuradas para actualizarse de forma automatica. No hay
un plan de mantenmiento como tal, sin embargo, el job lo que hace son
todos los pasos del plan de mantenimiento, pero para no tenerlos por
separados los puse en un solo job con varios pasos.
Pero los pasos incluyen:

1. Backup del log
2. Shrink del log
3. Truncate del log
4. Chequeo de integridad
5. Optimizacion, rescontruccion de indices y correcion de problemas
menores
6. Respaldo completo de la BD

El asunto que yo pense que por reconstruir indices y optimizar diario iba
a notar alguna mejoria significativa en el rendimiento de la aplicacion y
no ha sido asi.



"Isaias" escribió en el mensaje
news:
Dices que tiene 11 GB, ¿en Datos, en Log?, ¿Tienes un PLAN DE
MANTENIMIENTO?,
¿Depuras el Log de transacciones?, ¿Se generan en AUTOMATICO tus
estadisticos?
Saludos
IIslas


"Edmundo J. Davila" escribió:

colegas,

Tengo una base con un nivel transaccional elevado (tiene 11 GB) y una
cantidad de indices en tablas altamente transaccionales que en mi
opinion es
exagerado. Esta base de datos es de una aplicacion comercial de
terceros,
por lo que borrar algunos indices que en mi opinion no son tan
relevantes,
me parece una alternativa arriesgada. En mi servidor tengo windows 2000
server y sql server 2000 ent. edi. El servidor tiene 2 procesadores
xeon de
3.6GHZ y 2GB de RAM, tengo implementado un raid 1 con 2 DD de 36.4 GB.
Este
Raid tiene 2 unidades logicas, una para el SO y otra para la BD.

Para mejorar el rendimiento de la aplicacion, optamos por crear un job
que
se ejecuta diariamente para reconstruir indices con un fill factor del
80% y
tambien realiza un chequeo de integridad. Mi pregunta es que tan
recomendable es reconstruir indices diariamente y que tanto pueden
afectarse
las estadisticas de uso en el servidor, de tal forma que impacte en el
rendimiento de la aplicacion, ya que apartir de la ejecucion diaria de
este
job no se han sentido mejoras significativas.

Adjunto script del job por si les sirve para analizarlo. De antemano
gracias por sus comentarios.

Edmundo J. Davila



BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'Database
Maintenance') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'Database Maintenance'

SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'EXACTUS - Mantenimiento diario')
IF (@JobID IS NOT NULL)
BEGIN
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
RAISERROR (N'Unable to import job ''EXACTUS - Mantenimiento diario''
since there is already a multi-server job with this name.', 16, 1)
GOTO QuitWithRollback
END
ELSE
EXECUTE msdb.dbo.sp_delete_job @job_name = N'EXACTUS - Mantenimiento
diario'
SELECT @JobID = NULL
END

BEGIN

EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT ,
@job_name = N'EXACTUS - Mantenimiento diario', @owner_login_name >>> N'MONISAIII\Administrator', @description = N'No description available.',
@category_name = N'Database Maintenance', @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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>> 1, @step_name = N'LOG BACKUP', @command = N'BACKUP LOG [Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH NOINIT , NOUNLOAD , NAME = N''Exactus Log backup'',
NOSKIP , STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id =
4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>> 2, @step_name = N'LOG TRUNCATE', @command = N'BACKUP LOG Exactus
WITH TRUNCATE_ONLY', @database_name = N'master', @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 = 3, @on_fail_step_id =
4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>> 3, @step_name = N'LOG SHRINK', @command = N'dbcc shrinkfile
(''Exactus_db_log'', 100)', @database_name = N'Exactus', @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 = 3, @on_fail_step_id =
4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>> 4, @step_name = N'INTEGRITY CHECK WITH REPAIR OF MINOR ERRORS', @command
>>> N'use master

alter database exactus set SINGLE_USER
WITH ROLLBACK IMMEDIATE

DBCC CHECKDB( ''exactus'', REPAIR_FAST)

alter database exactus set MULTI_USER
with ROLLBACK IMMEDIATE
', @database_name = N'master', @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 = 3, @on_fail_step_id = 0, @on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>> 5, @step_name = N'OPTIMIZATION. INDEX REBUILD', @command = N'EXECUTE
master.dbo.xp_sqlmaint N''-D Exactus -WriteHistory -RebldIdx
15 -RmUnusedSpace 50 10 ''', @database_name = N'master', @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 = 3, @on_fail_step_id =
0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>> 6, @step_name = N'COMPLETE DB BACKUP', @command = N'BACKUP DATABASE
[Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH INIT , NOUNLOAD ,
NAME = N''Exactus backup'', NOSKIP ,
STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id =
0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>> 7, @step_name = N'TURN OFF THE SERVER', @command = N'Set wmi >>> GetObject("winmgmts:{(Shutdown)}//./root/cimv2")
set objset = wmi.instancesof("win32_operatingsystem")
for each obj in objset
set os = obj : exit for
next

os.win32shutdown (8)', @database_name = N'VBScript', @server = N'',
@database_user_name = N'', @subsystem = N'ActiveScripting',
@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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID,
@name
= N'Diario', @enabled = 1, @freq_type = 8, @active_start_date =
20060428,
@active_start_time = 213000, @freq_interval = 62, @freq_subday_type = 1,
@freq_subday_interval = 0, @freq_relative_interval = 0,
@freq_recurrence_factor = 1, @active_end_date = 99991231,
@active_end_time >>> 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

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:










Respuesta Responder a este mensaje
#5 Miguel Egea
08/05/2006 - 13:26 | Informe spam
Bueno Edmundo, aquí he puesto un pequeño artículo en el que explico porqué
no me gusta el shrink
http://www.configuracionesintegrale...articulo10

Saludos
Miguel Egea
"Miguel Egea" escribió en el mensaje
news:%
No edmndo, no trunques el log, no le hagas shrink ?porque has de
hacerselo?, voy a ver si escribo un artículo para portalsql con estas
recomendaciones.

De todas formas 11 GB es una base de datos pequeña, y debería sobrarte con
el server que tienes, tendrás que buscar consultas agresivas, pon una
traza de profiler que te caze todas las consultas con duración mayor que
500 y de las 5 o 6 que más se repitan postea alguna aquí a ver si te
ayudamos a optimizar esto.


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para obtener soluciones y educación avanzada para la plataforma completa
de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"Edmundo J. Davila" escribió en el mensaje
news:Olc%
Isaias,

Son 11 GB de datos, aunque el dispositivo tiene solamente 10 GB ocupados
y casi 2GB vacios, pese a que he hecho shrink de la BD. El job siempre
se mantiene al minimo porque se hacen 2 Backups completos de la BD en el
dia y antes de hacerlos "shrinkeo" y trunco el log. Las estadisticas en
el server estan configuradas para actualizarse de forma automatica. No
hay un plan de mantenmiento como tal, sin embargo, el job lo que hace son
todos los pasos del plan de mantenimiento, pero para no tenerlos por
separados los puse en un solo job con varios pasos.
Pero los pasos incluyen:

1. Backup del log
2. Shrink del log
3. Truncate del log
4. Chequeo de integridad
5. Optimizacion, rescontruccion de indices y correcion de problemas
menores
6. Respaldo completo de la BD

El asunto que yo pense que por reconstruir indices y optimizar diario iba
a notar alguna mejoria significativa en el rendimiento de la aplicacion y
no ha sido asi.



"Isaias" escribió en el mensaje
news:
Dices que tiene 11 GB, ¿en Datos, en Log?, ¿Tienes un PLAN DE
MANTENIMIENTO?,
¿Depuras el Log de transacciones?, ¿Se generan en AUTOMATICO tus
estadisticos?
Saludos
IIslas


"Edmundo J. Davila" escribió:

colegas,

Tengo una base con un nivel transaccional elevado (tiene 11 GB) y una
cantidad de indices en tablas altamente transaccionales que en mi
opinion es
exagerado. Esta base de datos es de una aplicacion comercial de
terceros,
por lo que borrar algunos indices que en mi opinion no son tan
relevantes,
me parece una alternativa arriesgada. En mi servidor tengo windows
2000
server y sql server 2000 ent. edi. El servidor tiene 2 procesadores
xeon de
3.6GHZ y 2GB de RAM, tengo implementado un raid 1 con 2 DD de 36.4 GB.
Este
Raid tiene 2 unidades logicas, una para el SO y otra para la BD.

Para mejorar el rendimiento de la aplicacion, optamos por crear un job
que
se ejecuta diariamente para reconstruir indices con un fill factor del
80% y
tambien realiza un chequeo de integridad. Mi pregunta es que tan
recomendable es reconstruir indices diariamente y que tanto pueden
afectarse
las estadisticas de uso en el servidor, de tal forma que impacte en el
rendimiento de la aplicacion, ya que apartir de la ejecucion diaria de
este
job no se han sentido mejoras significativas.

Adjunto script del job por si les sirve para analizarlo. De antemano
gracias por sus comentarios.

Edmundo J. Davila



BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'Database
Maintenance') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'Database Maintenance'

SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'EXACTUS - Mantenimiento diario')
IF (@JobID IS NOT NULL)
BEGIN
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
RAISERROR (N'Unable to import job ''EXACTUS - Mantenimiento
diario''
since there is already a multi-server job with this name.', 16, 1)
GOTO QuitWithRollback
END
ELSE
EXECUTE msdb.dbo.sp_delete_job @job_name = N'EXACTUS -
Mantenimiento
diario'
SELECT @JobID = NULL
END

BEGIN

EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT ,
@job_name = N'EXACTUS - Mantenimiento diario', @owner_login_name >>>> N'MONISAIII\Administrator', @description = N'No description
available.',
@category_name = N'Database Maintenance', @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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>>> 1, @step_name = N'LOG BACKUP', @command = N'BACKUP LOG [Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH NOINIT , NOUNLOAD , NAME = N''Exactus Log backup'',
NOSKIP , STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id
= 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>>> 2, @step_name = N'LOG TRUNCATE', @command = N'BACKUP LOG Exactus
WITH TRUNCATE_ONLY', @database_name = N'master', @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 = 3, @on_fail_step_id
= 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>>> 3, @step_name = N'LOG SHRINK', @command = N'dbcc shrinkfile
(''Exactus_db_log'', 100)', @database_name = N'Exactus', @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 = 3, @on_fail_step_id
= 4,
@on_fail_action = 4
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>>> 4, @step_name = N'INTEGRITY CHECK WITH REPAIR OF MINOR ERRORS',
@command >>>> N'use master

alter database exactus set SINGLE_USER
WITH ROLLBACK IMMEDIATE

DBCC CHECKDB( ''exactus'', REPAIR_FAST)

alter database exactus set MULTI_USER
with ROLLBACK IMMEDIATE
', @database_name = N'master', @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 = 3, @on_fail_step_id = 0, @on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>>> 5, @step_name = N'OPTIMIZATION. INDEX REBUILD', @command = N'EXECUTE
master.dbo.xp_sqlmaint N''-D Exactus -WriteHistory -RebldIdx
15 -RmUnusedSpace 50 10 ''', @database_name = N'master', @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 = 3, @on_fail_step_id
= 0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>>> 6, @step_name = N'COMPLETE DB BACKUP', @command = N'BACKUP DATABASE
[Exactus]
TO DISK = N''E:\Respaldo2K\ExactusBK''
WITH INIT , NOUNLOAD ,
NAME = N''Exactus backup'', NOSKIP ,
STATS = 10, NOFORMAT', @database_name = N'master', @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 = 3, @on_fail_step_id
= 0,
@on_fail_action = 3
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID,
@step_id >>>> 7, @step_name = N'TURN OFF THE SERVER', @command = N'Set wmi >>>> GetObject("winmgmts:{(Shutdown)}//./root/cimv2")
set objset = wmi.instancesof("win32_operatingsystem")
for each obj in objset
set os = obj : exit for
next

os.win32shutdown (8)', @database_name = N'VBScript', @server = N'',
@database_user_name = N'', @subsystem = N'ActiveScripting',
@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

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID,
@name
= N'Diario', @enabled = 1, @freq_type = 8, @active_start_date =
20060428,
@active_start_time = 213000, @freq_interval = 62, @freq_subday_type =
1,
@freq_subday_interval = 0, @freq_relative_interval = 0,
@freq_recurrence_factor = 1, @active_end_date = 99991231,
@active_end_time >>>> 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

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:














Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida