Hi,
vorweg: Mit diesem System habe ich keine Erfahrung.
Dann hast du mir immer noch etwas voraus.
keine Erfahrung mit MSSQL zu haben ist also besser, als damit Erfahrung zu haben? Das lasse ich einfach mal unkommentiert stehen ;-)
SELECT *
Gib die Liste der gewünschten Spalten explizit an. Das dürfte die Performance zwar nicht spürbar beeinflussen, ist aber trotzdem wichtig.
Inwiefern wichtig? Ich brauche jede einzelne Spalte.
Du brauchst vermutlich jede *derzeit* existierende Spalte. Wenn sich das DB-Layout ändert, indem beispielsweise Spalten hinzukommen, brauchst Du diese nicht - zumindest nicht per se. Und wenn eine Spalte wegfällt, auf die Du Dich hier verlässt, dann ist es absolut sinnvoll, wenn Dein Code an genau dieser Stelle versagt.
Gib *immer* die Liste der benötigten Spalten an. Ausnahmen gibt es höchstens bei solchen Dingen wie phpMyAdmin, die mit beliebigen Strukturen agieren können sollen.
Nein, es existieren keine Indizes auf adr_id und gr_id. Würde das einen merklichen Geschwindigkeitsvorteil bringen?
Das ist anzunehmen.
Ist die Reihenfolge bei der Erstellung von Indizes wichtig?
Die Reihenfolge der Spalten innerhalb eines Indexes, ja. Ein Index sollte möglichst schnell möglichst stark einschränken. Wenn der Index über z.B. drei Spalten geht und dabei das Abfragekriterium bei den ersten beiden Spalten je zu 90% aller Werte zutrifft, so muss immer noch 81% der dritten Spalte durchsucht werden; treffen je nur 10% zu, ist von der dritten Spalte nur noch 1% relevant. Im erstgenannten Fall ist ein Full-Table-Scan möglicherweise sogar effizienter.
Lässt sich die OR-Verknüpfungskette durch ein IN ersetzen?
Ja. =)
Gut. Vergleiche die beiden Ausführungspläne miteinander ;-) (Keine Ahnung, ob und wie man die bei MSSQL bekommt. MySQL hat "EXPLAIN", in Oracle hat man glaube ich z.B. in der Konsole eine Umgebungsvariable gesetzt.)
Sind die Indexe ggf. optimiert?
Öhm...
Wenn auf einer Tabelle oft Änderungen durchgeführt werden, kann es sein, dass der Index reichlich ineffizient im Speicher verteilt ist, weil der bei jedem UPDATE, INSERT und DELETE ebenfalls geändert wird. Die meisten DBMSse ermöglichen es, ihn neu berechnen zu lassen. Schlimmstenfalls geht natürlich auch ein DROP INDEX mit anschließender Neuerstellung ...
Lässt sich in Deinem DBMS ein Ausführungsplan des Statements ermitteln?
Ist das mit einer Stored Procedure schon getan?
Stored Procedures haben damit eigentlich gar nichts zu tun. Ein Ausführungsplan sagt, welche "Taktik" das DBMS anwendet, um die Daten zu selektieren. Also welcher Index benutzt wird, auf welche Weise, wann vom Index auf die eigentlichen Tabellendaten zugegriffen wird[1], wann wie (und wo[2]) sortiert wird usw.
Kann ich einer solchen eigentlich mehrere Variablen (nämlich die Gruppen-ID-Nummern) übergeben?
Keine Ahnung, Stored Procedures habe ich nur selten gebraucht und dann immer von unserem DB-Gott erstellen lassen.
Ist folgendes Statement "besser"?
Was sagt der Ausführungsplan? ;-)
Cheatah
[1] Bei Oracle war es beispielsweise auch so, dass dieser Schritt wegfiel, wenn der Index bereits alle benötigten Daten enthielt. So mancher Index bekam von uns daher noch eine Extraspalte hinzugefügt, die zur Aussiebung völlig unnötig war, aber das "Wandern" zur Tabellenzeile und -zelle ersparte.
[2] Manche Sortierungen passen nicht mehr in den Arbeitsspeicher und werden daher auf die Festplatte ausgelagert ...
--
X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes