Esta es una parte de mis preguntas de exámenes anteriores:
Optimice lo siguiente y suponga que hay un índice en Members.lname:
SELECT fname, lname FROM Members WHERE lname <> 'Rogers' AND memberType='Student';Por lo tanto, he intentado:
SELECT fname, lname FROM Members WHERE lname > 'Rogers' OR lname < 'Rogers'AND memberType='Student';Intenté esto porque dividir <> fuerza el uso del índice; sin embargo, mi respuesta es incorrecta. Me preguntaba si alguien podría ayudarme y orientarme en la dirección correcta.
En mi opinión, la consulta original en sí no se puede optimizar.
Que haya un índice en lname no debería tener ningún impacto en la consulta. Todos los miembros tendrán un nombre y algunos miembros serán Rogers. Entonces, el DBMS no debe usar el índice, sino simplemente leer la tabla completa.
"Optimizar lo siguiente", sin embargo, puede permitir optimizar la consulta indirectamente creando otro índice. Este índice debe contener al menos y comenzar con memberType :
create index idx1 on members (membertype); El uso de este índice para la consulta probablemente dependerá de lo que haya en la tabla. Si el 99 % de los miembros son estudiantes, el DBMS debería leer la tabla completa. Si son solo unos pocos estudiantes (digamos 3%), entonces tiene sentido usar el índice, y el DBMS usaría el índice para encontrar a los estudiantes en la tabla y luego verificaría lname en el registro.
Habiendo dicho esto, podríamos querer esto en su lugar:
create index idx2 on members (membertype, lname);entonces el DBMS lee el índice, encuentra a los estudiantes, ve inmediatamente si el nombre es Rogers y solo accede a la tabla para los registros deseados.
Un índice aún mejor sería un índice de cobertura que contuviera todas las columnas en cuestión, por lo que ya no es necesario leer la tabla, ya que toda la información está en el índice:
create index idx3 on members (membertype, lname, fname);Como se mencionó, el DBMS aún puede leer la tabla completa cuando asume que la mayoría de los registros coincidirán de todos modos. Los índices son solo una oferta al DBMS que puede usar o no.