Meiner Meinung nach kann die ursprüngliche Abfrage selbst nicht optimiert werden.
Dass es einen Index auf lname
gibt, sollte keinen Einfluss auf die Abfrage haben. Alle Mitglieder haben einen Namen und einige Mitglieder werden Rogers sein. Daher sollte das DBMS den Index nicht verwenden, sondern einfach die vollständige Tabelle lesen.
"Optimierung der folgenden" kann jedoch ermöglichen, die Abfrage indirekt zu optimieren, indem Sie einen anderen Index erstellen. Dieser Index soll mindestens enthalten und beginnt mit memberType
:
create index idx1 on members (membertype);
Ob dieser Index für die Abfrage wahrscheinlich verwendet werden wird davon abhängen, was in der Tabelle ist. Wenn 99% der Mitglieder Studenten sind, sollte das DBMS stattdessen die vollständige Tabelle lesen. Wenn es nur wenige Schüler sind (sagen wir 3%), dann ist die Verwendung des Index sinnvoll, und das DBMS würde den Index verwenden, um die Schüler in der Tabelle zu finden und dann lname
im Datensatz überprüfen.
Having said dies, wir dies stattdessen wünschen könnte:
create index idx2 on members (membertype, lname);
so liest das DBMS den Index, findet die Studenten, sieht sofort, wenn der Name Rogers ist, und greift auf die Tabelle nur für die gewünschten Datensätze.
Ein noch besserer Index wäre immer noch ein abdeckenden Index alle Spalten in Frage enthält, so dass die Tabelle nicht mehr gelesen werden, da alle Informationen in dem Index ist:
create index idx3 on members (membertype, lname, fname);
Wie bereits erwähnt , das DBMS kann immer noch lesen Sie die vollständige Tabelle stattdessen, wenn es davon ausgeht, dass die meisten Datensätze trotzdem übereinstimmen. Indizes sind nur ein Angebot an das DBMS, das es verwenden darf oder nicht.
lname <> 'Rogers'? – Jens
Wenn Sie 'oder' und' und' verwenden, müssen Sie Klammern um 'oder' wie 'hinzufügen (lname> 'Rogers' ODER lname <'Rogers') UND memberType = 'Student'' – Jens
Wie viele Daten hat Ihre Tabelle? ? Haben Sie die Tabelle nach der Dateneingabe analysiert? – jarlh