3 Stimmen

Gibt es einen effizienteren Weg, diesen SQL Select auszuführen?

Ich habe diese SQL-Abfrage:

SELECT * FROM IMAGES WHERE
IMAGENAME in ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
ORDER BY CASE IMAGENAME
  WHEN 'IMG1' THEN 1
  WHEN 'IMG2' THEN 2
  WHEN 'IMG3' THEN 3
  WHEN 'IMG4' THEN 4
  WHEN 'IMG5' THEN 5
  WHEN 'IMG6' THEN 6
  ELSE 7
END

Ich kann nicht garantieren, dass die Liste der IMAGENAMEs in alphabetischer Reihenfolge sein wird, daher die Case-Anweisung, aber ich würde es vorziehen, in der DB statt in Code zu sortieren, weil ich ihr Sortiercode besser als meine vertrauen :)

SQL Server analysiert, dass 78 % der Ausführungszeit für das Sortieren aufgewendet werden - kann ich diesen Anteil verringern?

Es muss sich um relativ einfaches SQL handeln, da wir auf SQL Server und Oracle abzielen.

Jeder Tuning-Tipp wäre fantastisch.

6voto

ChrisThomas123 Punkte 2528

Ich bin nicht sicher, ob dies in Ihren Zieldatenbanken verfügbar ist, aber es könnte zumindest als Inspiration für einen besseren Ansatz dienen. In MySQL würden Sie das, was Sie wollen, mit der Funktion FIELD() wie folgt erreichen:

SELECT * FROM IMAGES WHERE
  IMAGENAME IN ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
  ORDER BY FIELD(IMAGENAME, 'IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6');

Die Funktion FIELD() nimmt den ersten Parameter und gibt dann eine ganze Zahl zurück, die auf der Position in der Parameterliste basiert, oder Null, wenn sie in der Parameterliste nicht vorhanden ist. Auf diese Weise können Sie eine völlig individuelle Reihenfolge für Ihre Abfrage erstellen.

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

Ich gehe davon aus, dass etwas Ähnliches auch in SQL Server oder Oracle verfügbar ist.

2voto

gx. Punkte 393
SELECT *
FROM IMAGES
WHERE IMAGENAME in ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
ORDER BY IMAGENAME ASC

Sie brauchen den Bildnamen nicht zu entfernen; Sie wählen nur die wenigen oben genannten Fälle aus, und order by kann die Zeichenfolge gut genug ordnen. Außerdem macht die "else"-Bedingung keinen Sinn, weil sie nie verwendet werden würde, da Sie alle anderen Optionen in der where-Klausel entfernt haben.

Hinweis: Dies bezieht sich auf die von Ihnen gestellte Anfrage. Wenn es weitere Bedingungen oder Möglichkeiten gibt, sollten Sie diese ebenfalls angeben.

0voto

Andrew Punkte 12733

Könnten Sie die IMG (oder nichtnumerischen) Teil der IMAGENAME beim Schreiben in die Datenbank in eine neue Spalte umwandeln und dann nach der neuen, nur numerischen Spalte sortieren?

Zum Beispiel:

SELECT * FROM IMAGES WHERE
IMAGENAME in ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
ORDER BY IMAGENO
END

wobei IMAGENO würde enthalten 1, 2, 3, 4, 5, 6 für jede Zeile in Ihrem Beispiel.

0voto

Tom Haigh Punkte 56080

Sie könnten versuchen, zu sortieren nach

CAST(SUBSTRING(IMAGENAME, 4, LEN(IMAGENAME) -3) as INTEGER)

Dies wird wahrscheinlich nicht in Oracle ohne einige Anpassungen funktionieren, und es wird auch nicht schneller sein als das, was Sie haben

Ich denke, es wäre besser, eine Art Rangspalte zur Tabelle hinzuzufügen und diese beim Schreiben zu setzen

0voto

Tony Andrews Punkte 125904

Wenn alle Ihre Bilder den Namen "IMG" tragen, sollten Sie den Namen ab Zeichen 4 ableiten und dann in eine Zahl umwandeln können. Ich kenne die SQL Server-Funktionen dafür nicht, aber in Oracle wäre es so:

SELECT * FROM IMAGES WHERE
IMAGENAME in ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
ORDER BY TO_NUMBER(SUBSTR(IMAGENAME,4));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X