Problema con query sencillo

05/09/2007 - 19:00 por Cacho | Informe spam
Muy buenas.
Antes que nada deseo agradecer la posibilidad de postear en el foro y la
atención que puedan dispensarme.
Tengo un problema con un query sencillo y la descripción es:
En SQL2005 tengo una tabla que consultar, esta tabla tiene vistas ya
armadas, organizadas mensualmente.

La consulta es sencillita:
SELECT campo1, campo2, ... FROM tabla
WHERE campoFecha BETWEEN fecha1 AND fecha2 AND campoInt = entero.

Tanto campoFecha como campoInt pertenecen a la Primary Key.
campoFecha es el primer campo de la Primary Key, campoInt está en el 4°
lugar, La Primary Key contiene cinco campos.

Problema:
El resultado de la consulta es erroneo, es decir que los registros que me
devuelve no son los que espero y no corresponden al criterio ingresado.

Al consultar el plan de ejecución, noto que el query usa una vista, pero
esta vista no pertenece al rango de fechas ingresado como criterio.
Si quito el campoInt del criterio, el query usa la tabla y no la vista por
lo que el resultado es correcto.

Perdon por la extension y desde ya, muchas gracias por leer.

Preguntas similare

Leer las respuestas

#6 Cacho
05/09/2007 - 22:36 | Informe spam
Hola Maxi.

Te agradeaco nuevament eel interés.

Llamo "SQL dinámico" a la cadena que envié antes por que se creo dentro de
un programa y este programa envió la string creada a una conexion para su
ejecución.

te envío el plan de ejecucion para tu análisis, pero te aclaro que pude
arreglarlo creando un "stored procedure" que invoco enviando parámetros en
lugar de usar la string de ejecución.

plan de ejecucion:
StmtText
-

SELECT N.idNoticia, F.DescInterna As Fuente, N.Fecha, N.Titulo, A.Ruta,
A.Nombre, VW.URL
FROM Noticias N WITH(NOLOCK)
INNER JOIN Fuentes F WITH(NOLOCK) ON
F.idFuente = N.idFuente
LEFT JOIN VinculosWeb VW WITH(NOLOCK) ON
N.idVinculosWeb = VW.id

(1 row(s) affected)

StmtText

|--Nested Loops(Left Outer Join, OUTER REFERENCES:([N].[idArchivos],
[Expr1370]) OPTIMIZED WITH UNORDERED PREFETCH)
|--Nested Loops(Left Outer Join, OUTER
REFERENCES:([N].[idVinculosWeb], [Expr1369]) OPTIMIZED WITH UNORDERED
PREFETCH)
| |--Nested Loops(Inner Join)
| | |--Clustered Index
Seek(OBJECT:([RI2000].[dbo].[Fuentes].[PK_Fuentes] AS [F]),
SEEK:([F].[idFuente]=(93)) ORDERED FORWARD)
| | |--Filter(WHERE:([RI2000].[dbo].[Noticias].[idFuente] as
[N].[idFuente]=(93)))
| | |--Nested Loops(Inner Join, OUTER
REFERENCES:([PtnIds1199], [N].[idNoticia]) PARTITION ID:([PtnIds1199])
OPTIMIZED)
| | |--Compute
Scalar(DEFINE:([PtnIds1199]=RangePartitionNew([RI2000].[dbo].[ZNoticias200710].[idNoticia],(1),(10000000),(20000000),(30000000),(40000000),(60000000),(70000000),(80000000),(90000000),(100000000))))
| | | |--Nested Loops(Inner Join, OUTER
REFERENCES:([PtnIds1200]) PARTITION ID:([PtnIds1200]))
| | | |--Constant
Scan(VALUES:(((1)),((2)),((3)),((4)),((5)),((6)),((7)),((8)),((9)),((10))))
| | | |--Index
Scan(OBJECT:([RI2000].[dbo].[ZNoticias200710].[IX_FechaPaisFuente200710]),
PARTITION ID:([PtnIds1200]))
| | |--Clustered Index
Seek(OBJECT:([RI2000].[dbo].[Noticias].[PK_Noticias] AS [N]),
SEEK:([N].[idNoticia]=[RI2000].[dbo].[Noticias].[idNoticia] as
[N].[idNoticia]) LOOKUP ORDERED FORWARD PARTITION ID:([PtnIds1199]))
| |--Clustered Index
Seek(OBJECT:([RI2000].[dbo].[VinculosWeb].[PK_VinculosWeb] AS [VW]),
SEEK:([VW].[idVinWeb]=[RI2000].[dbo].[Noticias].[idVinculosWeb] as
[N].[idVinculosWeb]) ORDERED FORWARD)
|--Clustered Index
Seek(OBJECT:([RI2000].[dbo].[Archivos].[IX_Archivos] AS [A]),
SEEK:([A].[idGrupo]=[RI2000].[dbo].[Noticias].[idArchivos] as
[N].[idArchivos]) ORDERED FORWARD)

(13 row(s) affected)


Desde ya, muchísimas gracias por tanto interés.

"Maxi" wrote:

Mostrar la cita
#7 Maxi
06/09/2007 - 02:43 | Informe spam
Hola, ok! te vuelvo a repetir, SQL no selecciona una tabla o una vista solo,
eso se lo decis vos en la sentencia SQL que uses, si haces referencia a una
tabla entonces usara una tabla, si es una vista seroa una vista o una
funcion lo mismo

"Cacho" escribió en el mensaje de noticias
news:
Mostrar la cita
#8 Cacho
06/09/2007 - 14:28 | Informe spam
Gracias Maxi.

Entiendo lo que me decís, pero me confunde el hecho de que la consulta la
hago a la tabla Noticias, sin embargo en el plan de ejecución, podes como
consulta a ZNoticias200710 cuando el criterio es BETWEEN '30/07/2007' AND
'30/07/2007', es decir solo un día.

Esto se debe a que la tabla Noticias está particionada, y esas particiones
organizadas por mes, de ahi el nombre que en este caso nos lleva a octubre de
2007. Estas particiones incluyen la fecha en su clave primaria.

La solucion la encontre al usar un stored procedure y consultar con
variables tipo smalldatetime (BETWEEN @Fecha1 AND @Fecha2).

Aunque tu mensaje es claro, no se como es que SQL llega a consultar una de
estas particiones, ni por que busca en donde no hay datos.

De todas formas esta resuelto. Muchísimas gracias.

"Maxi" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida