SQL Server - Error de consulta sql server 2000

 
Vista:

Error de consulta sql server 2000

Publicado por victor (2 intervenciones) el 24/10/2011 19:50:52
Buenos dias tengo el sigueinte problema tengo mi base de datos en sql server 2000:
y tengo un store procedure es el siguiente:

alter Procedure Sp_sel_Programa_Curso
@Cod_Entidad char(2),
@Cod_Programa_Curso char(10),
@Cod_Linea char(2),
@Cod_Interlinea char(2),
@Cod_SubLinea char(2),
@Cod_Producto char(3),
@Cod_Curso char(4),
@Cod_Plan_Curricular char(4),
@Cod_Sucursal char(2),
@Cod_Programacion char(7),
@Cod_Personal char(6),
@TE_Periodo char(7),
@Caso char(1)='0',
@TE_Tipo_Programacion char(1) = ''
as
Select Pg.Cod_Entidad,Pg.Cod_Linea,Pg.Cod_Interlinea,Pg.Cod_Sublinea,Pg.Cod_Producto,Pc.Correlativo,Pg.Cod_Programa_Curso,
Pg.Cod_Curso,Pg.Cod_Plan_Curricular,Pg.Cod_Sucursal,Pg.Cod_Programacion,Pg.Fec_Inicio,Pg.Fec_Termino,Pg.Vacantes,
Pg.Fec_Exa_Parcial,Pg.Fec_Exa_Final,Pg.Fec_Reg,Pg.Cod_Usuario,Pg.Cod_Personal,E.Razon_Social,
L.Descripcion As Linea,It.Descripcion As Interlinea,Sl.Descripcion As SubLinea,Pr.Descripcion As Producto,
C.Descripcion As Curso,Pc.Creditos,Pc.Horas_Teoria,Pc.Horas_Practica,Pe.Paterno As Paterno_Docente,
Pe.Materno As Materno_Docente,Pe.Nombres As Nombres_Docente,Pg.Cod_Calificacion,P.TE_Horario,P.TE_Frecuencia,
Ca.Descripcion as Tipo_Calificacion,S01.Descripcion As Estado_Programa,Pg.Seccion,P.TE_Periodo,
P.TE_Turno,S02.Descripcion As Turno,Sl.Descripcion As Sub,C.Descripcion As Cur,Sl.Alias As A_SubLinea,
P.TE_Tipo_Programacion,P.Numero_Aula,Pg.Vacantes,Pg.Estado,P.TE_Estado,S02.Valor3 As Tur,C.Alias As Curso_Alias
From Programa_Curso Pg
Inner Join Curso C On
Pg.Cod_Entidad = C.Cod_Entidad and Pg.Cod_Curso = C.Cod_Curso
Inner Join Calificacion Ca On
Pg.Cod_Entidad = Ca.cod_entidad
and Pg.Cod_Calificacion = Ca.cod_Calificacion
Inner Join Programacion P On
Pg.Cod_Entidad = P.Cod_Entidad and Pg.Cod_Sucursal =P.Cod_Sucursal
and Pg.Cod_Programacion = P.Cod_Programacion
Inner Join Plan_Curricular Pc On
Pg.Cod_Entidad = Pc.Cod_Entidad and Pg.Cod_Linea = Pc.Cod_Linea
and Pg.Cod_interlinea = Pc.Cod_interlinea and Pg.Cod_SubLinea = Pc.Cod_SubLinea
and Pg.Cod_Producto = Pc.Cod_Producto and Pg.Cod_Curso = Pc.Cod_Curso
and Pg.Cod_Plan_Curricular = Pc.Cod_Plan_Curricular
Inner Join Producto Pr On
Pg.Cod_Entidad = Pr.Cod_Entidad and Pg.Cod_Linea = Pr.Cod_Linea
and Pg.Cod_interlinea = Pr.Cod_interlinea and Pg.Cod_SubLinea = Pr.Cod_SubLinea
and Pg.Cod_Producto = Pr.Cod_Producto
Inner Join SubLinea Sl On
Pg.Cod_Entidad = Sl.Cod_Entidad and Pg.Cod_Linea = Sl.Cod_Linea
and Pg.Cod_interlinea = Sl.Cod_interlinea and Pg.Cod_SubLinea = Sl.Cod_SubLinea
Inner Join Interlinea It On
Pg.Cod_Entidad = It.Cod_Entidad and Pg.Cod_Linea = It.Cod_Linea
and Pg.Cod_interlinea = It.Cod_interlinea
Inner Join Linea L On
Pg.Cod_Entidad = L.Cod_Entidad and Pg.Cod_Linea = L.Cod_Linea
Inner Join Entidad E On
Pg.Cod_Entidad = E.Cod_Entidad
Inner Join SysTabExter02 S01 On
Pg.Cod_Entidad = S01.Cod_Entidad and S01.Cod_Tabla = 'TEPR'
And Pg.TE_Estado = S01.Cod_Argumento
Inner Join SysTabExter02 S02 On
Pg.Cod_Entidad = S02.Cod_Entidad and S02.Cod_Tabla = 'TTUR'
And P.TE_Turno = S02.Cod_Argumento

Inner Join Personal Pe On
Pg.Cod_Personal = Pe.Cod_Personal
where
Pg.Cod_Entidad = Case When IsNull(@Cod_Entidad,'') = '' Then Pg.Cod_Entidad
Else @Cod_Entidad End
And Pg.Cod_Programa_Curso = Case When IsNull(@Cod_Programa_Curso,'') = '' Then Pg.Cod_Programa_Curso
Else @Cod_Programa_Curso End
And Pg.Cod_Linea = Case When IsNull(@Cod_Linea,'') = '' Then Pg.Cod_Linea
Else @Cod_Linea End
And Pg.Cod_Interlinea = Case When IsNull(@Cod_Interlinea,'') = '' Then Pg.Cod_Interlinea
Else @Cod_Interlinea End
And Pg.Cod_SubLinea = Case When IsNull(@Cod_SubLinea,'') = '' Then Pg.Cod_SubLinea
Else @Cod_SubLinea End
And Pg.Cod_Producto = Case When IsNull(@Cod_Producto,'') = '' Then Pg.Cod_Producto
Else @Cod_Producto End
And Pg.Cod_Curso = Case When IsNull(@Cod_Curso,'') = '' Then Pg.Cod_Curso
Else @Cod_Curso End
And Pg.Cod_Plan_Curricular = Case When IsNull(@Cod_Plan_Curricular,'') = '' Then Pg.Cod_Plan_Curricular
Else @Cod_Plan_Curricular End
And Pg.Cod_Sucursal = Case When IsNull(@Cod_Sucursal,'') = '' Then Pg.Cod_Sucursal
Else @Cod_Sucursal End
And Pg.Cod_Programacion = Case When IsNull(@Cod_Programacion,'') = '' Then Pg.Cod_Programacion
Else @Cod_Programacion End
And Pg.Cod_Personal = Case When IsNull(@Cod_Personal,'') = '' Then Pg.Cod_Personal
Else @Cod_Personal End
And P.TE_Periodo = Case When IsNull(@TE_Periodo,'') = '' Then P.TE_Periodo
Else @TE_Periodo End
And (S01.Valor2 = Case When @Caso In ('0','1','2') Then 'A' End Or
S01.Valor2 = Case When @Caso In ('0','1') Then 'I' End Or
S01.Valor2 = Case When @Caso In ('0') Then 'V' End)
and P.te_tipo_programacion = Case When IsNull(@TE_Tipo_Programacion,'') = '' Then P.te_tipo_programacion
Else @TE_Tipo_Programacion End

Cuando lo ejecuto de la siguiente forma:
Sp_sel_Programa_Curso '05', '', '01','01', '01', '001', '0001', '2004', '01', '', '','2011-2','2',''

En el analizador de consultas se demora mas de 30 segundos y lo que hago es detenerlo.

Pero el detalle es el siguiente. las tablas estan relacionadas tal cual sale en el store procedure arriba explicado, pero cuando realizo el siguiente cambio de este inner join:

Inner Join Calificacion Ca On
Pg.Cod_Entidad = Ca.cod_entidad
and Pg.Cod_Calificacion = Ca.cod_Calificacion

por esto :

Inner Join Calificacion Ca On
Pg.Cod_Calificacion = Ca.cod_Calificacion

El store procedure funciona y lo hace en menos de 1 segundo.

He revisado los planes de ejecucion y estan correctos en ambos casos.

No se la causa del problema o que esta mal, ya que de la tabla "Calificacion" las llaves pk son esas dos y esta unido a "Programa_Curso", teoricamnte debe de funcionar sin problemas.

espero contar con su aporte y ayuda al respecto. muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Error de consulta sql server 2000

Publicado por Isaias (4558 intervenciones) el 25/10/2011 05:30:26
Todos los campos despues del WHERE y los incluidos en INNER JOIN (ON), son canditados a ser INDICES.

¿Estos son indices?
Pg.Cod_Calificacion = Ca.cod_Calificacion

¿NO?, estas haciend un table scan en tu busqueda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error de consulta sql server 2000

Publicado por victor (2 intervenciones) el 25/10/2011 16:00:38
Hola Isaias gracias por responder a mi consulta, te comento que el campo Ca.cod_calificacion, pertenece al PK de la tabla convalidacion, por lo tanto tiene un indice agrupado y en l atabla programa_curso existe un indice no agrupado con los campos cod_entidad,cod_calificacion.

no puedo pegar la imagen del plan de ejecucion que me da el analizador de consultas SQL.

Pero ese incoveniente no logro comprender por que es, ya que no da error en si, solo se demora bastante en dar el resultado que tengo que parar el proceso.

espero haber resuelto tud dudas y asi me puedas ayudar .
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar