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

#6 Penta
08/05/2006 - 19:21 | Informe spam
Hola.
No fui el que comenzo el hilo, pero posteo mi resultado xD :

MISCELLANEOUS 0.0 0.0 0.0
LCK_M_SCH_S 0.0 0.0 0.0
LCK_M_SCH_M 0.0 0.0 0.0
LCK_M_S 0.0 0.0 0.0
LCK_M_U 0.0 0.0 0.0
LCK_M_X 0.0 0.0 0.0
LCK_M_IS 0.0 0.0 0.0
LCK_M_IU 0.0 0.0 0.0
LCK_M_IX 0.0 0.0 0.0
LCK_M_SIU 0.0 0.0 0.0
LCK_M_SIX 0.0 0.0 0.0
LCK_M_UIX 0.0 0.0 0.0
LCK_M_BU 0.0 0.0 0.0
LCK_M_RS_S 0.0 0.0 0.0
LCK_M_RS_U 0.0 0.0 0.0
LCK_M_RIn_NL 0.0 0.0 0.0
LCK_M_RIn_S 0.0 0.0 0.0
LCK_M_RIn_U 0.0 0.0 0.0
LCK_M_RIn_X 0.0 0.0 0.0
LCK_M_RX_S 0.0 0.0 0.0
LCK_M_RX_U 0.0 0.0 0.0
LCK_M_RX_X 0.0 0.0 0.0
SLEEP 352.0 352000.0 352000.0
IO_COMPLETION 0.0 0.0 0.0
ASYNC_IO_COMPLETION 0.0 0.0 0.0
RESOURCE_SEMAPHORE 0.0 0.0 0.0
DTC 0.0 0.0 0.0
OLEDB 130.0 1531.0 1.4470948E+9
FAILPOINT 0.0 0.0 0.0
RESOURCE_QUEUE 1089.0 698844.0 350000.0
ASYNC_DISKPOOL_LOCK 0.0 0.0 0.0
UMS_THREAD 0.0 0.0 0.0
PIPELINE_INDEX_STAT 0.0 0.0 0.0
PIPELINE_LOG 0.0 0.0 0.0
PIPELINE_VLM 0.0 0.0 0.0
WRITELOG 497.0 2178.0 15.0
LOGBUFFER 0.0 0.0 0.0
PSS_CHILD 0.0 0.0 0.0
EXCHANGE 0.0 0.0 0.0
XCB 0.0 0.0 0.0
DBTABLE 0.0 0.0 0.0
EC 0.0 0.0 0.0
TEMPOBJ 0.0 0.0 0.0
XACTLOCKINFO 0.0 0.0 0.0
LOGMGR 0.0 0.0 0.0
CMEMTHREAD 0.0 0.0 0.0
CXPACKET 0.0 0.0 0.0
PAGESUPP 0.0 0.0 0.0
SHUTDOWN 0.0 0.0 0.0
WAITFOR 0.0 0.0 0.0
CURSOR 0.0 0.0 0.0
EXECSYNC 0.0 0.0 0.0
LATCH_NL 0.0 0.0 0.0
LATCH_KP 0.0 0.0 0.0
LATCH_SH 0.0 0.0 0.0
LATCH_UP 0.0 0.0 0.0
LATCH_EX 0.0 0.0 0.0
LATCH_DT 0.0 0.0 0.0
PAGELATCH_NL 0.0 0.0 0.0
PAGELATCH_KP 0.0 0.0 0.0
PAGELATCH_SH 1.0 0.0 0.0
PAGELATCH_UP 106.0 0.0 0.0
PAGELATCH_EX 46.0 0.0 0.0
PAGELATCH_DT 0.0 0.0 0.0
PAGEIOLATCH_NL 0.0 0.0 0.0
PAGEIOLATCH_KP 0.0 0.0 0.0
PAGEIOLATCH_SH 33.0 109.0 0.0
PAGEIOLATCH_UP 0.0 0.0 0.0
PAGEIOLATCH_EX 35.0 156.0 0.0
PAGEIOLATCH_DT 0.0 0.0 0.0
TRAN_MARK_NL 0.0 0.0 0.0
TRAN_MARK_KP 0.0 0.0 0.0
TRAN_MARK_SH 0.0 0.0 0.0
TRAN_MARK_UP 0.0 0.0 0.0
TRAN_MARK_EX 0.0 0.0 0.0
TRAN_MARK_DT 0.0 0.0 0.0
NETWORKIO 888.0 515.0 0.0
Total 3177.0 1055333.0 1.4477967E+9


Me podrias explicar de que se trata ?

Mil Gracias.
Penta.


Eladio Rincón wrote:
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
#7 Miguel Egea
08/05/2006 - 20:13 | Informe spam
Hola penta, a falta de que el maestro Eladio nos comente más a fondo mi
sensación es que la mayor parte de tus esperas las tienes en la escritura en
disco de datos del log de transacciones (WRITELOG) y en OLEDB que es un saco
que engloba quizá demasiadas cosas.

Yo repasaría los parámetros que dice Gert Drappers en este link
http://sqldev.net/misc/WaitTypes.htm, sobre WRITELOG que básicamente es ver
la salud de los discos que tiene tu sistema, centrandote en donde tienes los
logs de transacciones. No te aparecen esperas por bloqueos, eso significa
que no estás experimentando ese tipo de problemas.

Tienes también algo de pageiolacth, no parece mucho, pero si acaso revisa
que tal andas de presion de memoria (me suena que bastante bien).

Saludos
Miguel Egea

"Penta" escribió en el mensaje
news:
Hola.
No fui el que comenzo el hilo, pero posteo mi resultado xD :

MISCELLANEOUS 0.0 0.0 0.0
LCK_M_SCH_S 0.0 0.0 0.0
LCK_M_SCH_M 0.0 0.0 0.0
LCK_M_S 0.0 0.0 0.0
LCK_M_U 0.0 0.0 0.0
LCK_M_X 0.0 0.0 0.0
LCK_M_IS 0.0 0.0 0.0
LCK_M_IU 0.0 0.0 0.0
LCK_M_IX 0.0 0.0 0.0
LCK_M_SIU 0.0 0.0 0.0
LCK_M_SIX 0.0 0.0 0.0
LCK_M_UIX 0.0 0.0 0.0
LCK_M_BU 0.0 0.0 0.0
LCK_M_RS_S 0.0 0.0 0.0
LCK_M_RS_U 0.0 0.0 0.0
LCK_M_RIn_NL 0.0 0.0 0.0
LCK_M_RIn_S 0.0 0.0 0.0
LCK_M_RIn_U 0.0 0.0 0.0
LCK_M_RIn_X 0.0 0.0 0.0
LCK_M_RX_S 0.0 0.0 0.0
LCK_M_RX_U 0.0 0.0 0.0
LCK_M_RX_X 0.0 0.0 0.0
SLEEP 352.0 352000.0 352000.0
IO_COMPLETION 0.0 0.0 0.0
ASYNC_IO_COMPLETION 0.0 0.0 0.0
RESOURCE_SEMAPHORE 0.0 0.0 0.0
DTC 0.0 0.0 0.0
OLEDB 130.0 1531.0 1.4470948E+9
FAILPOINT 0.0 0.0 0.0
RESOURCE_QUEUE 1089.0 698844.0 350000.0
ASYNC_DISKPOOL_LOCK 0.0 0.0 0.0
UMS_THREAD 0.0 0.0 0.0
PIPELINE_INDEX_STAT 0.0 0.0 0.0
PIPELINE_LOG 0.0 0.0 0.0
PIPELINE_VLM 0.0 0.0 0.0
WRITELOG 497.0 2178.0 15.0
LOGBUFFER 0.0 0.0 0.0
PSS_CHILD 0.0 0.0 0.0
EXCHANGE 0.0 0.0 0.0
XCB 0.0 0.0 0.0
DBTABLE 0.0 0.0 0.0
EC 0.0 0.0 0.0
TEMPOBJ 0.0 0.0 0.0
XACTLOCKINFO 0.0 0.0 0.0
LOGMGR 0.0 0.0 0.0
CMEMTHREAD 0.0 0.0 0.0
CXPACKET 0.0 0.0 0.0
PAGESUPP 0.0 0.0 0.0
SHUTDOWN 0.0 0.0 0.0
WAITFOR 0.0 0.0 0.0
CURSOR 0.0 0.0 0.0
EXECSYNC 0.0 0.0 0.0
LATCH_NL 0.0 0.0 0.0
LATCH_KP 0.0 0.0 0.0
LATCH_SH 0.0 0.0 0.0
LATCH_UP 0.0 0.0 0.0
LATCH_EX 0.0 0.0 0.0
LATCH_DT 0.0 0.0 0.0
PAGELATCH_NL 0.0 0.0 0.0
PAGELATCH_KP 0.0 0.0 0.0
PAGELATCH_SH 1.0 0.0 0.0
PAGELATCH_UP 106.0 0.0 0.0
PAGELATCH_EX 46.0 0.0 0.0
PAGELATCH_DT 0.0 0.0 0.0
PAGEIOLATCH_NL 0.0 0.0 0.0
PAGEIOLATCH_KP 0.0 0.0 0.0
PAGEIOLATCH_SH 33.0 109.0 0.0
PAGEIOLATCH_UP 0.0 0.0 0.0
PAGEIOLATCH_EX 35.0 156.0 0.0
PAGEIOLATCH_DT 0.0 0.0 0.0
TRAN_MARK_NL 0.0 0.0 0.0
TRAN_MARK_KP 0.0 0.0 0.0
TRAN_MARK_SH 0.0 0.0 0.0
TRAN_MARK_UP 0.0 0.0 0.0
TRAN_MARK_EX 0.0 0.0 0.0
TRAN_MARK_DT 0.0 0.0 0.0
NETWORKIO 888.0 515.0 0.0
Total 3177.0 1055333.0 1.4477967E+9


Me podrias explicar de que se trata ?

Mil Gracias.
Penta.


Eladio Rincón wrote:
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
#8 Penta
08/05/2006 - 21:52 | Informe spam
Perfecto, pero me podrias explicar las columnas ? o mas bien como
interpretarlas ?

Wait Type Request Wait Time Signal Wait Time
WRITELOG 497.0 2178.0 15.0

Te comento :
El servidor esta en RAID 1
La BD esta en el disco E: y el log en el F:
No da para mas el presupuesto xD

Se agradece.
Penta.
Respuesta Responder a este mensaje
#9 Eladio Rincón
09/05/2006 - 00:07 | Informe spam
la espera por writelog indica que los procesos (y/o threads), han estado
esperando 497 veces para escribir en el registro de transacciones. En
concreto, cada petición de escritura en el transaction log, ha tenido que
esperar 4.3 milisegundos: tienen un problema de escritura!.

Uno de nuestros trabajos en Solid, es detectar y solucionar este tipo de
problemas; desde la distancia de no poder ver un dibujo completo del
sistema, mi conclusión es que tienes un problema de escritura en las
unidades físicas.

Comentas que tienes unidad E, y F; ¿corresponden a la misma unidad física?
si es así, ahí tienes el problema.

Sobre el presupuesto, no conozco tu empresa, pero por 600-700$ comienzas a
tener buenos discos, por lo que no sería tanta pasta...

Saludos,

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

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

"Penta" wrote in message
news:
Perfecto, pero me podrias explicar las columnas ? o mas bien como
interpretarlas ?

Wait Type Request Wait Time Signal Wait Time
WRITELOG 497.0 2178.0 15.0

Te comento :
El servidor esta en RAID 1
La BD esta en el disco E: y el log en el F:
No da para mas el presupuesto xD

Se agradece.
Penta.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida