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

Preguntas similare

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


Respuesta Responder a este mensaje
#2 Javier Loria
07/04/2004 - 18:34 | Informe spam
Hola Jose:
Porque no normalizas la columna cod_materia en cada una de sus partes?.
Algo como:
, PenSum CHAR(2) NOT NULL
CHECK (PenSum LIKE '[0-9][0-9]')
, Escuela CHAR(2) NOT NULL
CHECK (Escuela LIKE '[0-9][0-9]')
, Semestre CHAR(2) NOT NULL
CHECK (Semestre LIKE '[0-9][0-9]')
Esto te permite usar indices de forma adecuada, y hacer la sintaxis
muchos mas sencilla. Adicionalmente si no quieres complicarte mucho puedes
hacer un campo calculado (en SQL 2000) que sea la concatenacion de los 3:
, cod_materia AS PenSum+Escuela+Semestre
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
"José G. Díaz U." wrote in message
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


Respuesta Responder a este mensaje
#3 José G. Díaz U.
07/04/2004 - 23:14 | Informe spam
Hola!

Siento un gran alivio por haber tenido la visión para pensar en la
modificación de la tabla. Desafortunadamente estas tablas no están bajo mi
administración y la modificación de las mismas la planteé en su momento y me
negaron la petición.

Se que en Oracle existen lo que llaman Vistas Materializadas, desconozco si
en SQL Server podría crear una vista con la información que facilite esta
disgregación del cod_materia. También me pareció leer en alguna parte que es
posible crear índices sobre vistas, no estoy seguro.

Esta podría ser una tercer opción?

Gracias por los consejos!

Jo


"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


Respuesta Responder a este mensaje
#4 Jose Mariano Alvarez \(MUG\)
08/04/2004 - 04:10 | Informe spam
Tienes la opcion que te dijeron antes respecto de indexar una columna
calculada o tambien armar una Vista Indexada. La primera es la solucion mas
elegante a mi criterio.


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar

"José G. Díaz U." wrote in message
news:
Hola!

Siento un gran alivio por haber tenido la visión para pensar en la
modificación de la tabla. Desafortunadamente estas tablas no están bajo mi
administración y la modificación de las mismas la planteé en su momento y


me
negaron la petición.

Se que en Oracle existen lo que llaman Vistas Materializadas, desconozco


si
en SQL Server podría crear una vista con la información que facilite esta
disgregación del cod_materia. También me pareció leer en alguna parte que


es
posible crear índices sobre vistas, no estoy seguro.

Esta podría ser una tercer opción?

Gracias por los consejos!

Jo


"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
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida