AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Datenbanken Delphi Indizes einer Datenbank neu aufbereiten
Thema durchsuchen
Ansicht
Themen-Optionen

Indizes einer Datenbank neu aufbereiten

Ein Thema von ibp · begonnen am 19. Dez 2006 · letzter Beitrag vom 22. Dez 2006
Antwort Antwort
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#1

Indizes einer Datenbank neu aufbereiten

  Alt 19. Dez 2006, 12:38
Mit
SET STATISTICS INDEX dingensfeldIDX kann man den Index aufbereiten und die Statistik aktualisieren. Dadurch kann unter Umständen die Suche auf inizierten Feldern deutlich beschleunigt werden.
Sinnvoll ist die Aktualisierung mindestens ein mal pro Tag, je nach Datenaufkommen.

Nachfolgender Code bereitet alle Inizes einer Datenbank auf. (Getestet mit Interbase 6.5 ohne Fehlerbehandlung)

Delphi-Quellcode:
..
qIndex.SQL.Text:='select rdb$index_name from RDB$INDICES where NOT (RDB$RELATION_NAME LIKE ''RDB$%'')';
qIndex.Open;

while not qIndex.Eof do
begin
  qUpdateIndex.SQL.Text:='set statistics index '+qIndex.FieldByName('rdb$index_name').AsString;
  qUpdateIndex.ExecSQL;
  ..
  qIndex.Next;
end; // while
..
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Indizes einer Datenbank neu aufbereiten

  Alt 19. Dez 2006, 20:23
Eigentlich sollte ein manuelle Aktualisierung von Idinzes nicht notwendig sein.
Markus Kinzler
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#3

Re: Indizes einer Datenbank neu aufbereiten

  Alt 19. Dez 2006, 21:18
Zitat von mkinzler:
Eigentlich sollte ein manuelle Aktualisierung von Idinzes nicht notwendig sein.
Hier muß ich Dir widersprechen.
Interbase (zumindest bis 6.5, dannach habe ichs nicht mehr weiter verfolgt) und Firebird errechnen die Selektivität eines Indexes nur bei Anlage des Indexes und beim Restore der Datenbank.
Von daher ist das SET STATISTICS eine recht sinnvolle Sache. Es sollte durchgeführt werden, sobald ein repräsentativer Datenbestand vorhanden ist. Auch wenn die Geschwindigkeit zu wünschen übrig läßt, sollte man die Selektivität der Indexe mitels SET STATISTICS INDEX neu berechnen lassen.
Von einer häufigen Anwendung des SET STATISTICS INDEX würde ich abraten.

Gruß

Thomas
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#4

Re: Indizes einer Datenbank neu aufbereiten

  Alt 20. Dez 2006, 08:40
Zitat von mkinzler:
Eigentlich sollte ein manuelle Aktualisierung von Idinzes nicht notwendig sein.
..teste es doch mal und schau dir vorher und nacher die Statistik an.
Zitat von onlinekater:
Von einer häufigen Anwendung des SET STATISTICS INDEX würde ich abraten.
..was heisst häufig?

P.s.: geht übrigens auch bei den nachfolgeversionen von Interbase
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
646 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Indizes einer Datenbank neu aufbereiten

  Alt 21. Dez 2006, 23:24
geht übrigens bei fb >=15 direkt als prozedur

SQL-Code:
CREATE PROCEDURE REINDEX
AS
declare variable SQL VARCHAR(200);
BEGIN
  FOR
    select rdb$index_name from rdb$indices
    INTO :SQL
  DO
  BEGIN
    SQL='SET STATISTICS INDEX '||SQL||';';
    execute statement :sql;
  END
END
[edit=Matze]SQL-Tags gesetzt. Mfg, Matze[/edit]
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Indizes einer Datenbank neu aufbereiten

  Alt 22. Dez 2006, 07:14
Bei MSSQL (falls es interessiert) gibt es ein ähnliches Problem: Die Performance ist nur so gut wie die Aktualität der Index-Statistiken. Daher haben wir einen Dafault-Maintenance-Job, der 1x pro Woche (Sonntags, weil da sowieso nix los ist) so eine Routine am laufen: Die Datenbank wird gesäubert, die Indexe neu erstellt etc.

Die Theorie besagt, das sich die Statistiken selbst optimieren. Also ich kann das nicht bestätigen, aber vielleicht habe ich es auch nur nicht ausprobiert. Jedenfalls läuft das System ordendlich mit wöchtentlichen Indexupdates.

NB: Es kommen täglich ca. 20MB Daten hinzu. Die 'Statistik' eines Indexes verändert das natürlich nicht mehr, sodaß man den Job vermutlich nicht benötigt. Eine Index-Statistik enthält informationen über die Verteilung und Anzahl der unterschiedlichen Schlüssel relativ zur Gesamtanzahl. Wenn sich dieses Verhältnis nicht großartig ändert, kann man -meine ich- auf die Neuberechnung verzichten.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#7

Re: Indizes einer Datenbank neu aufbereiten

  Alt 22. Dez 2006, 12:08
Zitat von alzaimar:
Eine Index-Statistik enthält informationen über die Verteilung und Anzahl der unterschiedlichen Schlüssel relativ zur Gesamtanzahl. Wenn sich dieses Verhältnis nicht großartig ändert, kann man -meine ich- auf die Neuberechnung verzichten.
..wann ändert sich das verhältnis? kann man das bei jedem index einschätzen? das hängt doch von der art des feldes und der dazukommenden daten ab.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Indizes einer Datenbank neu aufbereiten

  Alt 22. Dez 2006, 12:19
ibp: Natürlich ist das immer unterschiedlich, deshalb werden ja die Statistiken geführt. Wenn Du z.B. einen Index über die Kunden-PLZ hast und hattest bis jetzt nur Kunden aus dem berliner Raum ('1xxxx'), und nun erweiterst Du dein Einzugsgebiet auf ganz Deutschland, wird sich der Inhalt der PLZ, und damit die Statistik relevant ändern.

Bleibt es hingegen bei 'business as usual', ist nach einer gewissen Einarbeitungszeit kein Statistik-Update erforderlich.

Und da das eben von Fall zu Fall unterschiedlich ist, bauen wir das präventiv in einem Sonntagslauf ein. Anfangs macht man das vielleicht täglich (solange man Testdaten hat, die DB tuned oder noch nicht so viele Daten drin sind).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Indizes einer Datenbank neu aufbereiten

  Alt 22. Dez 2006, 13:38
@alzaimar
Ich habe noch nicht lange genug mit MSSQL zu tun, um zu wissen wie die Nebeneffekte von forcierten Statistiken dort aussehen, aber...
Bei Oracle kann man so sehr schnell in die Falle rennen.
Wenn die Statistiken nicht einmal mehr grob den Daten entsprechen kann es dazu führen, dass mit im Generieren eines Abfrageplans der bisherige verworfen und ein neuer erstellt wird.
Sowas macht IMHO nur Sinn wenn sich die Verteilung der Daten tatsächlich über die Zeit radikal ändert und dann sollte man möglichst zügig eine neue Statistik haben.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Indizes einer Datenbank neu aufbereiten

  Alt 22. Dez 2006, 13:46
Mir ist nicht bekannt, das es zu radikalen Performance-Einbußen nach einer Neuberechnung der Statistiken führt. Allerdings setze ich mich da auf die faule Haut und sage mir:"Alles ist OK, solange der Kunde nicht meckert". Weiterhin loggen wir, wenn eine Op länger als erwartet (5x länger) benötigt, um eventuelle Probleme sofort zu erkennen. Bis auf die Aussetzer infolge eines kranken Netzes ist Nichts zu erkennen, also wird es wohl nicht so schlimm sein.

Der Maintenance Plan Wizzard im Enterprise Manager bietet die Option, die Statistiken neu zu erstellen. Vermutlich ist MSSQL hier etas freundlicher zum Anwender/Admin, als Oracle. Oracle ist dafür aber eben unerreicht schnell.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz