Raro Rendimiento en Consulta en SQL2000

23/12/2005 - 18:39 por Developers | Informe spam
Amigos tengo una Consulta que al poner parametros se demora 30 segundos y
sin parametros se demora 3 segundos
osea:

Tengo esta consulta que se demora 3 a 4 segundos en en traer 11582:
DECLARE @FechaStk char(8)
Set @FechaStk='20051001'

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>='20051001' AND T3.FECHA<'20051031') AND T3.CDG_ZON='02' AND
SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND T3.AREA='10'
AND T3.ANU=' ' AND T3.FASN NOT IN ('N')
GROUP BY T3.COD_ITE,T3.FECHA
Union
SELECT T1.COD_ITE, @FechaStk as Fecha, SUM(T1.STK_INI) AS CANT_DIAR
FROM D_INVE_ATG T1 WITH (NOLOCK)
WHERE T1.ANHO='2005' AND T1.CDG_ZON='02' AND T1.AREA='10'
GROUP BY T1.COD_ITE
UNION
SELECT T2.COD_ITE, @FechaStk as Fecha, SUM(T2.ING_ITE-T2.SAL_ITE) AS
CANT_DIAR
FROM D_MOVI_ATG T2 WITH (NOLOCK)
WHERE T2.ANHO='2005' AND T2.CDG_ZON='02' AND SUBSTRING(T2.DOC_REF,1,2) NOT
IN ('IK','SK','SD','AT','TA') AND T2.AREA='10' AND T2.ANU=' ' AND T2.FASN
NOT IN ('N') AND T2.FECHA<'20051001'
GROUP BY T2.COD_ITE

Ahora la Misma Consulta pero en lugar de escribir los valores mando los
parametros declarados:

DECLARE @FECHAINI CHAR(8), @FECHAFIN CHAR(8), @CDG_ZON CHAR(2), @AREA
CHAR(2)
DECLARE @AÑO CHAR(4), @ANU CHAR(1), @FECHASTK DATETIME
SET @FECHAINI = '20051001'
SET @FECHAFIN = '20051031'
SET @CDG_ZON = '02'
SET @AREA = '10'
SET @FECHASTK = CAST(@FECHAINI AS DATETIME)-1
SET @AÑO = CAST(YEAR(@FECHASTK) AS CHAR(4))
SET @ANU = SPACE(1)

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>=@FECHAINI AND T3.FECHA<@FECHAFIN) AND T3.CDG_ZON=@CDG_ZON
AND SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND
T3.AREA=@AREA AND T3.ANU=@ANU AND T3.FASN NOT IN ('N')
GROUP BY T3.COD_ITE,T3.FECHA
Union
SELECT T1.COD_ITE, @FechaStk as Fecha, SUM(T1.STK_INI) AS CANT_DIAR
FROM D_INVE_ATG T1 WITH (NOLOCK)
WHERE T1.ANHO=@AÑO AND T1.CDG_ZON=@CDG_ZON AND T1.AREA=@AREA
GROUP BY T1.COD_ITE
UNION
SELECT T2.COD_ITE, @FechaStk as Fecha, SUM(T2.ING_ITE-T2.SAL_ITE) AS
CANT_DIAR
FROM D_MOVI_ATG T2 WITH (NOLOCK)
WHERE T2.ANHO=@AÑO AND T2.CDG_ZON=@CDG_ZON AND SUBSTRING(T2.DOC_REF,1,2) NOT
IN ('IK','SK','SD','AT','TA') AND T2.AREA=@AREA AND T2.ANU=@ANU AND T2.FASN
NOT IN ('N') AND T2.FECHA<@FECHAINI
GROUP BY T2.COD_ITE

Esta Consulta se demora en responder de 30 a 40 segundos en traer 11582 que
es el mismo resultado de la anterior:.

Las pruebas lo estoy haciendo en QA.

Me podrian explicar del porque pasa esto??? se supone que deberia tener el
mismo tiempo de respuesta

Gracias


Dany Acosta

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
23/12/2005 - 19:59 | Informe spam
Dany,

Primero limpia el buffer y el cache, si es que estas haciendo la prueba en
otra maquina que no sea la de producccion.

dbcc dropcleanbuffers
dbcc freeproccache
go

ahora saca el plan de ejecucion estimado y postealo para ver que esta
haciendo sql server.

set showplan_text on
go

select ...
go

set showplan_text on
go


AMB

"Developers" wrote:

Amigos tengo una Consulta que al poner parametros se demora 30 segundos y
sin parametros se demora 3 segundos
osea:

Tengo esta consulta que se demora 3 a 4 segundos en en traer 11582:
DECLARE @FechaStk char(8)
Set @FechaStk='20051001'

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>='20051001' AND T3.FECHA<'20051031') AND T3.CDG_ZON='02' AND
SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND T3.AREA='10'
AND T3.ANU=' ' AND T3.FASN NOT IN ('N')
GROUP BY T3.COD_ITE,T3.FECHA
Union
SELECT T1.COD_ITE, @FechaStk as Fecha, SUM(T1.STK_INI) AS CANT_DIAR
FROM D_INVE_ATG T1 WITH (NOLOCK)
WHERE T1.ANHO='2005' AND T1.CDG_ZON='02' AND T1.AREA='10'
GROUP BY T1.COD_ITE
UNION
SELECT T2.COD_ITE, @FechaStk as Fecha, SUM(T2.ING_ITE-T2.SAL_ITE) AS
CANT_DIAR
FROM D_MOVI_ATG T2 WITH (NOLOCK)
WHERE T2.ANHO='2005' AND T2.CDG_ZON='02' AND SUBSTRING(T2.DOC_REF,1,2) NOT
IN ('IK','SK','SD','AT','TA') AND T2.AREA='10' AND T2.ANU=' ' AND T2.FASN
NOT IN ('N') AND T2.FECHA<'20051001'
GROUP BY T2.COD_ITE

Ahora la Misma Consulta pero en lugar de escribir los valores mando los
parametros declarados:

DECLARE @FECHAINI CHAR(8), @FECHAFIN CHAR(8), @CDG_ZON CHAR(2), @AREA
CHAR(2)
DECLARE @AÑO CHAR(4), @ANU CHAR(1), @FECHASTK DATETIME
SET @FECHAINI = '20051001'
SET @FECHAFIN = '20051031'
SET @CDG_ZON = '02'
SET @AREA = '10'
SET @FECHASTK = CAST(@FECHAINI AS DATETIME)-1
SET @AÑO = CAST(YEAR(@FECHASTK) AS CHAR(4))
SET @ANU = SPACE(1)

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>=@FECHAINI AND T3.FECHA<@FECHAFIN) AND T3.CDG_ZON=@CDG_ZON
AND SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND
T3.AREA=@AREA AND T3.ANU=@ANU AND T3.FASN NOT IN ('N')
GROUP BY T3.COD_ITE,T3.FECHA
Union
SELECT T1.COD_ITE, @FechaStk as Fecha, SUM(T1.STK_INI) AS CANT_DIAR
FROM D_INVE_ATG T1 WITH (NOLOCK)
WHERE T1.ANHO=@AÑO AND T1.CDG_ZON=@CDG_ZON AND T1.AREA=@AREA
GROUP BY T1.COD_ITE
UNION
SELECT T2.COD_ITE, @FechaStk as Fecha, SUM(T2.ING_ITE-T2.SAL_ITE) AS
CANT_DIAR
FROM D_MOVI_ATG T2 WITH (NOLOCK)
WHERE T2.ANHO=@AÑO AND T2.CDG_ZON=@CDG_ZON AND SUBSTRING(T2.DOC_REF,1,2) NOT
IN ('IK','SK','SD','AT','TA') AND T2.AREA=@AREA AND T2.ANU=@ANU AND T2.FASN
NOT IN ('N') AND T2.FECHA<@FECHAINI
GROUP BY T2.COD_ITE

Esta Consulta se demora en responder de 30 a 40 segundos en traer 11582 que
es el mismo resultado de la anterior:.

Las pruebas lo estoy haciendo en QA.

Me podrian explicar del porque pasa esto??? se supone que deberia tener el
mismo tiempo de respuesta

Gracias


Dany Acosta



Respuesta Responder a este mensaje
#2 hongo32es
23/12/2005 - 20:52 | Informe spam
hola, yo hasta ahora estoy estudiando sql server, pero tengo entendido
que ahi ocasiones en que el uso de indices puede ser malo, si uno
coloca un indice a un campo en el que mas del 10% de los campos son
parecidos, es mejor realizar un full scan a la table, en vez de
utilizar el indice en la consulta.

espero te sirva el dato, bye.
Respuesta Responder a este mensaje
#3 Developers
23/12/2005 - 21:12 | Informe spam
Necesito una Explicacion:

Porque un Index Scan es mas Rapido que un Index Seek, encontre mi problema y
era esto:

En la Sentencia que Usa Parametros Sqlserver usaba
Index Seek(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG3] AS [T3]),
SEEK:([T3].[CDG_ZON]=[@CDG_ZON]), WHERE:((((substring([T3].[DOC_REF], 1,
2)<'TA' OR substring([T3].[DOC_REF], 1, 2)>'TA') AND (substrin

En la Sentencia que NO Usaba Parametros SqlServer Usaba:
|--Index Scan(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2] AS [T3]),
WHERE:((((([T3].[FECHA]>='Oct 1 2005 12:00AM' AND [T3].[FECHA]<'Oct 31 2005
12:00AM') AND [T3].[CDG_ZON]='02') AND (substring([T3].[DO


Borre el Indice D_MOVI_ATG3 que usaba en la sentencia con parametros y ahora
ambas sentencias usan :

Para Parametros:
|--Index Scan(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2] AS [T3]),
WHERE:((((([T3].[FECHA]>=Convert([@FECHAINI]) AND
[T3].[FECHA]<Convert([@FECHAFIN])) AND [T3].[CDG_ZON]=[@CDG_ZON]) AND
(substring([T3]

Sin Parametros:
|--Index Scan(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2] AS [T3]),
WHERE:((((([T3].[FECHA]>='Oct 1 2005 12:00AM' AND [T3].[FECHA]<'Oct 31 2005
12:00AM') AND [T3].[CDG_ZON]='02') AND (substring([T3].[DO

Obteniendo la Misma Velocidad de Respuesta de 3 segundos para ambos
casos.


ES por Eso que necesito una Explicacion del Porque esto????
Que Hace Index Seek que no Hace IndexScan?
Que Hace IndexScan que no Hace Index Seek??

Gracias


Dany Acosta



"Developers" escribió en el mensaje
news:O8qyOf%
Amigos tengo una Consulta que al poner parametros se demora 30 segundos y
sin parametros se demora 3 segundos
osea:

Tengo esta consulta que se demora 3 a 4 segundos en en traer 11582:
DECLARE @FechaStk char(8)
Set @FechaStk='20051001'

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>='20051001' AND T3.FECHA<'20051031') AND T3.CDG_ZON='02'


AND
SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND


T3.AREA='10'
AND T3.ANU=' ' AND T3.FASN NOT IN ('N')
GROUP BY T3.COD_ITE,T3.FECHA
Union
SELECT T1.COD_ITE, @FechaStk as Fecha, SUM(T1.STK_INI) AS CANT_DIAR
FROM D_INVE_ATG T1 WITH (NOLOCK)
WHERE T1.ANHO='2005' AND T1.CDG_ZON='02' AND T1.AREA='10'
GROUP BY T1.COD_ITE
UNION
SELECT T2.COD_ITE, @FechaStk as Fecha, SUM(T2.ING_ITE-T2.SAL_ITE) AS
CANT_DIAR
FROM D_MOVI_ATG T2 WITH (NOLOCK)
WHERE T2.ANHO='2005' AND T2.CDG_ZON='02' AND SUBSTRING(T2.DOC_REF,1,2) NOT
IN ('IK','SK','SD','AT','TA') AND T2.AREA='10' AND T2.ANU=' ' AND T2.FASN
NOT IN ('N') AND T2.FECHA<'20051001'
GROUP BY T2.COD_ITE

Ahora la Misma Consulta pero en lugar de escribir los valores mando los
parametros declarados:

DECLARE @FECHAINI CHAR(8), @FECHAFIN CHAR(8), @CDG_ZON CHAR(2), @AREA
CHAR(2)
DECLARE @AÑO CHAR(4), @ANU CHAR(1), @FECHASTK DATETIME
SET @FECHAINI = '20051001'
SET @FECHAFIN = '20051031'
SET @CDG_ZON = '02'
SET @AREA = '10'
SET @FECHASTK = CAST(@FECHAINI AS DATETIME)-1
SET @AÑO = CAST(YEAR(@FECHASTK) AS CHAR(4))
SET @ANU = SPACE(1)

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>=@FECHAINI AND T3.FECHA<@FECHAFIN) AND T3.CDG_ZON=@CDG_ZON
AND SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND
T3.AREA=@AREA AND T3.ANU=@ANU AND T3.FASN NOT IN ('N')
GROUP BY T3.COD_ITE,T3.FECHA
Union
SELECT T1.COD_ITE, @FechaStk as Fecha, SUM(T1.STK_INI) AS CANT_DIAR
FROM D_INVE_ATG T1 WITH (NOLOCK)
WHERE T1.ANHO=@AÑO AND T1.CDG_ZON=@CDG_ZON AND T1.AREA=@AREA
GROUP BY T1.COD_ITE
UNION
SELECT T2.COD_ITE, @FechaStk as Fecha, SUM(T2.ING_ITE-T2.SAL_ITE) AS
CANT_DIAR
FROM D_MOVI_ATG T2 WITH (NOLOCK)
WHERE T2.ANHO=@AÑO AND T2.CDG_ZON=@CDG_ZON AND SUBSTRING(T2.DOC_REF,1,2)


NOT
IN ('IK','SK','SD','AT','TA') AND T2.AREA=@AREA AND T2.ANU=@ANU AND


T2.FASN
NOT IN ('N') AND T2.FECHA<@FECHAINI
GROUP BY T2.COD_ITE

Esta Consulta se demora en responder de 30 a 40 segundos en traer 11582


que
es el mismo resultado de la anterior:.

Las pruebas lo estoy haciendo en QA.

Me podrian explicar del porque pasa esto??? se supone que deberia tener el
mismo tiempo de respuesta

Gracias


Dany Acosta


Respuesta Responder a este mensaje
#4 Alejandro Mesa
23/12/2005 - 21:14 | Informe spam
Dany,

Se ve que sql server esta escogiendo diferente plan para cada sentencia. Lo
que no puedo es ver el plan completo, estoy perdiendo un pedazo en el
posting. Fijate en los planes, en el uno:

AQUI HACE UN INDEX SCAN EN
([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2]

|--Filter(WHERE:(((substring([T3].[DOC_REF], 1, 2)<'SK' OR
substring([T3].[DOC_REF], 1, 2)>'SK') AND (substring([T3].[DOC_REF], 1,
2)<'IK' OR substring([T3].[DOC_REF], 1, 2)>'IK')) AND [T3].[ANU]=' '))
| |--Index
Scan(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2] AS [T3]),
WHERE:((((([T3].[FECHA]>='Oct 1 2005 12:00AM' AND [T3].[FECHA]<'Oct 31 2005
12:00AM') AND [T3].[CDG_ZON]='02') AND (substring([T3].[DO

en el otro:

AQUI HACE UN INDEX SEEK EN
[Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG3]

|--Filter(WHERE:((substring([T3].[DOC_REF], 1, 2)<'SK' OR
substring([T3].[DOC_REF], 1, 2)>'SK') AND (substring([T3].[DOC_REF], 1,
2)<'IK' OR substring([T3].[DOC_REF], 1, 2)>'IK')))
| |--Index
Seek(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG3] AS [T3]),
SEEK:([T3].[CDG_ZON]=[@CDG_ZON]), WHERE:((((substring([T3].[DOC_REF], 1,
2)<'TA' OR substring([T3].[DOC_REF], 1, 2)>'TA') AND (substrin

como vez, el plan esta cortado. Seria bueno ver los indices de esa tabla.
Asegurate de tener las estadisticas actualizadas. Tambien te recomiendo
cambiar:

AND SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA')

por:

(
T3.DOC_REF not like 'IK%'
and
T3.DOC_REF not like 'SK%'
...
and
T3.DOC_REF not like 'TA%'
)


No es buena practica manipular las columnas en la clausula "where", "having"
o en el "join". Esto hace que sql server no use el indice de forma adecuada
en caso de existir uno.


AMB

"Developers" wrote:

Adjunto PlanEstimado. y por siaca pego en este mensaje

Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 0 ms.

Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 0 ms.

Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 0 ms.
Tiempo de análisis y compilación de SQL Server:
Tiempo de CPU = 0 ms., tiempo transcurrido = 0 ms.

Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 0 ms.
StmtText
-
-
-
-

DECLARE @FECHAINI CHAR(8), @FECHAFIN CHAR(8), @CDG_ZON CHAR(2), @AREA
CHAR(2)
DECLARE @AÑO CHAR(4), @ANU CHAR(1), @FECHASTK DATETIME
SET @FECHAINI = '20051001'

SET @FECHAFIN = '20051031'

SET @CDG_ZON = '02'

SET @AREA = '10'

SET @FECHASTK = CAST(@FECHAINI AS DATETIME)-1

SET @AÑO = CAST(YEAR(@FECHASTK) AS CHAR(4))

SET @ANU = SPACE(1)

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>=@FECHAINI AND T3.FECHA<@FECHAFIN) AND T3.CDG_ZON=@CDG_ZON
AND SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND T3.AREA

(8 row(s) affected)


Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 1 ms.
StmtText
-
-
-
-
|--Sort(DISTINCT ORDER BY:([Union1011] ASC, [Union1012] ASC, [Union1013]
ASC))
|--Concatenation
|--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1001])))
| |--Compute Scalar(DEFINE:([Expr1001]=If ([Expr1025]=0) then
NULL else [Expr1026]))
| |--Stream Aggregate(GROUP BY:([T3].[FECHA],
[T3].[COD_ITE]) DEFINE:([Expr1025]=COUNT_BIG([T3].[ING_ITE]-[T3].[SAL_ITE]),
[Expr1026]=SUM([T3].[ING_ITE]-[T3].[SAL_ITE])))
| |--Sort(ORDER BY:([T3].[FECHA] ASC,
[T3].[COD_ITE] ASC))
|
|--Filter(WHERE:((([T3].[FECHA]>=Convert([@FECHAINI]) AND
[T3].[FECHA]<Convert([@FECHAFIN])) AND [T3].[AREA]=[@AREA]) AND
([T3].[FASN]<'N' OR [T3].[FASN]>'N')))
| |--Bookmark
Lookup(BOOKMARK:([Bmk1000]), OBJECT:([Sekur].[dbo].[D_MOVI_ATG] AS [T3]))
|
|--Filter(WHERE:((substring([T3].[DOC_REF], 1, 2)<'SK' OR
substring([T3].[DOC_REF], 1, 2)>'SK') AND (substring([T3].[DOC_REF], 1,
2)<'IK' OR substring([T3].[DOC_REF], 1, 2)>'IK')))
| |--Index
Seek(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG3] AS [T3]),
SEEK:([T3].[CDG_ZON]=[@CDG_ZON]), WHERE:((((substring([T3].[DOC_REF], 1,
2)<'TA' OR substring([T3].[DOC_REF], 1, 2)>'TA') AND (substrin
|--Compute Scalar(DEFINE:([Expr1004]=Convert([T1].[STK_INI])))
| |--Clustered Index
Seek(OBJECT:([Sekur].[dbo].[D_INVE_ATG].[PK_D_INVE_ATG] AS [T1]),
SEEK:([T1].[ANHO]=[@AÑO] AND [T1].[CDG_ZON]=[@CDG_ZON] AND
[T1].[AREA]=[@AREA]) ORDERED FORWARD)
|--Compute Scalar(DEFINE:([Expr1010]=Convert([Expr1009])))
|--Compute Scalar(DEFINE:([Expr1009]=If ([Expr1027]=0) then
NULL else [Expr1028]))
|--Stream Aggregate(GROUP BY:([T2].[COD_ITE])
DEFINE:([Expr1027]=COUNT_BIG([T2].[ING_ITE]-[T2].[SAL_ITE]),
[Expr1028]=SUM([T2].[ING_ITE]-[T2].[SAL_ITE])))
|--Sort(ORDER BY:([T2].[COD_ITE] ASC))
|--Filter(WHERE:(((substring([T2].[DOC_REF],
1, 2)<'SK' OR substring([T2].[DOC_REF], 1, 2)>'SK') AND
(substring([T2].[DOC_REF], 1, 2)<'IK' OR substring([T2].[DOC_REF], 1,
2)>'IK')) AND ([T2].[FASN]<'N' OR [T2].[FASN]>'N')))
|--Clustered Index
Seek(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[PK__D_MOVI_ATG__5CD6CB2B] AS [T2]),
SEEK:([T2].[ANHO]=[@AÑO] AND [T2].[CDG_ZON]=[@CDG_ZON]),
WHERE:((((([T2].[FECHA]<Convert([@FECHAINI]) AND (substring([T2].

(18 row(s) affected)


Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 1 ms.

Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 2 ms.
StmtText
-
-
-
-


DECLARE @FECHAINI CHAR(8), @FECHAFIN CHAR(8), @CDG_ZON CHAR(2), @AREA
CHAR(2)
DECLARE @AÑO CHAR(4), @ANU CHAR(1), @FECHASTK DATETIME
SET @FECHAINI = '20051001'

SET @FECHAFIN = '20051031'

SET @CDG_ZON = '02'

SET @AREA = '10'

SET @FECHASTK = CAST(@FECHAINI AS DATETIME)-1

SET @AÑO = CAST(YEAR(@FECHASTK) AS CHAR(4))

SET @ANU = SPACE(1)

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>='20051001' AND T3.FECHA<'20051031') AND T3.CDG_ZON='02' AND
SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND T3.AREA='

(8 row(s) affected)


Tiempo de ejecución de SQL Server:
Tiempo de CPU = 47 ms, tiempo transcurrido = 55 ms.
StmtText
-
-
-
-
|--Sort(DISTINCT ORDER BY:([Union1011] ASC, [Union1012] ASC, [Union1013]
ASC))
|--Concatenation
|--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1001])))
| |--Compute Scalar(DEFINE:([Expr1001]=If ([Expr1022]=0) then
NULL else [Expr1023]))
| |--Stream Aggregate(GROUP BY:([T3].[FECHA],
[T3].[COD_ITE]) DEFINE:([Expr1022]=COUNT_BIG([T3].[ING_ITE]-[T3].[SAL_ITE]),
[Expr1023]=SUM([T3].[ING_ITE]-[T3].[SAL_ITE])))
| |--Sort(ORDER BY:([T3].[FECHA] ASC,
[T3].[COD_ITE] ASC))
| |--Filter(WHERE:([T3].[AREA]='10' AND
([T3].[FASN]<'N' OR [T3].[FASN]>'N')))
| |--Bookmark
Lookup(BOOKMARK:([Bmk1000]), OBJECT:([Sekur].[dbo].[D_MOVI_ATG] AS [T3]))
|
|--Filter(WHERE:(((substring([T3].[DOC_REF], 1, 2)<'SK' OR
substring([T3].[DOC_REF], 1, 2)>'SK') AND (substring([T3].[DOC_REF], 1,
2)<'IK' OR substring([T3].[DOC_REF], 1, 2)>'IK')) AND [T3].[ANU]=' '))
| |--Index
Scan(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2] AS [T3]),
WHERE:((((([T3].[FECHA]>='Oct 1 2005 12:00AM' AND [T3].[FECHA]<'Oct 31 2005
12:00AM') AND [T3].[CDG_ZON]='02') AND (substring([T3].[DO
|--Compute Scalar(DEFINE:([Expr1004]=Convert([T1].[STK_INI])))
| |--Clustered Index
Seek(OBJECT:([Sekur].[dbo].[D_INVE_ATG].[PK_D_INVE_ATG] AS [T1]),
SEEK:([T1].[ANHO]='2005' AND [T1].[CDG_ZON]='02' AND [T1].[AREA]='10')
ORDERED FORWARD)
|--Compute Scalar(DEFINE:([Expr1010]=Convert([Expr1009])))
|--Compute Scalar(DEFINE:([Expr1009]=If ([Expr1024]=0) then
NULL else [Expr1025]))
|--Stream Aggregate(GROUP BY:([T2].[COD_ITE])
DEFINE:([Expr1024]=COUNT_BIG([T2].[ING_ITE]-[T2].[SAL_ITE]),
[Expr1025]=SUM([T2].[ING_ITE]-[T2].[SAL_ITE])))
|--Sort(ORDER BY:([T2].[COD_ITE] ASC))
|--Filter(WHERE:(((substring([T2].[DOC_REF],
1, 2)<'SK' OR substring([T2].[DOC_REF], 1, 2)>'SK') AND
(substring([T2].[DOC_REF], 1, 2)<'IK' OR substring([T2].[DOC_REF], 1,
2)>'IK')) AND ([T2].[FASN]<'N' OR [T2].[FASN]>'N')))
|--Clustered Index
Seek(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[PK__D_MOVI_ATG__5CD6CB2B] AS [T2]),
SEEK:([T2].[ANHO]='2005' AND [T2].[CDG_ZON]='02'),
WHERE:((((([T2].[FECHA]<'Oct 1 2005 12:00AM' AND (substring([T2].[DOC_

(18 row(s) affected)


Tiempo de ejecución de SQL Server:
Tiempo de CPU = 47 ms, tiempo transcurrido = 55 ms.

Tiempo de ejecución de SQL Server:
Tiempo de CPU = 47 ms, tiempo transcurrido = 56 ms.

Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 0 ms.

Tiempo de ejecución de SQL Server:
Tiempo de CPU = 0 ms, tiempo transcurrido = 0 ms.
Tiempo de análisis y compilación de SQL Server:
Tiempo de CPU = 0 ms., tiempo transcurrido = 17 ms
Respuesta Responder a este mensaje
#5 Maxi [MVP]
23/12/2005 - 22:23 | Informe spam
Hola, hay casos que un index seek es peor que un index Scan, por ej, si
tiene que partir la consulta. A mi me gustaria ver el plan completo de
ejecucion


Salu2
-
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org



"Developers" escribió en el mensaje
news:eGjWh0$
Necesito una Explicacion:

Porque un Index Scan es mas Rapido que un Index Seek, encontre mi problema
y
era esto:

En la Sentencia que Usa Parametros Sqlserver usaba
Index Seek(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG3] AS [T3]),
SEEK:([T3].[CDG_ZON]=[@CDG_ZON]), WHERE:((((substring([T3].[DOC_REF], 1,
2)<'TA' OR substring([T3].[DOC_REF], 1, 2)>'TA') AND (substrin

En la Sentencia que NO Usaba Parametros SqlServer Usaba:
|--Index Scan(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2] AS [T3]),
WHERE:((((([T3].[FECHA]>='Oct 1 2005 12:00AM' AND [T3].[FECHA]<'Oct 31
2005
12:00AM') AND [T3].[CDG_ZON]='02') AND (substring([T3].[DO


Borre el Indice D_MOVI_ATG3 que usaba en la sentencia con parametros y
ahora
ambas sentencias usan :

Para Parametros:
|--Index Scan(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2] AS [T3]),
WHERE:((((([T3].[FECHA]>=Convert([@FECHAINI]) AND
[T3].[FECHA]<Convert([@FECHAFIN])) AND [T3].[CDG_ZON]=[@CDG_ZON]) AND
(substring([T3]

Sin Parametros:
|--Index Scan(OBJECT:([Sekur].[dbo].[D_MOVI_ATG].[D_MOVI_ATG2] AS [T3]),
WHERE:((((([T3].[FECHA]>='Oct 1 2005 12:00AM' AND [T3].[FECHA]<'Oct 31
2005
12:00AM') AND [T3].[CDG_ZON]='02') AND (substring([T3].[DO

Obteniendo la Misma Velocidad de Respuesta de 3 segundos para ambos
casos.


ES por Eso que necesito una Explicacion del Porque esto????
Que Hace Index Seek que no Hace IndexScan?
Que Hace IndexScan que no Hace Index Seek??

Gracias


Dany Acosta



"Developers" escribió en el mensaje
news:O8qyOf%
Amigos tengo una Consulta que al poner parametros se demora 30 segundos y
sin parametros se demora 3 segundos
osea:

Tengo esta consulta que se demora 3 a 4 segundos en en traer 11582:
DECLARE @FechaStk char(8)
Set @FechaStk='20051001'

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>='20051001' AND T3.FECHA<'20051031') AND T3.CDG_ZON='02'


AND
SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND


T3.AREA='10'
AND T3.ANU=' ' AND T3.FASN NOT IN ('N')
GROUP BY T3.COD_ITE,T3.FECHA
Union
SELECT T1.COD_ITE, @FechaStk as Fecha, SUM(T1.STK_INI) AS CANT_DIAR
FROM D_INVE_ATG T1 WITH (NOLOCK)
WHERE T1.ANHO='2005' AND T1.CDG_ZON='02' AND T1.AREA='10'
GROUP BY T1.COD_ITE
UNION
SELECT T2.COD_ITE, @FechaStk as Fecha, SUM(T2.ING_ITE-T2.SAL_ITE) AS
CANT_DIAR
FROM D_MOVI_ATG T2 WITH (NOLOCK)
WHERE T2.ANHO='2005' AND T2.CDG_ZON='02' AND SUBSTRING(T2.DOC_REF,1,2)
NOT
IN ('IK','SK','SD','AT','TA') AND T2.AREA='10' AND T2.ANU=' ' AND T2.FASN
NOT IN ('N') AND T2.FECHA<'20051001'
GROUP BY T2.COD_ITE

Ahora la Misma Consulta pero en lugar de escribir los valores mando los
parametros declarados:

DECLARE @FECHAINI CHAR(8), @FECHAFIN CHAR(8), @CDG_ZON CHAR(2), @AREA
CHAR(2)
DECLARE @AÑO CHAR(4), @ANU CHAR(1), @FECHASTK DATETIME
SET @FECHAINI = '20051001'
SET @FECHAFIN = '20051031'
SET @CDG_ZON = '02'
SET @AREA = '10'
SET @FECHASTK = CAST(@FECHAINI AS DATETIME)-1
SET @AÑO = CAST(YEAR(@FECHASTK) AS CHAR(4))
SET @ANU = SPACE(1)

SELECT T3.COD_ITE, T3.FECHA, SUM(T3.ING_ITE-T3.SAL_ITE) AS CANT_DIAR
FROM D_MOVI_ATG T3 WITH (NOLOCK)
WHERE (T3.FECHA>=@FECHAINI AND T3.FECHA<@FECHAFIN) AND
T3.CDG_ZON=@CDG_ZON
AND SUBSTRING(T3.DOC_REF,1,2) NOT IN ('IK','SK','SD','AT','TA') AND
T3.AREA=@AREA AND T3.ANU=@ANU AND T3.FASN NOT IN ('N')
GROUP BY T3.COD_ITE,T3.FECHA
Union
SELECT T1.COD_ITE, @FechaStk as Fecha, SUM(T1.STK_INI) AS CANT_DIAR
FROM D_INVE_ATG T1 WITH (NOLOCK)
WHERE T1.ANHO=@AÑO AND T1.CDG_ZON=@CDG_ZON AND T1.AREA=@AREA
GROUP BY T1.COD_ITE
UNION
SELECT T2.COD_ITE, @FechaStk as Fecha, SUM(T2.ING_ITE-T2.SAL_ITE) AS
CANT_DIAR
FROM D_MOVI_ATG T2 WITH (NOLOCK)
WHERE T2.ANHO=@AÑO AND T2.CDG_ZON=@CDG_ZON AND SUBSTRING(T2.DOC_REF,1,2)


NOT
IN ('IK','SK','SD','AT','TA') AND T2.AREA=@AREA AND T2.ANU=@ANU AND


T2.FASN
NOT IN ('N') AND T2.FECHA<@FECHAINI
GROUP BY T2.COD_ITE

Esta Consulta se demora en responder de 30 a 40 segundos en traer 11582


que
es el mismo resultado de la anterior:.

Las pruebas lo estoy haciendo en QA.

Me podrian explicar del porque pasa esto??? se supone que deberia tener
el
mismo tiempo de respuesta

Gracias


Dany Acosta






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