Funktion vereinfachen

Ich habe folgende Rule erstellt:

CREATE OR REPLACE RULE update_ip_to_name AS
ON INSERT TO ip_to_name DO
INSERT INTO helper_ip_hostname (ip, hostname, host_id, domain_id)
VALUES
(
( SELECT uni_ips.ip FROM uni_ips WHERE uni_ips.id = new.uni_ip_id),
(( SELECT reverse(“names”.hostname) AS reverse FROM “names” WHERE “names”.id = new.name_id)),
new.name_id,
( SELECT “names”.domain_id FROM “names” WHERE “names”.id = new.name_id)
);

irgendwie scheint mir der zweimalige select aus der Tabelle names in dieser Funktion etwas krank.
Die Funktion wird durchgehend rund 3-10 mal pro Sekunde aufgerufen, die Tabelle names hat rund 100 Millionen zeilen, auch eine kleine Ersparnis wäre hier eine feine Sache.

Oder optimiert der Postmaster das selber soweit, dass nur einmal auf die Tabelle names selected wird und ich muss mich hier um Performance nicht mehr kümmern?

thomas

Die Antworten auf deine Fragen liefert dir ein EXPLAIN.

P.S.: Da oben gibt es so ein CODE Feld, das ist optimal geeignet, SQL Ausgaben aufzunehmen …

Schnellschuß: selektiere doch gleich beide Werte:

select reverse("names".hostname) AS reverse , "names".domain_id FROM "names"  ...

und passe dazu die Reihenfolge der Insert-Liste an.


Davon abgesehen: Ist das wirklich nötig? Offensichtlich baust Du damit eine zweite Tabelle mit redundanten Daten auf.


Andreas

danke erstmal - die sache mit der reihenfolge ist einleuchtend - ich hab wieder mal alles zu kompliziert gesehen.

notwendig ist das, weil ich datenbank mit dem gedanken an eine referentielle integrität zumindest im design aufgebaut habe. schlussendlich hat sich aber herausgestellt, dass mancher query mit drei joins über tabellen mit zigmillionen einträgen einfach zu lange dauert - das ist auch aber nicht nur ein problem meines etwas trägen storage-systems.
die hostnamen brauche ich der suche wegen einemal “original” und einmal reverse(original).

über die helper-table funktioniert das dann eigentlich ganz prima - ich mein, es könnte schneller gehen, aber für den hausgebrauch reichts.

der nachteil ist, dass die laufenden updates der haupttabelle langsamer werden, weil auch die helpertable und ihre indizes aktualisiert werden müssen (die db schafft hier unter “grundlast” derzeit rund 20 zeilen pro sekunde), das ist mir schon klar.

irgendwann war eigentlich auch geplant, die helpertable auf eine eigene hd auszlagern - mir ist aber bisher kein vernünftiger controller zugeflogen.

vielleicht hat jemand vorschläge für einen sata-controller, der 4 channels parallel vernünftig abwickeln kann?? ebay?

thomas