Afectan los null a los índices?

15/01/2008 - 15:52 por xurxof | Informe spam
Aunque el problema ya ha sido solucionado, hoy me he encontrado con
una situación que no alcanzo a comprender. No soy un usuario
experimentado de SQL Server, pero no encuentro nada que pueda explicar
el siguiente comportamiento:
Tengo una tabla y deseo saber el el valor máximo de una fecha para
varios registros. Dependiendo de como construya cierto índice, SQL
Server es capaz de localizar el registro. En el primer caso el campo
fecha se ordena ascendente y la instrucción SELECT no devuelve ningún
registro. Si el campo se indexa descendentemente lo encuentra sin
problema. Veamos:


CREATE NONCLUSTERED INDEX
[IX_PedidosComprasLineas_IdPedidoCompra_PclFechaPrevistaRecepcion_] ON
[dbo].[PedidosComprasLineas]
(
[IdPedidoCompra] ASC,
[PclFechaPrevistaRecepcion] DESC

)WITH FILLFACTOR = 90 ON [PRIMARY]



SELECT IdPedidoCompra, MAX(PclFechaPrevistaRecepcion) AS
FechaPrevistaRecepcion
FROM dbo.PedidosComprasLineas
GROUP BY IdPedidoCompra
HAVING (IdPedidoCompra B962)


IdPedidoCompra FechaPrevistaRecepcion
42962 NULL
Advertencia: valor NULL eliminado por el agregado u otra operación
SET.

(1 filas afectadas)





Sin embargo:



CREATE NONCLUSTERED INDEX
[IX_PedidosComprasLineas_IdPedidoCompra_PclFechaPrevistaRecepcion]
ON [dbo].[PedidosComprasLineas]
(
[IdPedidoCompra] ASC,
[PclFechaPrevistaRecepcion] ASC

)WITH FILLFACTOR = 90 ON [PRIMARY]



SELECT IdPedidoCompra, MAX(PclFechaPrevistaRecepcion) AS
FechaPrevistaRecepcion
FROM dbo.PedidosComprasLineas
GROUP BY IdPedidoCompra
HAVING (IdPedidoCompra B962)



IdPedidoCompra FechaPrevistaRecepcion

(0 filas afectadas)





¿Porqué ocurre esto?
 

Leer las respuestas

#1 Alejandro Mesa
15/01/2008 - 19:50 | Informe spam
Interesante el problema.

Me pregunto por que filtras en la clausula HAVING y no en la clausula WHERE?

SELECT
IdPedidoCompra,
MAX(PclFechaPrevistaRecepcion) AS FechaPrevistaRecepcion
FROM
dbo.PedidosComprasLineas
WHERE
(IdPedidoCompra B962)
GROUP BY
IdPedidoCompra

Puedes mostrarnos el plan de ejecucion de ambos casos, indice con ASC e
indice con DESC?


AMB


"" wrote:

Aunque el problema ya ha sido solucionado, hoy me he encontrado con
una situación que no alcanzo a comprender. No soy un usuario
experimentado de SQL Server, pero no encuentro nada que pueda explicar
el siguiente comportamiento:
Tengo una tabla y deseo saber el el valor máximo de una fecha para
varios registros. Dependiendo de como construya cierto índice, SQL
Server es capaz de localizar el registro. En el primer caso el campo
fecha se ordena ascendente y la instrucción SELECT no devuelve ningún
registro. Si el campo se indexa descendentemente lo encuentra sin
problema. Veamos:


CREATE NONCLUSTERED INDEX
[IX_PedidosComprasLineas_IdPedidoCompra_PclFechaPrevistaRecepcion_] ON
[dbo].[PedidosComprasLineas]
(
[IdPedidoCompra] ASC,
[PclFechaPrevistaRecepcion] DESC

)WITH FILLFACTOR = 90 ON [PRIMARY]



SELECT IdPedidoCompra, MAX(PclFechaPrevistaRecepcion) AS
FechaPrevistaRecepcion
FROM dbo.PedidosComprasLineas
GROUP BY IdPedidoCompra
HAVING (IdPedidoCompra B962)


IdPedidoCompra FechaPrevistaRecepcion
42962 NULL
Advertencia: valor NULL eliminado por el agregado u otra operación
SET.

(1 filas afectadas)





Sin embargo:



CREATE NONCLUSTERED INDEX
[IX_PedidosComprasLineas_IdPedidoCompra_PclFechaPrevistaRecepcion]
ON [dbo].[PedidosComprasLineas]
(
[IdPedidoCompra] ASC,
[PclFechaPrevistaRecepcion] ASC

)WITH FILLFACTOR = 90 ON [PRIMARY]



SELECT IdPedidoCompra, MAX(PclFechaPrevistaRecepcion) AS
FechaPrevistaRecepcion
FROM dbo.PedidosComprasLineas
GROUP BY IdPedidoCompra
HAVING (IdPedidoCompra B962)



IdPedidoCompra FechaPrevistaRecepcion

(0 filas afectadas)





¿Porqué ocurre esto?

Preguntas similares