Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Geschwindigkeit optimieren

  1. #1
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard Geschwindigkeit optimieren

    Hey,

    wie optimiere ich die Geschwindigkeit einer Abfrage?
    Ist es schneller wenn ich möglichst viele Sub selects in einem View habe oder mit einer Abfrage auf mehrere Views zugreife?
    bzw. kapier ich das mit den Prozeduren nicht so ganz, kann ich eine SQL Prozedur schreiben, die mir einfach immer die Daten "Komplettiert" und so zu sagen ein "datawarehouse" macht?

    Gruß BoOnOdY
    Geändert von BoOnOdY (03.01.2007 um 14:12 Uhr)

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

    Standard

    Für Performance Optimierungen ist der Befehl EXPLAIN sehr gut geeignet. er zeigt dir den kompletten Plan, wie die Datenbank deine Anfrage ausführt. Daran kann man dann erkennen, wo Schwachstellen sind und ggf. optimieren.

    Ein View ist nichts anderes als eine gespeicherte Abfrage. PostgreSQL setzt das dann intern sowieso in die gespeicherte Abfrage um. Kannst du ebenfalls mit EXPLAIN ausprobieren.

    Was meinst du mit "komplettiert" in diesem Zusammenhang? Eine Stored Procedure ist eine Funktion wie in jeder anderen Programmiersprache auch. Man kann ihr Daten übergeben, mit diesen Daten arbeiten und Ergebnisse zurückbekommen. Die Möglichkeiten sind jedoch sehr viel weiter gefasst als in reinem SQL.
    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 BoOnOdY Beitrag anzeigen
    Hey,

    wie optimiere ich die Geschwindigkeit einer Abfrage?
    Ist es schneller wenn ich möglichst viele Sub selects in einem View habe oder mit einer Abfrage auf mehrere Views zugreife?
    bzw. kapier ich das mit den Prozeduren nicht so ganz, kann ich eine SQL Prozedur schreiben, die mir einfach immer die Daten "Komplettiert" und so zu sagen ein "datawarehouse" macht?

    Gruß BoOnOdY
    Zuzüglich zu dem von ads:

    Wenn Du eine Abfrage an die DB richtest, ist einer der ersten Schritte der DB, dazu einen Abfrageplan zu erstellen. Dazu untersucht es Dinge wie den Aufbau der beteilgten Tabellen, die Art der Abfrage, welche Indexe vorhanden sind und evtl. genutzt werden können, Statistiken über die Daten in den Tabellen und einiges mehr. Von der Wahl des richtigen Abfrageplanes hängt maßgeblich die Geschwindigkeit ab, mit der die Abfrage ausgeführt wird.

    Damit Du als DBA nicht als blinde Kuh daneben stehst, gibt es den Befehl EXPLAIN bzw. EXPLAIN ANALYSE. Und als DBA wirst Du um diesen Befehl nicht drum herum kommen, sondern Dich damit anfreunden.

    Code:
    15:21 < akretschmer> ??explain
    15:21 < pg_docbot_adz> For information about 'explain' see:
    15:21 < pg_docbot_adz> http://www.gtsm.com/oscon2003/toc.html :: http://www.postgresql.org/docs/current/static/sql-explain.html ::
                           http://www.postgresql.org/docs/current/static/performance-tips.html#using-explain
    15:21 < pg_docbot_adz> http://techdocs.postgresql.org/oscon2005/robert.treat/OSCON_Explaining_Explain_Public.sxi
    schaue Dir diese Links an, da ist einiges zu erklärt.


    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
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    Ja also komplettieren heißt :
    ich bekomm einen Datensatz rein
    vergleiche ihn mit Datensätzen aus einer anderen Tabelle und möchte dann dieses Vergleichergebnis noch dazumachen. Wo finde ich denn noch ein bisschen was zu dem Prozeduren schreiben in PostgreSQL ?

    Also, dass immer wenn ich meine Datensätze mit meinen Phytonscript einlese, soll die Datenbank diesen Vergleich machen und das Ergebniss in eine neue Tabelle schreiben.

    Ist es da besser alle Datensätze noch mal neu zu schreiben oder einfach nur den Vortlaufenden Primary Key zu nehmen und dahinter diese Analyse zu schreiben?


    Wenn ich das im Moment mit so Abfragen mache, dauert das ewig ( hab an die 20 000 Datensätze analysieren wollen).

    Und ich meine mit so ner einfach vervollständigten Liste wird das doch um einiges schneller gehen, oder?
    Gruß BoOnOdY



    PS:
    Danke, dass ihr mir eure Erfahrung zu Teil werden lasst

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

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen
    Ja also komplettieren heißt :
    Wo finde ich denn noch ein bisschen was zu dem Prozeduren schreiben in PostgreSQL ?


    Ist es da besser alle Datensätze noch mal neu zu schreiben oder einfach nur den Vortlaufenden Primary Key zu nehmen und dahinter diese Analyse zu schreiben?


    Wenn ich das im Moment mit so Abfragen mache, dauert das ewig ( hab an die 20 000 Datensätze analysieren wollen).

    Und ich meine mit so ner einfach vervollständigten Liste wird das doch um einiges schneller gehen, oder?
    Gruß BoOnOdY

    PS:
    Danke, dass ihr mir eure Erfahrung zu Teil werden lasst

    Das Handbuch zu PG ist lesenswert, z.B. ab hier:
    http://www.postgresql.org/docs/8.2/i...e/plpgsql.html

    Was Du derzeit für Abfragen auf lächerliche 20K Rows machst und warum das 'ewig' dauert, kann Dir hier ohne ein EXPLAIN ANALYSE Deiner Abfrage keiner so recht genau sagen, auch nicht, ob man es schneller machen könnte.


    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

  6. #6
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    Also ich hab mich jetzt beschlossen mich ma mit Triggern und Prozeduren zu beschäftigen.

    Quelltext Frage:

    Hat jemand zufällig einen Trigger oder eine Prozedur parat, die Datensätze beim einfügen ergänzt? Vieleicht sogar mit einem Vergleich aus einer anderen Tabelle. Würd gerne ma ein bisschen Syntax sehen, dass ich mich daran orientieren kann. Sonst les ich mich erst ma rein bevor ich noch groß dumme Fragen stelle.

    Gruß BoOnOdY

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

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen
    Also ich hab mich jetzt beschlossen mich ma mit Triggern und Prozeduren zu beschäftigen.

    Quelltext Frage:

    Hat jemand zufällig einen Trigger oder eine Prozedur parat, die Datensätze beim einfügen ergänzt? Vieleicht sogar mit einem Vergleich aus einer anderen Tabelle. Würd gerne ma ein bisschen Syntax sehen, dass ich mich daran orientieren kann. Sonst les ich mich erst ma rein bevor ich noch groß dumme Fragen stelle.

    Gruß BoOnOdY
    Das findest Du auch in der normalen Doku. Aber ich glaube fast, das würde auch ohne aufwendige Trigger und Funktionen gehen, sondern mit purem SQL. Aber das ist mal nur eine wilde Vermutung. Auch vermute ich ja, daß Dir Foreign Keys ein Fremdwort sind, aber auch das ist eine pure Vermutung...

    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

  8. #8
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    So hier ist ma so ein Explain:

    Code:
    
    QUERY PLAN
    "HashAggregate (cost=598819.41..600115.32 rows=11 width=55)"
    " -> Hash Join (cost=186144.94..598819.27 rows=11 width=55)"
    " Hash Cond: (""outer"".dialcode = (subplan))"
    " -> Seq Scan on destination (cost=0.00..99.92 rows=3492 width=28)"
    " -> Hash (cost=186144.91..186144.91 rows=11 width=35)"
    " -> Hash Join (cost=102505.73..186144.91 rows=11 width=35)"
    " Hash Cond: ((subplan) = ""inner"".""location"")"
    " -> Seq Scan on call (cost=0.00..17.10 rows=710 width=19)"
    " -> Hash (cost=102505.72..102505.72 rows=3 width=80)"
    " -> Hash Join (cost=85306.90..102505.72 rows=3 width=80)"
    " Hash Cond: (""outer"".""?column1?"" = ""inner"".""location"")"
    " -> HashAggregate (cost=83639.08..100835.68 rows=146 width=15)"
    " -> Seq Scan on call (cost=0.00..83635.53 rows=710 width=15)"
    " SubPlan"
    " -> Limit (cost=117.77..117.77 rows=1 width=8)"
    " -> Sort (cost=117.77..117.81 rows=17 width=8)"
    " Sort Key: char_length(dialcode)"
    " -> Seq Scan on destination (cost=0.00..117.42 rows=17 width=8)"
    " Filter: ($1 ~~ (dialcode || '%'::text))"
    " -> Hash (cost=1667.81..1667.81 rows=3 width=40)"
    " -> HashAggregate (cost=1314.43..1667.78 rows=3 width=15)"
    " -> Seq Scan on call (cost=0.00..1314.37 rows=11 width=15)"
    " Filter: (dauer > 0)"
    " SubPlan"
    " -> Limit (cost=117.77..117.77 rows=1 width=8)"
    " -> Sort (cost=117.77..117.81 rows=17 width=8)"
    " Sort Key: char_length(dialcode)"
    " -> Seq Scan on destination (cost=0.00..117.42 rows=17 width=8)"
    " Filter: ($1 ~~ (dialcode || '%'::text))"
    " SubPlan"
    " -> Limit (cost=117.77..117.77 rows=1 width=8)"
    " -> Sort (cost=117.77..117.81 rows=17 width=8)"
    " Sort Key: char_length(dialcode)"
    " -> Seq Scan on destination (cost=0.00..117.42 rows=17 width=8)"
    " Filter: ($0 ~~ (dialcode || '%'::text))"
    " SubPlan"
    " -> Limit (cost=117.77..117.77 rows=1 width=8)"
    " -> Sort (cost=117.77..117.81 rows=17 width=8)"
    " Sort Key: char_length(dialcode)"
    " -> Seq Scan on destination (cost=0.00..117.42 rows=17 width=8)"
    " Filter: ($0 ~~ (dialcode || '%'::text))"
    " -> Limit (cost=117.77..117.77 rows=1 width=8)"
    " -> Sort (cost=117.77..117.81 rows=17 width=8)"
    " Sort Key: char_length(dialcode)"
    " -> Seq Scan on destination (cost=0.00..117.42 rows=17 width=8)"
    " Filter: ($0 ~~ (dialcode || '%'::text))"
    
    es sieht bestimmt nicht besonders aus, da ich Views in Views benutze, muss das in subselects packen ich weiß ....

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

    Standard

    Zitat Zitat von BoOnOdY Beitrag anzeigen
    So hier ist ma so ein Explain:

    es sieht bestimmt nicht besonders aus, da ich Views in Views benutze, muss das in subselects packen ich weiß ....

    Das Views in Views ist nicht wirklich ein Problem, problem ist eher:

    - ohne das zugrundeliegende SELECT ist es schwer, den Sinn zu verstehen
    - ich sehe jede Menge SEQ-Scans, vermutlich hast Du keine Indexe
    - ein EXPLAIN ANALYSE hätte auch noch angezeigt, ob der Planner aktuelle Statistiken hat
    - die Ausgabe möglichst so in der verschachtelten Struktur lassen, wie es vom Explain kommt

    Mal auf die Schnelle als Beispiel:

    Code:
    scholl=# explain analyse select uf, ab, pos from bde_meldungen where maschine = 1200 and datum = '2006-08-30';
                                                          QUERY PLAN
    ----------------------------------------------------------------------------------------------------------------------
     Bitmap Heap Scan on bde_meldungen  (cost=2.70..452.98 rows=117 width=23) (actual time=0.107..0.457 rows=119 loops=1)
       Recheck Cond: ((maschine = 1200) AND (datum = '2006-08-30'::date))
       ->  Bitmap Index Scan on idx_combi  (cost=0.00..2.70 rows=117 width=0) (actual time=0.086..0.086 rows=119 loops=1)
             Index Cond: ((maschine = 1200) AND (datum = '2006-08-30'::date))
     Total runtime: 0.740 ms
    (5 rows)
    Da kann man dann sehen, daß Indexe da sind und das der Planner recht gut schätzt (117 Rows geschätzt, 119 real)


    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

  10. #10
    BoOnOdY ist offline Benutzer
    Registriert seit
    15.07.2006
    Beiträge
    72

    Standard

    Also falls das hilft sind hier mal meine Views die ich benutze.

    der View call_destination ist der den ich bei dem explain aufgerufen habe


    Code:
    CREATE OR REPLACE VIEW asr AS 
     SELECT (call_zustande.anzahl::numeric(10,2) / call_alle.count::numeric(10,2) * 100::numeric)::numeric(10,2) AS "numeric", call_zustande."location"
       FROM call_zustande, call_alle
      WHERE call_zustande."location" = call_alle."location";
     
     
    CREATE OR REPLACE VIEW call_alle AS 
     SELECT call_view."location", count(*) AS count
       FROM call_view
      GROUP BY call_view."location";
     
    CREATE OR REPLACE VIEW call_desti AS 
     SELECT grouped_calls.dauer, ( SELECT destination.dialcode
               FROM destination
              WHERE grouped_calls.ausgangsnummer ~~ (destination.dialcode || '%'::text)
              ORDER BY char_length(destination.dialcode) DESC
             LIMIT 1) AS "location"
       FROM ( SELECT call.ausgangsnummer, call.dauer
               FROM call) grouped_calls;
     
     
    CREATE OR REPLACE VIEW call_destination AS 
     SELECT call_desti."location", destination.name, count(*) AS count, sum(call_desti.dauer) / 60000 AS dauer, max(asr."numeric") AS sum
       FROM destination, call_desti, asr
      WHERE destination.dialcode = call_desti."location" AND asr."location" = call_desti."location"
      GROUP BY call_desti."location", destination.name;
     
     
    CREATE OR REPLACE VIEW call_zustande AS 
     SELECT count(*) AS anzahl, call_view."location"
       FROM call_view
      WHERE call_view.dauer > 0
      GROUP BY call_view."location";

    ich hab keine Idexe, weil mein SQL buch meint, dass bei dem Typ Text, den ich für den Vergleich ja brauche kein Index funktionieren würde. Stimmt das?

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Frage Geschwindigkeit der Suche
    Von strippenzieher im Forum Allgemeines
    Antworten: 2
    Letzter Beitrag: 26.10.2011, 15:17
  2. Postgre Geschwindigkeit?
    Von MrBubbles im Forum Allgemeines
    Antworten: 40
    Letzter Beitrag: 01.10.2010, 15:11
  3. Abfrage optimieren aber wie?
    Von spinner0815 im Forum SQL
    Antworten: 10
    Letzter Beitrag: 18.03.2010, 10:54
  4. DELETE-Befehl optimieren
    Von squirrel im Forum SQL
    Antworten: 2
    Letzter Beitrag: 09.01.2009, 12:28
  5. Optimieren
    Von mzda im Forum SQL
    Antworten: 8
    Letzter Beitrag: 07.07.2006, 16:35

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