View oder Funktion

Hi Leute,

dieselbe Frage habe ich auch schon mal hier (PostgreSql - View oder Funktion - Relationale Datenbanksysteme @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe) gestellt, leider aber noch keine Antwort bekommen.

Da ich es aber ziemlich eilig habe und ich denke da diese Frage sehr DB spezifisch ist bin ich hier mit der Frage “richtiger”.

Um Datenbank-Felder zu aktualisieren, benutze ich Funktionen (auch um eine bessere Schnittstelle für “externe” Entwickler zu bieten).

Meine Funktionen sehen in der Regel so aus (stark vereinfachtes Beispiel):

CREATE FUNCTION setValueAddedTax(newValue numeric) RETURNS void AS '   Update t_settings SET t_value_added_tax = $1 ' LANGUAGE SQL;

Um mir z. B. die MwSt anzeigen zu lassen, benutze ich aber ein View:

 CREATE VIEW v_value_added_tax AS    SELECT settings_value_added_tax    FROM t_settings;

Ich könnte es aber auch mit/als Funktion implementieren:

 CREATE FUNCTION valueAddedTax() RETURNS numeric AS '   SELECT settings_value_added_tax   FROM t_settings ' LANGUAGE SQL;

Kann mir bitte jemand sagen, welchen Unterschied es zwischen der View und Funktion in Benug auf auslesen ohne Paramter gibt? (Ist eins schneller als das andere, besserer Stil etc.)

Ich würde es ja ausprobieren, habe aber im Moment nur eine leere Datenbank hier und komme im Moment auch nicht an eine volle dran und bei einer leeren (mit einigen 100 Datensätzen) ist es nicht wirklich aussagekräftig.

Gruß RG

Das ergibt relativ bis absolut keinen Sinn, was Du da zeigst. Der VIEW würde, ohne eine WHERE-Bedingung, die komplette Tabelle liefern, die Funktion allerdings einen (praktisch gesehen zufälligen) Datensatz der Tabelle. Du könntest das also nur bei eine Tabelle vergleichen, die nur eine Zeile enthält. In diesem Fall wird es immer ein seq. Scan sein, sowohl bei VIEW als auch bei der Funktion.

Ich würde es ja ausprobieren, habe aber im Moment nur eine leere Datenbank hier und komme im Moment auch nicht an eine volle dran und bei einer leeren (mit einigen 100 Datensätzen) ist es nicht wirklich aussagekräftig.

Gruß RG

Meine Güte, ist es denn echt so schwer, mal eine Tabelle mit 1 Million Zufallszahlen zu füllen?

test=*# create table settings (id serial primary key, value float);
NOTICE:  CREATE TABLE will create implicit sequence "settings_id_seq" for serial column "settings.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "settings_pkey" for table "settings"
CREATE TABLE
Zeit: 39,431 ms
test=*# insert into settings select s, random() from generate_Series(1,1000000) s;
INSERT 0 1000000
Zeit: 9352,746 ms
test=*#

Andreas



Wird der Zusammenhang jetzt klarer? Du erledigst quasi seine Arbeit, anstatt das der Eröffner dieses Threads die sowieso schon vorhandenen Funktionen und Views mal durch einen Benchmark schickt.

Stell ihm einfach eine Rechnung :wink: