Table Scan

17/08/2005 - 00:54 por Walter | Informe spam
Hola

Como elimino un table scan de un campo de fecha, el query es el siguiente:

SELECT da.cod_item, MAX( ph.nro_endoso )
FROM di_datos_au da with (nolock), pv_header ph with (nolock), tgrupo_endo
te with (nolock) WHERE ph.nro_pol = 9000000001 AND ph.id_pv = da.id_pv
AND ph.cod_suc = 640 AND ph.cod_ramo = 40 AND (ph.cod_grupo_endo =
te.cod_grupo_endo) AND (sn_adicional = -1 or sn_poliza = -1 or sn_prorroga =
-1 or sn_renovacion_automatica = -1 or sn_renovacion_manual = -1 or
sn_rehabilitacion = -1 or sn_declaracion = -1 or sn_refacturacion_manual = -1
)
AND da.fec_vig_desde <= cast('20041106' as smalldatetime)
AND ph.id_pv NOT IN ( SELECT ph.id_pv_modifica FROM pv_header ph with
(nolock), tgrupo_endo tg with (nolock)
WHERE ph.cod_grupo_endo = tg.cod_grupo_endo And tg.sn_cancelacion_endoso = -1
AND ph.cod_suc = 640
AND ph.cod_ramo = 40
AND ph.nro_pol = 9000000001 )
GROUP BY da.cod_item order by da.cod_item

Gracias espero sus comentarios

Preguntas similare

Leer las respuestas

#1 Maxi
17/08/2005 - 01:02 | Informe spam
Hola, varias cosas:

1) No uses Where para unir tablas sino usa JOIN
2) Porque usas Nolock?

Ahora preguntas

1) Tienes indices no?
2) podrias en lugar de enviar la sentencia, enviarnos el plan de ejecucion
en modo texto?


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Walter" escribió en el mensaje
news:
Hola

Como elimino un table scan de un campo de fecha, el query es el siguiente:

SELECT da.cod_item, MAX( ph.nro_endoso )
FROM di_datos_au da with (nolock), pv_header ph with (nolock), tgrupo_endo
te with (nolock) WHERE ph.nro_pol = 9000000001 AND ph.id_pv = da.id_pv
AND ph.cod_suc = 640 AND ph.cod_ramo = 40 AND (ph.cod_grupo_endo > te.cod_grupo_endo) AND (sn_adicional = -1 or sn_poliza = -1 or
sn_prorroga > -1 or sn_renovacion_automatica = -1 or sn_renovacion_manual = -1 or
sn_rehabilitacion = -1 or sn_declaracion = -1 or sn_refacturacion_manual
= -1
)
AND da.fec_vig_desde <= cast('20041106' as smalldatetime)
AND ph.id_pv NOT IN ( SELECT ph.id_pv_modifica FROM pv_header ph with
(nolock), tgrupo_endo tg with (nolock)
WHERE ph.cod_grupo_endo = tg.cod_grupo_endo And tg.sn_cancelacion_endoso
= -1
AND ph.cod_suc = 640
AND ph.cod_ramo = 40
AND ph.nro_pol = 9000000001 )
GROUP BY da.cod_item order by da.cod_item

Gracias espero sus comentarios
Respuesta Responder a este mensaje
#2 Walter
17/08/2005 - 01:15 | Informe spam
como obtengo el plan de ejecucion en modo texto?,
Nolock es para que bloquee es tabla.
si tengo indixes.


"Maxi" escribió:

Hola, varias cosas:

1) No uses Where para unir tablas sino usa JOIN
2) Porque usas Nolock?

Ahora preguntas

1) Tienes indices no?
2) podrias en lugar de enviar la sentencia, enviarnos el plan de ejecucion
en modo texto?


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Walter" escribió en el mensaje
news:
> Hola
>
> Como elimino un table scan de un campo de fecha, el query es el siguiente:
>
> SELECT da.cod_item, MAX( ph.nro_endoso )
> FROM di_datos_au da with (nolock), pv_header ph with (nolock), tgrupo_endo
> te with (nolock) WHERE ph.nro_pol = 9000000001 AND ph.id_pv = da.id_pv
> AND ph.cod_suc = 640 AND ph.cod_ramo = 40 AND (ph.cod_grupo_endo > > te.cod_grupo_endo) AND (sn_adicional = -1 or sn_poliza = -1 or
> sn_prorroga > > -1 or sn_renovacion_automatica = -1 or sn_renovacion_manual = -1 or
> sn_rehabilitacion = -1 or sn_declaracion = -1 or sn_refacturacion_manual
> = -1
> )
> AND da.fec_vig_desde <= cast('20041106' as smalldatetime)
> AND ph.id_pv NOT IN ( SELECT ph.id_pv_modifica FROM pv_header ph with
> (nolock), tgrupo_endo tg with (nolock)
> WHERE ph.cod_grupo_endo = tg.cod_grupo_endo And tg.sn_cancelacion_endoso
> = -1
> AND ph.cod_suc = 640
> AND ph.cod_ramo = 40
> AND ph.nro_pol = 9000000001 )
> GROUP BY da.cod_item order by da.cod_item
>
> Gracias espero sus comentarios



Respuesta Responder a este mensaje
#3 Maxi
17/08/2005 - 01:29 | Informe spam
Hola, yo no usaria nolock y dejaria a Sql tomar esa desicion.

Para el plan de ejecucion modo texto debes entrar al Query analizer y hacer

SET SHOWPLAN_TEXT ON

Tambien seria bueno que me pases que indices tienen esas tablas


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Walter" escribió en el mensaje
news:
como obtengo el plan de ejecucion en modo texto?,
Nolock es para que bloquee es tabla.
si tengo indixes.


"Maxi" escribió:

Hola, varias cosas:

1) No uses Where para unir tablas sino usa JOIN
2) Porque usas Nolock?

Ahora preguntas

1) Tienes indices no?
2) podrias en lugar de enviar la sentencia, enviarnos el plan de
ejecucion
en modo texto?


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Walter" escribió en el mensaje
news:
> Hola
>
> Como elimino un table scan de un campo de fecha, el query es el
> siguiente:
>
> SELECT da.cod_item, MAX( ph.nro_endoso )
> FROM di_datos_au da with (nolock), pv_header ph with (nolock),
> tgrupo_endo
> te with (nolock) WHERE ph.nro_pol = 9000000001 AND ph.id_pv =
> da.id_pv
> AND ph.cod_suc = 640 AND ph.cod_ramo = 40 AND (ph.cod_grupo_endo >> > te.cod_grupo_endo) AND (sn_adicional = -1 or sn_poliza = -1 or
> sn_prorroga >> > -1 or sn_renovacion_automatica = -1 or sn_renovacion_manual = -1 or
> sn_rehabilitacion = -1 or sn_declaracion = -1 or
> sn_refacturacion_manual
> = -1
> )
> AND da.fec_vig_desde <= cast('20041106' as smalldatetime)
> AND ph.id_pv NOT IN ( SELECT ph.id_pv_modifica FROM pv_header ph with
> (nolock), tgrupo_endo tg with (nolock)
> WHERE ph.cod_grupo_endo = tg.cod_grupo_endo And
> tg.sn_cancelacion_endoso
> = -1
> AND ph.cod_suc = 640
> AND ph.cod_ramo = 40
> AND ph.nro_pol = 9000000001 )
> GROUP BY da.cod_item order by da.cod_item
>
> Gracias espero sus comentarios



Respuesta Responder a este mensaje
#4 Walter
17/08/2005 - 16:15 | Informe spam
Hola Maxi,

Este seria el plan:


|--Stream Aggregate(GROUP BY:([da].[cod_item])
DEFINE:([Expr1005]=MAX([partialagg1006])))
|--Parallelism(Gather Streams, ORDER BY:([da].[cod_item] ASC))
|--Nested Loops(Inner Join, OUTER
REFERENCES:([ph].[cod_grupo_endo]))
|--Sort(ORDER BY:([da].[cod_item] ASC))
| |--Hash Match(Aggregate, HASH:([da].[cod_item],
[ph].[cod_grupo_endo]), RESIDUAL:([da].[cod_item]=[da].[cod_item] AND
[ph].[cod_grupo_endo]=[ph].[cod_grupo_endo])
DEFINE:([partialagg1006]=MAX([ph].[nro_endoso])))
| |--Parallelism(Repartition Streams, PARTITION
COLUMNS:([da].[cod_item], [ph].[cod_grupo_endo]))
| |--Hash Match(Inner Join,
HASH:([ph].[id_pv])=([da].[id_pv]))
| |--Bitmap(HASH:([ph].[id_pv]),
DEFINE:([Bitmap1007]))
| | |--Parallelism(Repartition
Streams, PARTITION COLUMNS:([ph].[id_pv]))
| | |--Nested Loops(Left Anti
Semi Join, WHERE:([ph].[id_pv_modifica]=NULL OR
[ph].[id_pv]=[ph].[id_pv_modifica]))
| | |--Bookmark
Lookup(BOOKMARK:([Bmk1001]), OBJECT:([parametrizacion].[dbo].[pv_header] AS
[ph]))
| | |
|--Parallelism(Distribute Streams)
| | | |--Index
Seek(OBJECT:([parametrizacion].[dbo].[pv_header].[pv_header_pol_ramo_suc_pk]
AS [ph]), SEEK:([ph].[cod_suc]d0 AND [ph].[cod_ramo]@ AND
[ph].[nro_pol]00000001) ORDERED FORWARD)
| | |--Table Spool
| | |--Nested
Loops(Inner Join, OUTER REFERENCES:([ph].[cod_grupo_endo]))
| | |--Bookmark
Lookup(BOOKMARK:([Bmk1003]), OBJECT:([parametrizacion].[dbo].[pv_header] AS
[ph]))
| | | |--Index
Seek(OBJECT:([parametrizacion].[dbo].[pv_header].[pv_header_pol_ramo_suc_pk]
AS [ph]), SEEK:([ph].[cod_suc]d0 AND [ph].[cod_ramo]@ AND
[ph].[nro_pol]00000001) ORDERED FORWARD)
| | |--Clustered
Index Seek(OBJECT:([parametrizacion].[dbo].[tgrupo_endo].[tgrupo_endo_pk] AS
[tg]), SEEK:([tg].[cod_grupo_endo]=[ph].[cod_grupo_endo]),
WHERE:([tg].[sn_cancelacion_endoso]=-1) ORDERED FORWARD)
| |--Parallelism(Repartition Streams,
PARTITION COLUMNS:([da].[id_pv]), WHERE:(PROBE([Bitmap1007])=TRUE))
| |--Table
Scan(OBJECT:([parametrizacion].[dbo].[di_datos_au] AS [da]),
WHERE:([da].[fec_vig_desde]<='Nov 6 2004 12:00AM'))
|--Clustered Index
Seek(OBJECT:([parametrizacion].[dbo].[tgrupo_endo].[tgrupo_endo_pk] AS [te]),
SEEK:([te].[cod_grupo_endo]=[ph].[cod_grupo_endo]),
WHERE:((((((([te].[sn_adicional]=-1 OR [te].[sn_poliza]=-1) OR
[te].[sn_prorroga]=-1) OR [te].[sn_renovacion_automatica]=-1) OR
[te].[sn_renovacion_manual]=-1) OR [te].[sn_rehabilitacion]=-1) OR
[te].[sn_declaracion]=-1) OR [te].[sn_refacturacion_manual]=-1) ORDERED
FORWARD)

Los indices de la tabla son:

indice Agrupado
Columnas
di_datos_au_pk No id_pv,
cod_item
idx_di_datos_au_cha No txt_chasis
idx_di_datos_au_form No
nro_formulario
idx_di_datos_au_mot No txt_motor
idx_di_datos_au_pat No txt_patente

Gracias por tu colaboracion.





"Maxi" wrote:

Hola, yo no usaria nolock y dejaria a Sql tomar esa desicion.

Para el plan de ejecucion modo texto debes entrar al Query analizer y hacer

SET SHOWPLAN_TEXT ON

Tambien seria bueno que me pases que indices tienen esas tablas


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Walter" escribió en el mensaje
news:
> como obtengo el plan de ejecucion en modo texto?,
> Nolock es para que bloquee es tabla.
> si tengo indixes.
>
>
> "Maxi" escribió:
>
>> Hola, varias cosas:
>>
>> 1) No uses Where para unir tablas sino usa JOIN
>> 2) Porque usas Nolock?
>>
>> Ahora preguntas
>>
>> 1) Tienes indices no?
>> 2) podrias en lugar de enviar la sentencia, enviarnos el plan de
>> ejecucion
>> en modo texto?
>>
>>
>> Maxi - Buenos Aires - Argentina
>> Desarrollador 3 Estrellas
>>
>> Msn_messager:
>> mail: Maxi.da[arroba]gmail.com
>>
>> "Walter" escribió en el mensaje
>> news:
>> > Hola
>> >
>> > Como elimino un table scan de un campo de fecha, el query es el
>> > siguiente:
>> >
>> > SELECT da.cod_item, MAX( ph.nro_endoso )
>> > FROM di_datos_au da with (nolock), pv_header ph with (nolock),
>> > tgrupo_endo
>> > te with (nolock) WHERE ph.nro_pol = 9000000001 AND ph.id_pv =
>> > da.id_pv
>> > AND ph.cod_suc = 640 AND ph.cod_ramo = 40 AND (ph.cod_grupo_endo > >> > te.cod_grupo_endo) AND (sn_adicional = -1 or sn_poliza = -1 or
>> > sn_prorroga > >> > -1 or sn_renovacion_automatica = -1 or sn_renovacion_manual = -1 or
>> > sn_rehabilitacion = -1 or sn_declaracion = -1 or
>> > sn_refacturacion_manual
>> > = -1
>> > )
>> > AND da.fec_vig_desde <= cast('20041106' as smalldatetime)
>> > AND ph.id_pv NOT IN ( SELECT ph.id_pv_modifica FROM pv_header ph with
>> > (nolock), tgrupo_endo tg with (nolock)
>> > WHERE ph.cod_grupo_endo = tg.cod_grupo_endo And
>> > tg.sn_cancelacion_endoso
>> > = -1
>> > AND ph.cod_suc = 640
>> > AND ph.cod_ramo = 40
>> > AND ph.nro_pol = 9000000001 )
>> > GROUP BY da.cod_item order by da.cod_item
>> >
>> > Gracias espero sus comentarios
>>
>>
>>



Respuesta Responder a este mensaje
#5 Maxi
17/08/2005 - 17:26 | Informe spam
Hola, aqui tienes el problema

:([parametrizacion].[dbo].[di_datos_au] AS [da]),
WHERE:([da].[fec_vig_desde]<='Nov 6 2004 12:00AM'

Fijate que esta tabla tenga un indice por la columna fec_vig_desde


Salu2
Maxi


"Walter" escribió en el mensaje
news:
Hola Maxi,

Este seria el plan:


|--Stream Aggregate(GROUP BY:([da].[cod_item])
DEFINE:([Expr1005]=MAX([partialagg1006])))
|--Parallelism(Gather Streams, ORDER BY:([da].[cod_item] ASC))
|--Nested Loops(Inner Join, OUTER
REFERENCES:([ph].[cod_grupo_endo]))
|--Sort(ORDER BY:([da].[cod_item] ASC))
| |--Hash Match(Aggregate, HASH:([da].[cod_item],
[ph].[cod_grupo_endo]), RESIDUAL:([da].[cod_item]=[da].[cod_item] AND
[ph].[cod_grupo_endo]=[ph].[cod_grupo_endo])
DEFINE:([partialagg1006]=MAX([ph].[nro_endoso])))
| |--Parallelism(Repartition Streams, PARTITION
COLUMNS:([da].[cod_item], [ph].[cod_grupo_endo]))
| |--Hash Match(Inner Join,
HASH:([ph].[id_pv])=([da].[id_pv]))
| |--Bitmap(HASH:([ph].[id_pv]),
DEFINE:([Bitmap1007]))
| | |--Parallelism(Repartition
Streams, PARTITION COLUMNS:([ph].[id_pv]))
| | |--Nested Loops(Left Anti
Semi Join, WHERE:([ph].[id_pv_modifica]=NULL OR
[ph].[id_pv]=[ph].[id_pv_modifica]))
| | |--Bookmark
Lookup(BOOKMARK:([Bmk1001]), OBJECT:([parametrizacion].[dbo].[pv_header]
AS
[ph]))
| | |
|--Parallelism(Distribute Streams)
| | | |--Index
Seek(OBJECT:([parametrizacion].[dbo].[pv_header].[pv_header_pol_ramo_suc_pk]
AS [ph]), SEEK:([ph].[cod_suc]d0 AND [ph].[cod_ramo]@ AND
[ph].[nro_pol]00000001) ORDERED FORWARD)
| | |--Table Spool
| | |--Nested
Loops(Inner Join, OUTER REFERENCES:([ph].[cod_grupo_endo]))
| | |--Bookmark
Lookup(BOOKMARK:([Bmk1003]), OBJECT:([parametrizacion].[dbo].[pv_header]
AS
[ph]))
| | | |--Index
Seek(OBJECT:([parametrizacion].[dbo].[pv_header].[pv_header_pol_ramo_suc_pk]
AS [ph]), SEEK:([ph].[cod_suc]d0 AND [ph].[cod_ramo]@ AND
[ph].[nro_pol]00000001) ORDERED FORWARD)
| | |--Clustered
Index Seek(OBJECT:([parametrizacion].[dbo].[tgrupo_endo].[tgrupo_endo_pk]
AS
[tg]), SEEK:([tg].[cod_grupo_endo]=[ph].[cod_grupo_endo]),
WHERE:([tg].[sn_cancelacion_endoso]=-1) ORDERED FORWARD)
| |--Parallelism(Repartition Streams,
PARTITION COLUMNS:([da].[id_pv]), WHERE:(PROBE([Bitmap1007])=TRUE))
| |--Table
Scan(OBJECT:([parametrizacion].[dbo].[di_datos_au] AS [da]),
WHERE:([da].[fec_vig_desde]<='Nov 6 2004 12:00AM'))
|--Clustered Index
Seek(OBJECT:([parametrizacion].[dbo].[tgrupo_endo].[tgrupo_endo_pk] AS
[te]),
SEEK:([te].[cod_grupo_endo]=[ph].[cod_grupo_endo]),
WHERE:((((((([te].[sn_adicional]=-1 OR [te].[sn_poliza]=-1) OR
[te].[sn_prorroga]=-1) OR [te].[sn_renovacion_automatica]=-1) OR
[te].[sn_renovacion_manual]=-1) OR [te].[sn_rehabilitacion]=-1) OR
[te].[sn_declaracion]=-1) OR [te].[sn_refacturacion_manual]=-1) ORDERED
FORWARD)

Los indices de la tabla son:

indice Agrupado
Columnas
di_datos_au_pk No
id_pv,
cod_item
idx_di_datos_au_cha No
txt_chasis
idx_di_datos_au_form No
nro_formulario
idx_di_datos_au_mot No txt_motor
idx_di_datos_au_pat No
txt_patente

Gracias por tu colaboracion.





"Maxi" wrote:

Hola, yo no usaria nolock y dejaria a Sql tomar esa desicion.

Para el plan de ejecucion modo texto debes entrar al Query analizer y
hacer

SET SHOWPLAN_TEXT ON

Tambien seria bueno que me pases que indices tienen esas tablas


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Walter" escribió en el mensaje
news:
> como obtengo el plan de ejecucion en modo texto?,
> Nolock es para que bloquee es tabla.
> si tengo indixes.
>
>
> "Maxi" escribió:
>
>> Hola, varias cosas:
>>
>> 1) No uses Where para unir tablas sino usa JOIN
>> 2) Porque usas Nolock?
>>
>> Ahora preguntas
>>
>> 1) Tienes indices no?
>> 2) podrias en lugar de enviar la sentencia, enviarnos el plan de
>> ejecucion
>> en modo texto?
>>
>>
>> Maxi - Buenos Aires - Argentina
>> Desarrollador 3 Estrellas
>>
>> Msn_messager:
>> mail: Maxi.da[arroba]gmail.com
>>
>> "Walter" escribió en el mensaje
>> news:
>> > Hola
>> >
>> > Como elimino un table scan de un campo de fecha, el query es el
>> > siguiente:
>> >
>> > SELECT da.cod_item, MAX( ph.nro_endoso )
>> > FROM di_datos_au da with (nolock), pv_header ph with (nolock),
>> > tgrupo_endo
>> > te with (nolock) WHERE ph.nro_pol = 9000000001 AND ph.id_pv >> >> > da.id_pv
>> > AND ph.cod_suc = 640 AND ph.cod_ramo = 40 AND
>> > (ph.cod_grupo_endo >> >> > te.cod_grupo_endo) AND (sn_adicional = -1 or sn_poliza = -1 or
>> > sn_prorroga >> >> > -1 or sn_renovacion_automatica = -1 or sn_renovacion_manual = -1 or
>> > sn_rehabilitacion = -1 or sn_declaracion = -1 or
>> > sn_refacturacion_manual
>> > = -1
>> > )
>> > AND da.fec_vig_desde <= cast('20041106' as smalldatetime)
>> > AND ph.id_pv NOT IN ( SELECT ph.id_pv_modifica FROM pv_header ph
>> > with
>> > (nolock), tgrupo_endo tg with (nolock)
>> > WHERE ph.cod_grupo_endo = tg.cod_grupo_endo And
>> > tg.sn_cancelacion_endoso
>> > = -1
>> > AND ph.cod_suc = 640
>> > AND ph.cod_ramo = 40
>> > AND ph.nro_pol = 9000000001 )
>> > GROUP BY da.cod_item order by da.cod_item
>> >
>> > Gracias espero sus comentarios
>>
>>
>>



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