2017-04-26 6 views
1

ist ein Teil meiner Vergangenheit Prüfungsfragen -Indexed Abfrageoptimierung = SQL

Optimieren Sie die folgenden und übernehmen es einen Index auf Members.lname:

SELECT fname, lname 
FROM Members 
WHERE lname <> 'Rogers' 
    AND memberType='Student'; 

Ich habe daher versucht:

SELECT fname, lname 
FROM Members 
WHERE lname > 'Rogers' OR lname < 'Rogers'AND memberType='Student'; 

Ich habe versucht, wie die Teilung der <> zwingt den Einsatz des Index - meine Antwort ist jedoch falsch. Ich habe mich gefragt, ob jemand helfen könnte und wies mich in die richtige Richtung?

+0

lname <> 'Rogers'? – Jens

+2

Wenn Sie 'oder' und' und' verwenden, müssen Sie Klammern um 'oder' wie 'hinzufügen (lname> 'Rogers' ODER lname <'Rogers') UND memberType = 'Student'' – Jens

+0

Wie viele Daten hat Ihre Tabelle? ? Haben Sie die Tabelle nach der Dateneingabe analysiert? – jarlh

Antwort

2

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.