folgendes problem:
ich würde gerne eine gewichtete abfrage erstellen ähnlich wie die volltextsuche, allerdings möchte ich die abfrage genauer haben und nicht stopworter filtern. die idee, die ich hatte war
SELECT id FROM tabelle WHERE feld LIKE ‚%suchwort1%‘
UNION ALL
SELECT id FROM tabelle WHERE feld LIKE ‚%suchwort2%‘
UNION ALL
…
das ergebnis war auch schon nicht schlecht. allerdings kann ich die daten nicht weiterverarbeiten. was mir fehlt, ist ein COUNT(id) und ORDER BY id
hat da jemand eine idee wie ich die SELECTs zusammenfassen kann?
folgendes problem:
ich würde gerne eine gewichtete abfrage erstellen ähnlich wie
die volltextsuche, allerdings möchte ich die abfrage genauer
haben und nicht stopworter filtern. die idee, die ich hatte
war
ehrlich gesagt bin ich mir nicht ganz sicher, ob ich deine Frage richtig verstanden habe (insbesondere kann ich mit „gewichtete“ Anfrage nichts anfangen), aber meinst du vielleicht sowas hier?
SELECT id, COUNT(id)
FROM tabelle
WHERE feld LIKE '%suchwort1%' OR
feld LIKE '%suchwort2%' OR
...
GROUP BY id
ORDER BY id;
Ich würde aus Performancegründen eher sowas machen:
select id,count(id)
from (
SELECT id
FROM tabelle
WHERE feld LIKE '%suchwort1%'
UNION ALL
SELECT id
FROM tabelle
WHERE feld LIKE '%suchwort2%'
...
)
GROUP BY id
ORDER BY id;
stimmt, es fehlen die DISTINCTS im übergeordneten select (bin am Abend eben ein bißchen schlampig …)
und vermutlich
braucht es auch noch länger
UNION ALL (mit oder ohne DISTINCT ) länger als ein OR? Naja, bei dieser Abfrage (wahrscheinlich große Ergebnismenge und das OR auf das selbe Feld) könnte es sogar sein …
verletzt also drei von drei
Regeln des tunens:
don’t tune
Ich sollte also das letzte Arbeitsjahr streichen, in dem ich eigentlich nur noch getuned habe?
stelle sicher, dass getunete und ursprüngliche Version des
Codes das selbe Ergebnis haben
Benutze deswegen niemals mehr als 3 SYSDATES oder 4 NVLS auf einer 10g-Datenbank (erstaunlich, wie sich die Ergebnissmenge eines FIRST_ROWS zu einem ALL_ROWS unterscheiden können - ein _kleiner_ Known-Bug, der wieder ein paar Tuning-Maßnahmen zunichte machte)
stelle sicher, dass die getunete Version das Tuningziel
erreicht.
Na, wenigstens das habe ich in letzter Zeit erreicht …
Tomh
PS: Alleine nur durch das rausschmeissen von ORs kann man tuning-mäßig schon eine Menge erreichen - und wenn’s durch ein UNION ALL sein muß
PS: Alleine nur durch das rausschmeissen von ORs kann man
tuning-mäßig schon eine Menge erreichen - und wenn’s durch ein
UNION ALL sein muß
Ich widerspreche dir ja nur ungern, aber das ist manchmal so, vielleicht auch oft oder immer oder aber auch gar nicht - kommt nämlich auf ca. 156 andere Faktoren an. Ich hatte da vor nicht allzu langer Zeit mal was geschrieben (auch wenn die Ausgangsfrage eine andere war): http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…
danke: gewichtete SQL-Anfrage
vielen dank erstmal für die vielen antworten
es sind viele fragen aufgetreten, von denen ich noch einige beantworten möchte.
zu nächst mal die version: mysql - 4.1.20 community nt
zu or bzw. gewichtete anfrage:
gewichtet meint hier, dass ich ‚zähle‘ wiviele der suchworte vorkommen. dafür reicht das or leider nicht aus, da ich hier immer nur einen datensat bekomme. (letzendlich will ich ja gleiche datensätze zählen)
select … from (select …):
das hat bei mir leider nicht funktioniert, war auch meine erste idee
Das alles glaub ich Dir auch, aber das entscheidende Wörtchen ist hier das „ALL“ nach dem „UNION“ - wenn ich dann auch noch eine geringe Ergebnismenge bekomme und so ein „SELECT DISTINCT“ drüberstülpen kann, bin ich um ein Hauseck schneller - aber es kommt eben auf das Ganze drumherum auch an, wieviele Tabellen mitverjoint werden, usw. - leider gibt es keine Patentlösung hier - wobei ich verschachtelte Selects immer mehr bevorzuge …
SELECT id,count(id)
FROM (
SELECT id
FROM kategorie_lookup
WHERE kategorie LIKE ‚%suchwort1%‘
UNION ALL
SELECT id
FROM kategorie_lookup
WHERE kategorie LIKE ‚%suchwort1%‘
) as a
GROUP BY a.id
ORDER BY a.id;
eigentlich hatte ich es auch schon so ähnlich probiert aber bei mir wollte es einfach nicht funktionieren