Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/03/2012, 21:47
cancha
 
Fecha de Ingreso: junio-2007
Mensajes: 75
Antigüedad: 16 años, 10 meses
Puntos: 1
Bloqueos problematicos

Hola amigos,

tengo un cliente que su DB usada por un aproximado de 60 clientes(pc), antes que yo llegara me comentaron que tenían muchos problemas con lentitud y bloqueos

el sistema que usan esta hecho en vb6 con sql server 2008

lo primero que hice fue identificar las consultas que mas demoraban y usando el analizador de planes de ejecución me recomendaba crear indices para mejorar las consultas los fui creando conforme identificada las consultas problemáticas y veía su plan de ejecución y las recomendaciones que sugería y posteriormente casi 2 semanas no hubo mucha incidencia de bloqueos, pensé que los indices ayudaron mucho..

pero luego volvió a parecer el problema y el tiempo de espera total llegaba hasta en algunos días a 5 horas, adjunto un gráfico con los tiempos de espera total por día



aquí algunas imágenes de días específicos la barra de color plomizo representa los bloqueos






en el tiempo que se presentaron los problemas y bloqueos agregue unos cuantos indices mas, los problemas empezaron al día siguiente que agregue algunos indices poco a poco fue aumentando y haciéndose mas larga los tiempos de espera por bloqueo, creen que pueda ser los indices la causa de esto?

use esta consulta para identificar los indices que podrían ayudar a mejorar las consultas

Código SQL:
Ver original
  1. SELECT
  2. db_name(d.database_id) AS DB,
  3. object_name(d.object_id, d.database_id) tabla,
  4. s.avg_user_impact, s.user_seeks,
  5. d.equality_columns, d.inequality_columns, d.included_columns,
  6. p.ROW_COUNT, l.num_esperas, l.ms_esperas, s.last_user_seek,
  7. create_index = REPLACE('create nonclustered index IX_' +
  8. object_name(d.object_id, d.database_id) +'_A# on ' +
  9. object_name(d.object_id, d.database_id) + ' (' +
  10. isnull(d.equality_columns + ',', '') + isnull(d.inequality_columns, '') + ') ' +
  11. isnull('include (' + d.included_columns + ')', '') +
  12. ' with(online = on)', ',)', ')')
  13. FROM
  14. sys.dm_db_missing_index_details d LEFT JOIN
  15. sys.dm_db_missing_index_groups g ON d.index_handle =g.index_handle LEFT JOIN
  16. sys.dm_db_missing_index_group_stats s ON g.index_group_handle = s.group_handle LEFT
  17. JOIN
  18. sys.dm_db_partition_stats p ON d.object_id = p.object_id AND p.index_id < 2 LEFT JOIN
  19. (SELECT
  20. database_id,
  21. object_id,
  22. ROW_NUMBER() OVER (partition BY database_id
  23. ORDER BY SUM(page_io_latch_wait_in_ms) DESC) AS ROW_NUMBER,
  24. SUM(page_io_latch_wait_count) AS num_esperas,
  25. SUM(page_io_latch_wait_in_ms) AS ms_esperas,
  26. SUM(range_scan_count) AS range_scans,
  27. SUM(singleton_lookup_count) AS index_lookups
  28. FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL)
  29. WHERE page_io_latch_wait_count > 0
  30. GROUP BY database_id, object_id) l
  31. ON d.object_id = l.object_id AND d.database_id = l.database_id
  32. WHERE
  33. d.database_id = db_id()
  34. AND s.last_user_seek > dateadd(dd, -7, getdate())
  35. ORDER BY --floor(s.avg_user_impact) desc,
  36. s.user_seeks DESC

y también me ayude del analizador de plan de ejecución que muchos indices que sugería el analizador estaban en el resultado de esa consulta

también realice cambios en los planes de mantenimiento de diariamente reorganizar los indices y 2 veces por semana regeneración de indices

aquí tengo los archivos de los estados de fragmentacion de los indices antes que se ejecutaran los planes

http://dl.dropbox.com/u/5247806/indicesFragmentados.xls

y tengo esta información que saque con la vista dm_db_index_operational_stats
según tengo entendido la columna page_lock_wait_in_ms representa el tiempo de bloqueo y tengo una que llega a los 48 minutos esta en la primera fila...

http://dl.dropbox.com/u/5247806/estadoIndices.xlsx

quizás sea el indice el que causo ese cambio en en los tiempos de espera no tengo seguro eso si alguien podría confirmarme o decirme si hay algo anomalo en la información que comparto en esos documentos

y por ultimo la otra alternativa que estoy planteando es usar versionamiento de filas(READ_COMMITED_SPANSHOP en ON) y evitar esos bloqueos la mayoría son bloqueos compartidos creo que esto se da mas por las consultas select que crean bloqueos compartidos

no eh tenido experiencia con esto si alguien ah tenido por fa que me comparta su experiencia si esto podría mejorar notablemente la performance y el tema de los bloqueos

si es necesario mas información pídanme para postearlo por favor

gracias saludos

Última edición por cancha; 14/03/2012 a las 21:57