Optimizar Consulta

07/04/2004 - 09:25 por José G. Díaz U. | Informe spam
Saludos.

Quisiera que le echaran un vistazo por dos razones: La primera es saber si
está correcta y la segunda si es posible optimizarla ya que puedo notar que
demora algo en ejecutarse.

Aquí va:

select distinct ra.cedula
from materia mat inner join record_academico ra on mat.cod_materia ra.cod_materia
where (ra.cod_periodo = 102) and
(ra.condicion = 6) and
(substring(ra.cod_materia,5,2) = '01') and
(ra.cedula NOT IN (select distinct cedula
from record_academico ra
where
substring(ra.cod_materia,5,2) = '02' or

substring(ra.cod_materia,5,2) = '03' or

substring(ra.cod_materia,5,2) = '04' or

substring(ra.cod_materia,5,2) = '05' or

substring(ra.cod_materia,5,2) = '06' or

substring(ra.cod_materia,5,2) = '07' or

substring(ra.cod_materia,5,2) = '08' or

substring(ra.cod_materia,5,2) = '09' or

substring(ra.cod_materia,5,2) = '10'))

La idea es listar las cédula de Estudiantes nuevos en la Universidad por
período.
Los códigos de materias tienen la siguiente estructura: 06050110 que
quiere decir
Pensum: 06 -> El número del Pensum. Actualmente son solo dos valores:
O 06 ó 07
Escuela: 05 -> En este caso 05 es el código de la Escuela de
Administración
Semestre: 01 -> Número del Semestre!!!...este me indica que la materia
pertenece al Primer Semestre
Numeral: 10 -> Un numero indicador de la materia, no tiene importancia

Condición = 6 -> significa que la materia fue cursada.

Lo que busco comparar si la cédula asociada a la materia no existe en algún
otro semestre. Si es así, entonces es porque el estudiante es NUEVO por
tener solo una materia aprobada del primer semestre.

Gracias de antemano!

Jo
 

Leer las respuestas

#1 Miguel Egea
07/04/2004 - 10:06 | Informe spam
Este tipo de comandos no pueden ser optimizados
substring(ra.cod_materia,5,2) = '02'
obligas a hacer un scan completo a tu tabla, ¿como solucionarlo?, añade a
tu tabla un campo calculado que sea ese substring, crea un índice por ese
campo
y despues cambia todos esos 'or' por NuevoCampo>='01' and Nuevocampo<='10'
Además crea un índice en Record_academio con el campo
cod_periodo,condicion,NuevoCAmpo,cedula), excepto que cedula sea tu índice
clustered en cuyo caso puede no ser necesario incluirla en el índice.


Saludos

Miguel Egea
Microsoft SQL-SERVER MVP
Brigada Anti-Cursores
http://www.portalsql.com

(Quita el online si me tienes que mandar un correo)



"José G. Díaz U." escribió en el mensaje
news:uTpi$
Saludos.

Quisiera que le echaran un vistazo por dos razones: La primera es saber si
está correcta y la segunda si es posible optimizarla ya que puedo notar


que
demora algo en ejecutarse.

Aquí va:

select distinct ra.cedula
from materia mat inner join record_academico ra on mat.cod_materia > ra.cod_materia
where (ra.cod_periodo = 102) and
(ra.condicion = 6) and
(substring(ra.cod_materia,5,2) = '01') and
(ra.cedula NOT IN (select distinct cedula
from record_academico ra
where
substring(ra.cod_materia,5,2) = '02' or

substring(ra.cod_materia,5,2) = '03' or

substring(ra.cod_materia,5,2) = '04' or

substring(ra.cod_materia,5,2) = '05' or

substring(ra.cod_materia,5,2) = '06' or

substring(ra.cod_materia,5,2) = '07' or

substring(ra.cod_materia,5,2) = '08' or

substring(ra.cod_materia,5,2) = '09' or

substring(ra.cod_materia,5,2) = '10'))

La idea es listar las cédula de Estudiantes nuevos en la Universidad por
período.
Los códigos de materias tienen la siguiente estructura: 06050110 que
quiere decir
Pensum: 06 -> El número del Pensum. Actualmente son solo dos


valores:
O 06 ó 07
Escuela: 05 -> En este caso 05 es el código de la Escuela de
Administración
Semestre: 01 -> Número del Semestre!!!...este me indica que la


materia
pertenece al Primer Semestre
Numeral: 10 -> Un numero indicador de la materia, no tiene


importancia

Condición = 6 -> significa que la materia fue cursada.

Lo que busco comparar si la cédula asociada a la materia no existe en


algún
otro semestre. Si es así, entonces es porque el estudiante es NUEVO por
tener solo una materia aprobada del primer semestre.

Gracias de antemano!

Jo


Preguntas similares