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.

0voto

Mark Pim Punkte 9694

Ich hätte vorher sagen sollen, dass die Zeichenfolgen, die ich angegeben habe, Dummy-Zeichenfolgen waren, die tatsächlichen Felder haben leider keine Zahlen am Ende, aber danke für den Hinweis.

Ich werde darüber nachdenken, eine numerische Spalte hinzuzufügen, um die Sortierung zu beschleunigen.

0voto

Mark Pim Punkte 9694

Es gibt eine fast gleichwertige Möglichkeit, das zu tun, was ChrisThomas123 in SQL Server (aber nicht ORACLE) vorgeschlagen hat, nämlich:

ORDER BY CHARINDEX(IMAGENAME, 'A,B,C,D,E,F,G')

aber es scheint nicht schneller zu gehen.

0voto

Wenn Sie die Möglichkeit haben, einen Index hinzuzufügen, dann werden (auf dem SQL-Server) die Daten vorsortiert, wenn Sie einen Cluster-Index für IMAGENAME definieren. Selbst wenn die Zeilen nicht in der richtigen Reihenfolge sortiert würden, wären sie zumindest nach IMAGENAME gruppiert, so dass die Sortierung schneller erfolgen sollte. Wenn Sie die Spalte numecic hinzufügen, legen Sie den geclusterten Index auf diese Spalte. Eine Alternative zum Hinzufügen einer Spalte wäre eine Nachschlagetabelle. Aber vielleicht haben Sie diese Optionen nicht zur Verfügung

0voto

Walter Mitty Punkte 17177

Erstellen Sie eine neue Tabelle, die die Beziehung

(BILDNAME, SEQUENZNUMMER).

Laden Sie sie mit ('IMG1', 1), ('IMG2', 2), ('IMG3', 3),... Verbinden Sie diese Tabelle mit Ihrer Abfrage und ordnen Sie nach SEQUENCENUMBER.

Es sollte viel schneller laufen.

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