problemas con el sp4 del SQL

12/09/2005 - 16:27 por fgoico | Informe spam
Estimados señores,

Hemos detectado algunos problemas en nuestros servidores de desarrollo
despues instalar el Service Pack 4 del MSSQL. Concretamente, hemos detectado
un notable deterioro en el rendimiento del servidor, concretamente en el
consumo de CPU y acceso a disco cuando se ejecutan algunas querys. Os voy a
poner un ejemplo, no tengo muy claro cual es la mejor manera de mostrar esto,
pero espero que lo que os adjunto a continuacion os sirva de algo, y sino
pregúntarme lo que querais.

SERVIDOR1:
2 CPU PIV XEON 3,2GHZ 2MBL2
4GB RAM
un raid 1 (dos discos de 72GB SCSI U320 de 15K rpm)
un raid 10 (cuatro discos de 72GB SCSI U320 de 15K rpm)
WINDOWS 2000 SERVER CON SP4 Y ULTIMAS ACTUALIZACIONES
MICROSOFT SQL SERVER 2000 STANDARD

SERVIDOR2:
2 CPU PIV XEON 3,2GHZ 2MBL2
4GB RAM
un raid 1 (dos discos de 72GB SCSI U320 de 15K rpm)
un raid 1 (dos discos de 72GB SCSI U320 de 15K rpm)
un raid 10 (cuatro discos de 72GB SCSI U320 de 15K rpm)
WINDOWS 2003 SERVER STD CON SP2 Y ULTIMAS ACTUALIZACIONES
MICROSOFT SQL SERVER 2000 STANDARD

SERVIDOR3:
2 CPU PIV XEON 2,8GHZ 2MBL2
6GB RAM
un raid 1 (dos discos de 72GB SCSI U320 de 15K rpm)
un raid 1 (dos discos de 72GB SCSI U320 de 15K rpm)
un raid 10 (cuatro discos de 72GB SCSI U320 de 15K rpm)
WINDOWS 2003 SERVER ENTERPRISE CON SP2 Y ULTIMAS ACTUALIZACIONES
MICROSOFT SQL SERVER 2000 STANDARD

Bien, una de las querys en las que hemos detectado este problema es:

declare @IdEmpresas as decimal
declare @Login as varchar(30)
declare @IdAppModulos as varchar(5)
declare @IdAppContenedores as varchar(50)

set @IdEmpresas = 1
set @Login = 'betas'
set @IdAppModulos = 'EM'
set @IdAppContenedores = 'frmEmpleados'

SELECT AppPermisosEmpresas.IdAppObjetos AS Objeto,
AppPermisosEmpresas.IdAppContenedores AS Contenedor,
AppPermisosEmpresas.IdAppModulos AS Modulo,
IsNull(AppPermisosEmpresas.Visible,0) as Visible,
IsNull(AppPermisosEmpresas.Enabled,0) AS
Enabled,IsNull(AppPermisosEmpresas.NoDisponible,0) AS NoDisponible
FROM AppPermisosEmpresas INNER JOIN AppObjetos ON
AppPermisosEmpresas.IdAppModulos=AppObjetos.IdAppModulos AND
AppPermisosEmpresas.IdAppContenedoresAppObjetos.Contenedor AND AppPermisosEmpresas.IdAppObjetos=AppObjetos.Objeto
WHERE ISNULL(AppObjetos.EsControlVB, 1)=1 AND AppPermisosEmpresas.Login =
@Login AND
AppPermisosEmpresas.IdAppContenedores = @IdAppContenedores AND
AppPermisosEmpresas.IdEmpresas = @IdEmpresas AND
AppPermisosEmpresas.IdAppModulos = @IdAppModulos --And
ISNULL(AppObjetos.NoDisponible, 0)= 0
GROUP BY AppPermisosEmpresas.IdAppObjetos,
AppPermisosEmpresas.IdAppContenedores, AppPermisosEmpresas.IdAppModulos,
AppPermisosEmpresas.Enabled, AppPermisosEmpresas.Visible,
IsNull(AppPermisosEmpresas.NoDisponible,0)
UNION
SELECT dbo.AppObjetos.Objeto AS Objeto, dbo.AppObjetos.Contenedor AS
Contenedor, dbo.AppObjetos.IdAppModulos AS Modulo,
ISNULL(dbo.AppObjetos.DefVisible, 0) AS Visible,
ISNULL(dbo.AppObjetos.DefEnabled, 0) AS Enabled,
ISNULL(dbo.AppObjetos.NoDisponible, 0)
AS NoDisponible
FROM dbo.AppObjetos LEFT OUTER JOIN
dbo.AppPermisosEmpresas ON dbo.AppObjetos.IdAppModulos
= dbo.AppPermisosEmpresas.IdAppModulos
WHERE (dbo.AppPermisosEmpresas.IdEmpresas = @IdEmpresas) AND
(dbo.AppPermisosEmpresas.Login = @Login) AND
(ISNULL(dbo.AppObjetos.EsControlVB, 1) = 1) AND
(dbo.AppPermisosEmpresas.Visible = 1) AND
(dbo.AppObjetos.IdAppModulos = @IdAppModulos)
And (dbo.AppObjetos.Contenedor = @IdAppContenedores)
AND (dbo.AppObjetos.Objeto NOT IN
(SELECT AppPermisosEmpresas.IdAppObjetos
FROM AppPermisosEmpresas INNER JOIN
AppObjetos ON AppPermisosEmpresas.IdAppModulos =
AppObjetos.IdAppModulos AND
AppPermisosEmpresas.IdAppContenedores =
AppObjetos.Contenedor AND
AppPermisosEmpresas.IdAppObjetos =
AppObjetos.Objeto
WHERE ISNULL(AppObjetos.EsControlVB, 1) = 1 AND
AppPermisosEmpresas.Login = @Login AND
AppPermisosEmpresas.IdAppContenedores =
@IdAppContenedores AND AppPermisosEmpresas.IdEmpresas = @IdEmpresas AND
AppPermisosEmpresas.IdAppModulos =
@IdAppModulos
GROUP BY AppPermisosEmpresas.IdAppObjetos))

UNION
SELECT AppObjetos.Objeto AS Objeto, AppObjetos.Contenedor AS Contenedor,
AppObjetos.IdAppModulos AS Modulo, 0 as Visible, 0 AS Enabled,
IsNull(AppObjetos.NoDisponible,0)
AS NoDisponible From AppObjetos
Where AppObjetos.IdAppModulos = @IdAppModulos And
ISNULL(AppObjetos.EsControlVB,1) = 1
And AppObjetos.Contenedor = @IdAppContenedores And AppObjetos.Objeto Not
In (
SELECT AppPermisosEmpresas.IdAppObjetos AS Objeto
FROM AppPermisosEmpresas LEFT OUTER JOIN AppObjetos ON
AppPermisosEmpresas.IdAppModulos=AppObjetos.IdAppModulos AND
AppPermisosEmpresas.IdAppContenedoresAppObjetos.Contenedor AND AppPermisosEmpresas.IdAppObjetos=AppObjetos.Objeto
WHERE ISNULL(AppObjetos.EsControlVB, 1)=1 AND AppPermisosEmpresas.Login =
@Login AND
AppPermisosEmpresas.IdAppContenedores = @IdAppContenedores AND
AppPermisosEmpresas.IdEmpresas = @IdEmpresas AND
AppPermisosEmpresas.IdAppModulos = @IdAppModulos --And
ISNULL(AppObjetos.NoDisponible, 0)= 0
GROUP BY AppPermisosEmpresas.IdAppObjetos,
AppPermisosEmpresas.IdAppContenedores, AppPermisosEmpresas.IdAppModulos,
AppPermisosEmpresas.Enabled, AppPermisosEmpresas.Visible,
IsNull(AppPermisosEmpresas.NoDisponible,0)
UNION
SELECT dbo.AppObjetos.Objeto AS Objeto
FROM dbo.AppObjetos LEFT OUTER JOIN
dbo.AppPermisosEmpresas ON dbo.AppObjetos.IdAppModulos
= dbo.AppPermisosEmpresas.IdAppModulos
WHERE (dbo.AppPermisosEmpresas.IdEmpresas = @IdEmpresas) AND
(dbo.AppPermisosEmpresas.Login = @Login) AND
(ISNULL(dbo.AppObjetos.EsControlVB, 1) = 1) AND
(dbo.AppPermisosEmpresas.Visible = 1) AND
(dbo.AppObjetos.IdAppModulos = @IdAppModulos)
AND (dbo.AppObjetos.Objeto NOT IN
(SELECT AppPermisosEmpresas.IdAppObjetos
FROM AppPermisosEmpresas LEFT OUTER JOIN
AppObjetos ON
AppPermisosEmpresas.IdAppModulos = AppObjetos.IdAppModulos AND
AppPermisosEmpresas.IdAppContenedores =
AppObjetos.Contenedor AND
AppPermisosEmpresas.IdAppObjetos =
AppObjetos.Objeto
WHERE ISNULL(AppObjetos.EsControlVB, 1) = 1 AND
AppPermisosEmpresas.Login = @Login AND
AppPermisosEmpresas.IdAppContenedores =
@IdAppContenedores AND AppPermisosEmpresas.IdEmpresas = @IdEmpresas AND
AppPermisosEmpresas.IdAppModulos =
@IdAppModulos
GROUP BY AppPermisosEmpresas.IdAppObjetos))
)
GO

Las tablas son:

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[AppObjetos]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[AppObjetos]
GO

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[AppPermisosEmpresas]') and OBJECTPROPERTY(id,
N'IsUserTable') = 1)
drop table [dbo].[AppPermisosEmpresas]
GO

CREATE TABLE [dbo].[AppObjetos] (
[IdAppModulos] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Contenedor] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Objeto] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Descripcion] [varchar] (200) COLLATE Modern_Spanish_CI_AS NULL ,
[DefVisible] [bit] NULL ,
[DefEnabled] [bit] NULL ,
[FechaMod] [datetime] NULL ,
[Objeto_Padre] [varchar] (50) COLLATE Modern_Spanish_CI_AS NULL ,
[Contenedor_Padre] [varchar] (50) COLLATE Modern_Spanish_CI_AS NULL ,
[IdAppModulos_Padre] [varchar] (50) COLLATE Modern_Spanish_CI_AS NULL ,
[EsControlVB] [bit] NULL ,
[NoDisponible] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[AppPermisosEmpresas] (
[IdEmpresas] [decimal](9, 0) NOT NULL ,
[IdAppModulos] [varchar] (5) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[IdAppContenedores] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[IdAppObjetos] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Login] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[Visible] [bit] NOT NULL ,
[Enabled] [bit] NOT NULL ,
[Plantilla] [bit] NOT NULL ,
[NoDisponible] [bit] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[AppObjetos] WITH NOCHECK ADD
CONSTRAINT [PKAppObjetos] PRIMARY KEY CLUSTERED
(
[IdAppModulos],
[Contenedor],
[Objeto]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[AppPermisosEmpresas] WITH NOCHECK ADD
PRIMARY KEY CLUSTERED
(
[IdEmpresas],
[IdAppModulos],
[IdAppContenedores],
[IdAppObjetos],
[Login]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[AppObjetos] ADD
CONSTRAINT [DF_AppObjetos_EsControlVB] DEFAULT (1) FOR [EsControlVB]
GO

CREATE INDEX [IdAppModulos] ON [dbo].[AppObjetos]([IdAppModulos]) WITH
FILLFACTOR = 90 ON [PRIMARY]
GO

CREATE INDEX [IdObjetos] ON [dbo].[AppObjetos]([Contenedor]) WITH
FILLFACTOR = 90 ON [PRIMARY]
GO

ALTER TABLE [dbo].[AppPermisosEmpresas] ADD
CONSTRAINT [DF___TMP_DBTo__IdEmp__0B69FEE7] DEFAULT (0) FOR [IdEmpresas],
CONSTRAINT [DF___TMP_DBTo__IdApp__0C5E2320] DEFAULT ('') FOR [IdAppModulos],
CONSTRAINT [DF___TMP_DBTo__IdApp__0D524759] DEFAULT ('') FOR
[IdAppContenedores],
CONSTRAINT [DF___TMP_DBTo__IdApp__0E466B92] DEFAULT ('') FOR [IdAppObjetos],
CONSTRAINT [DF___TMP_DBTo__Login__0F3A8FCB] DEFAULT ('') FOR [Login],
CONSTRAINT [DF___TMP_DBTo__Visib__102EB404] DEFAULT (0) FOR [Visible],
CONSTRAINT [DF___TMP_DBTo__Enabl__1122D83D] DEFAULT (0) FOR [Enabled],
CONSTRAINT [DF___TMP_DBTo__Plant__1216FC76] DEFAULT (0) FOR [Plantilla]
GO

AppPermisosEmpresas tiene 507498 registros
AppObjetos tiene 1124 registros

El problema está en que si ejecutas esta query con el SP3a del SQL los
resultados que muestra el analizador del SQL son estos:

RPC COMPLETED
CPU : 79
READS : 2592
WRITES : 0
DURATION: 78

y despues de instalar el SP4 , la misma consulta devuelve estos resultados

RPC COMPLETED
CPU : 796
READS : 47167
WRITES : 0
DURATION : 1890

Como podeis comprobar el incremento de los tiempos y de las lecturas son
notables. Repito, el servidor es el mismo, la base de datos la misma, el
usuario el mismo, SOLO CAMBIA EL SERVICE PACK. Las pruebas se hicieron en los
servidores que se detallo al principio del mensaje y en los tres servidores
ocurre exactamente lo mismo. Por supuesto, las consultas las he ejecutado
varias veces y siempre con resultados muy parejos...

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
12/09/2005 - 16:43 | Informe spam
Actualizastes las estadisticas?
Puedes postear el plan de ejecucion?


AMB

"fgoico" wrote:

Mostrar la cita
#2 Carlo Sorrel
12/09/2005 - 21:51 | Informe spam
Estimado, debo confesar que lo que comentas puede ser efectivo, ya que he
pasado a producción el Service pack me ha degradado el rendimiento de uno de
mis server en forma catastrófica, tanto así que tuve que volver atras, con
lo cual se me soluciono el problema. Ahora lo extraño es que hasta el
momento sólo fue en uno de mis Server, no en todos (tengo 6), lo que tambien
e notado es que se aumentan ostensiblemente los bloqueos.., te pasa algo
similar..???
Saludos.

Atte.,
Carlo Sorrel

"fgoico" escribió en el mensaje
news:
Mostrar la cita
#3 Carlo Sorrel
12/09/2005 - 22:03 | Informe spam
Sigueindo con el tema, he buscado en internet sobre el tema, y mira el link
que te adjunto, puede que te sirva de algo...

http://support.microsoft.com/kb/897284/en-us

Saludos.

Atte.,
Carlo Sorrel

"fgoico" escribió en el mensaje
news:
Mostrar la cita
#4 Alejandro Mesa
13/09/2005 - 15:25 | Informe spam
Fernando,

Verdad que ponerme a interpretar ambos planes me tomaria demasiado tiempo.
Lo primero que te recomiendo es que instales el service pack 4 del sistema
operativo. Lo segundo es decirte que esos servidores estan sobre configurados
para la version de sql server que usas, lo digo porque todos tienen minimo 4
gbytes de ram y la version standard de sql server solo puede usar hasta
2gbytes.

Algo llama mi atencion y es que en el segundo plan, sql server escogio usar
paralelismo, osea repartir la carga del query entre los procesadores, pero
para mi sorpresa, operaciones de "index seek" que se realizaron en el primer
plan, ahora sql server las hace "index scan".

***** Primer plan

|--Clustered Index
Seek(OBJECT:([SERAUTO].[dbo].[AppPermisosEmpresas].[PK_AppPermisosEmpresas]),
SEEK:([AppPermisosEmpresas].[IdEmpresas]=[@IdEmpresas] AND
[AppPermisosEmpresas].[IdAppModulos]=[@IdAppModulos] AND
[AppPermisosEmpresas].[IdAppContenedores]=[@IdAppContenedores] AND
[AppPermisosEmpresas].[IdAppObjetos]=[AppObjetos].[Objeto] AND
[AppPermisosEmpresas].[Login]=[@Login]) ORDERED FORWARD)

***** Segundo plan

|--Clustered Index
Scan(OBJECT:([SERAUTO].[dbo].[AppPermisosEmpresas].[PK_AppPermisosEmpresas]),
WHERE:((([AppPermisosEmpresas].[IdEmpresas]=[@IdEmpresas] AND
[AppPermisosEmpresas].[IdAppModulos]=[@IdAppModulos]) AND
[AppPermisosEmpresas].[IdAppContenedores]=[@IdAppContenedores]) AND
[AppPermisosEmpresas].[Login]=[@Login]))

Ya esto va mas alla de mis conocimientos. Pudieramos hacer una prueba
deshabilitando el paralelismo, y si esto no ayuda creo que vas a tener que
llamar a Microsoft.

Veamos que pasa si sobre escribimos la opcion de configuracion "max degree
of parallelism", medianto el uso de de la opcion "MAXDOP". Adiciona la
siguiente linea al final del codigo que posteastes en tu primer mensaje.

option (MAXDOP 1)


Chequea a ver cuanto cambio el plan de ejecucion. Dejanos saber el resultado.


AMB

"fernando goicoechea" wrote:

Mostrar la cita
#5 fernando goicoechea
13/09/2005 - 16:07 | Informe spam
Carlo,

La verdad es que por muchas vueltas que le doy no consigo entender el
porque, según el vínculo
que me adjuntaste puede ser un problema de hardware pero me saltan algunas
preguntas: ¿por que? ¿en los tres servidores?
(son de diferente marca, bueno dos son de la misma marca pero otro modelo)
¿porque este problema se produce con el SP4?
Tampoco entiendo el cambio en el plan de ejecución (sigue la conversacion
que tengo con Alejandro Massa), supongo
que deberia ser mas efectivo con el SP4, pero no lo es Lo que tengo muy
claro es que no lo voy a poner en producción hasta
que alguien me aclare esto.

un saludo,




"Carlo Sorrel" escribió en el mensaje
news:
Mostrar la cita
Ads by Google
Search Busqueda sugerida