Installation einer weiteren Datenbank(anwendung)

Konfiguration des PostgreSQL Datenbankservers.

Installation einer weiteren Datenbank(anwendung)

Beitragvon pgSteffen » Mi 18. Jul 2012, 16:59

Hallo Wissende,
ich habe hier einen Postges-Server, welcher von einem fremden Programm genutzt wird.
Was dieses Programm dort alles tut kann ich nicht 100% überblicken.

Ich brauch jetzt ein Postgres Backend für eine eigene Anwendung und möchte nach Möglichkeit diesen Server nutzen.

Mein Backend wird ca. 100.000.000 Datensätze umfassen.

Was ist nach eurer Ansicht zu empfehlen, dass sich die beiden Anwendungen nicht in die Quere kommen.

Ich würde auf jeden Fall eine neue DB erstellen. Sollte ich darüben hinaus die beiden Anwendungen entkoppeln z.B. eigener Tabelspace und eigener ....?

Gruß Steffen
pgSteffen
Neuer Benutzer
 
Beiträge: 26
Registriert: Di 14. Dez 2010, 10:46

Beitragvon akretschmer » Mi 18. Jul 2012, 17:13

pgSteffen hat geschrieben:Hallo Wissende,
ich habe hier einen Postges-Server, welcher von einem fremden Programm genutzt wird.
Was dieses Programm dort alles tut kann ich nicht 100% überblicken.

Ich brauch jetzt ein Postgres Backend für eine eigene Anwendung und möchte nach Möglichkeit diesen Server nutzen.

Mein Backend wird ca. 100.000.000 Datensätze umfassen.

Was ist nach eurer Ansicht zu empfehlen, dass sich die beiden Anwendungen nicht in die Quere kommen.

Ich würde auf jeden Fall eine neue DB erstellen. Sollte ich darüben hinaus die beiden Anwendungen entkoppeln z.B. eigener Tabelspace und eigener ....?

Gruß Steffen


Tablespaces machen Sinn, wenn diese letztendlich auf unterschiedlichen Platten sind.

Viel mehr kann man wohl auf die Frage nicht sagen ...


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
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5954
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon ads » Mi 18. Jul 2012, 23:55

Eigene Tablespaces, eigene Datenbanken ... alles darüber hinaus ist Glaskugelbetrachten.
Allein mit der Angabe von 100M Datensätzen kann man nicht viel aussagen. Da deine Datenbank aber anscheinend etwas größer wird - such dir jemanden, der sich mit PostgreSQL auskennt. Ansonsten wirst du in einige Anfängerfehler laufen.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

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

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon pgSteffen » Do 19. Jul 2012, 10:09

Hallo,
such dir jemanden, der sich mit PostgreSQL auskennt
Was denkst du warum ich hier im Forum frage ;) .

Die DB selbst wird groß, der Aufbau aber primitiv. Eine Datentabelle mit 100 Mil. DS und zwei Stammtabellen mit ein paar dutzend Datensätzen.
Nach einem (zunächst) einmaligen Import werden dann die Daten auschnittsweise wieder exportiert. Das war's schon.
Habe halt nur etwas "Angst" vor der Datenmenge, deshalb die Rückfrage. Ich hatte mir das irgendwie auch einfacher vorgestellt. Aber diese Datenmenge ist auch für einen Datenbankserver (zumindest OutOfTheBox) ein ernstes Problem.

Ich bin bisher nur Desktopdatenbanken (MSAccess) gewöhnt, welche sich gegenseitig nicht beeinflussen.
Hier habe ich 2 Datenbanken auf einem Server und frage mich halt, ob die sich in die Quere kommen können. Im Normalfall würde ich sagen nein, aber bei dieser Datenmenge bin ich mir halt unsicher.

Btw:
Es passt eigentlich nicht hier rein, aber ich habe noch ein letztes Problem:
Ich möchte eine Anfügeabfrage durchfüren. Die Zieltabelle hat einen eindeutigen Index über 2 Felder. Die Anfügeabfrage soll aber trotz Indexverletzung die sauberen Datensätze importieren.
(ein vorheriger Abgleich auf Dupletten ist aus Zeitgründen nicht möglich)


Gruß Steffen
pgSteffen
Neuer Benutzer
 
Beiträge: 26
Registriert: Di 14. Dez 2010, 10:46

Beitragvon castorp » Do 19. Jul 2012, 10:33

pgSteffen hat geschrieben:Die DB selbst wird groß, der Aufbau aber primitiv. Eine Datentabelle mit 100 Mil. DS und zwei Stammtabellen mit ein paar dutzend Datensätzen.
100 Millionen oder 100 Milliarden?

Aber diese Datenmenge ist auch für einen Datenbankserver (zumindest OutOfTheBox) ein ernstes Problem.
100 Mio auf sind auf keinen fall "ein ernstes" Problem.

Hier habe ich 2 Datenbanken auf einem Server und frage mich halt, ob die sich in die Quere kommen können. Im Normalfall würde ich sagen nein, aber bei dieser Datenmenge bin ich mir halt unsicher.
Die Menge spielt dabei überhaupt keine Rolle. Ob da 100MB, 100GB oder 100TB auf der Platte rumliegen ist egal. Aber nachdem sich die beiden Datenbanken gemeinsame Resource teilen, kann es natürlich zu Beinflussung komme.

Der I/O Durchsatz des Systems ist begrenzt. Wenn beide Datenbanken nun so unter Last stehen, dass sie einzeln die I/O Leistung des Systems zu 100% auslasten, dann wird jede einzelne langsamer werden (weil nur noch die Hälfte zur verfügung steht). Lasten die Anwendungen das System aber nicht aus (z.B. jede nur 30% der max. I/O Leistung) dann wird man kaum eine Beinflussung spüren.

Ich möchte eine Anfügeabfrage durchfüren. Die Zieltabelle hat einen eindeutigen Index über 2 Felder. Die Anfügeabfrage soll aber trotz Indexverletzung die sauberen Datensätze importieren. (ein vorheriger Abgleich auf Dupletten ist aus Zeitgründen nicht möglich)
Das ist ein bisschen dünn, von der Beschreibung. Normalerweise löst man dass folgendermassen:

Code: Alles auswählen
insert foobar (col1, col2, col3)
select 42, 'foo', 'bar'
where not exists (select 1 from foobar where col1 = 42 and col2 = 'foo');
(col1, col2) ist dabei der eindeutige Index.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
castorp
Erfahrener Benutzer
 
Beiträge: 676
Registriert: Sa 27. Jun 2009, 22:24

Beitragvon pgSteffen » Do 19. Jul 2012, 11:07

Hallo castrop,
Dank für die Antwort
Das ist ein bisschen dünn, von der Beschreibung. Normalerweise löst man dass folgendermassen
Ja leider hat sich "normal" als nicht praktibal erwiesen.
Code: Alles auswählen
CREATE  TEMP TABLE tmp_imp (rw numeric(11,3), hw numeric(11,3) , hoe numeric(8,3));
COPY tmp_imp FROM 'c:/.../datei.csv' WITH DELIMITER ' ';
INSERT INTO zieltabelle ( rw, hw, hoe ,impIndex)
   SELECT DISTINCT tmp_imp.rw, tmp_imp.hw, tmp_imp.hoe, 1
   FROM tmp_imp 
   LEFT JOIN zieltabelle ON (tmp_imp.Hw = zieltabelle.hw) AND (tmp_imp.Rw = zieltabelle.rw)
   WHERE zieltabelle.rw  Is Null;

Wenn ich 1 Mio. Datensätze (aus einer Textdatei) an 1 Mio. Datensätze in der Tabelle anfügen will ist das kein Thema (30s).
Aber 1 Mio. Datensätze an 20 Mio. Datensätze da bin ich schon bei 170s und ich denke das wird nix bei 100 Millionen.

Ich bin echt am verzweifeln:
Ich will doch einfach nur, dass er alle Datensätze die den UNIQUE-Key verletzen weglässt und die restlichen importiert. Gibt es dafür keinen Befehl? Ich finde einfach nix!!
pgSteffen
Neuer Benutzer
 
Beiträge: 26
Registriert: Di 14. Dez 2010, 10:46

Beitragvon akretschmer » Do 19. Jul 2012, 11:25

pgSteffen hat geschrieben:Hallo castrop,
Dank für die AntwortJa leider hat sich "normal" als nicht praktibal erwiesen.
Code: Alles auswählen
CREATE  TEMP TABLE tmp_imp (rw numeric(11,3), hw numeric(11,3) , hoe numeric(8,3));
COPY tmp_imp FROM 'c:/.../datei.csv' WITH DELIMITER ' ';
INSERT INTO zieltabelle ( rw, hw, hoe ,impIndex)
   SELECT DISTINCT tmp_imp.rw, tmp_imp.hw, tmp_imp.hoe, 1
   FROM tmp_imp 
   LEFT JOIN zieltabelle ON (tmp_imp.Hw = zieltabelle.hw) AND (tmp_imp.Rw = zieltabelle.rw)
   WHERE zieltabelle.rw  Is Null;

Wenn ich 1 Mio. Datensätze (aus einer Textdatei) an 1 Mio. Datensätze in der Tabelle anfügen will ist das kein Thema (30s).
Aber 1 Mio. Datensätze an 20 Mio. Datensätze da bin ich schon bei 170s und ich denke das wird nix bei 100 Millionen.

Ich bin echt am verzweifeln:
Ich will doch einfach nur, dass er alle Datensätze die den UNIQUE-Key verletzen weglässt und die restlichen importiert. Gibt es dafür keinen Befehl? Ich finde einfach nix!!


Dazu müßte man sich die Pläne mal anschauen, und Indexe. Hast Du den DB-Server gescheit konfiguriert? Shared_memory etc.?

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
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5954
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon castorp » Do 19. Jul 2012, 11:30

pgSteffen hat geschrieben:Wenn ich 1 Mio. Datensätze (aus einer Textdatei) an 1 Mio. Datensätze in der Tabelle anfügen will ist das kein Thema (30s).
Aber 1 Mio. Datensätze an 20 Mio. Datensätze da bin ich schon bei 170s und ich denke das wird nix bei 100 Millionen.
Wieso nix?
Wenn 1 Mio in 20 Mio das 5 fache von 1 Mio in 1 Mio ist, dann wäre doch anzunehmen, dass 1 Mio in 100 Mio die 10-fache Zeit dauert. Das wären dann 300s. Find ich noch akzeptabel. Selbst wenn es nicht-linear steigt reden wir vermutlich immer noch von Minute und nicht von Stunden. Wie oft musst Du das denn machen?

Grundsätzlich kann man natürlich noch an ein paar Tuning Schrauben drehen um das bulk-loading schneller zu machen. checkpoint_segments und maintenance_work_mem fallen mir da spontan ein. Wenn die Zieltabelle grundsätzlich über die Imports neu aufgebaut werden kann und ihr damit leben könnt die Daten bei einem Crash zu verlieren (und eben aus den text Dateien wieder zu rekonstruieren) kann man darüber nachdenken die Tabelle als UNLOGGED zu erzeugen.

Ich will doch einfach nur, dass er alle Datensätze die den UNIQUE-Key verletzen weglässt und die restlichen importiert. Gibt es dafür keinen Befehl? Ich finde einfach nix!!
Nein, leider nichts in Postgres eingebautes, leider (sowas wie Oracles LOG ERRORS INTO, oder MySQLs ON DUPLICATE IGNORE wäre schön).
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
castorp
Erfahrener Benutzer
 
Beiträge: 676
Registriert: Sa 27. Jun 2009, 22:24

Beitragvon pgSteffen » Do 19. Jul 2012, 11:34

Hallo,
der Server ist "OutOffTheBox" und da er mir nich allein gehört, möchte ich da nicht all zu viel drehen.

Ich habe für die "angepasste" Anfügeabfrage eigentlich das Handtuch geworfen. Indizies selber haben durch das massige Anfügen eher gegensätzlich Effekte (ohne gehts schneller).

Ich denke wirklich, dass Anfügen trotz (Teil)Fehler die beste Variante für meinen Fall ist. Bekomme es aber mit PostgreSQL einfach nich gebacken.

Wie kann ich sagen: Füge an was geht und ignoriere den Rest?
pgSteffen
Neuer Benutzer
 
Beiträge: 26
Registriert: Di 14. Dez 2010, 10:46

Beitragvon castorp » Do 19. Jul 2012, 11:47

pgSteffen hat geschrieben:Wie kann ich sagen: Füge an was geht und ignoriere den Rest?
Wie schon gesagt: geht nicht mit den Bordmitteln von Postgres
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
castorp
Erfahrener Benutzer
 
Beiträge: 676
Registriert: Sa 27. Jun 2009, 22:24

Nächste

Zurück zu Konfiguration

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste