Ergebnis 1 bis 4 von 4

Thema: Funktion vereinfachen

  1. #1
    gnoerz ist offline Benutzer
    Registriert seit
    16.01.2006
    Beiträge
    94

    Standard 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

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    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 ...
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von gnoerz Beitrag anzeigen
    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.
    Schnellschuß: selektiere doch gleich beide Werte:

    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    gnoerz ist offline Benutzer
    Registriert seit
    16.01.2006
    Beiträge
    94

    Standard

    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum