![]() |
Datenbank: Firebird • Version: 2.0 • Zugriff über: Delphi 2006
Optimierung einer Tabelle
Hallo,
habe folgendes Problem : Ich habe im laufe der Zeit innerhalb einer Datenbank Feldeigenschaften geändert ...z.b. Varchar(20) auf Varchar(25) usw., um das im laufenden Betrieb zu machen habe ich einfach ein neues Feld mit den neuen Eingeschaften angelegt anschließend alles aus dem Feld, was da geändert werden soll reinkopiert und dann das alte Feld gelöscht und anschießend neu angelegt und wieder reinkopiert werden . Am Ende am habe ich das Feld das ich zum Kopieren genutzt habe wieder gelöscht !. Meine Frage ist : Gibt es eine Möglichkeit die Tabelle praktisch wie in Mysql mit Optimize den Überhang zu beseitigen und somit auch keine Lücken zurückzulassen ? Ich habe schon alles versucht aber es gibt keinen Befehl der den Optimze- Befehl von Mysql ersetzt ! Kann mir einer helfen ! |
Re: Optimierung einer Tabelle
Sollte nicht botig sein. Sonst solltest du es mit einem Sweep oder Backup/Restore versuchen.
|
Re: Optimierung einer Tabelle
Mache einen Backup/Restore Zyklus und alle Leichen werden beseitigt. 8)
|
Re: Optimierung einer Tabelle
Backup Restore macht das ganze nicht die lücken bleiben habe ich alles im IBExpert nachgeprüft !
Was macht Sweep ? |
Re: Optimierung einer Tabelle
Sweep bereinigt die datenbank von alten Zuständen, die durch das Multigeneratorenprinzip entstehen.
Aber Backup/Restore müsste dein Problem definitiv Lösen (wenn das überhaupt ein Problem ist). Der Server gibt nie Festplattenplatz frei, d.h. auch wenn du alles löschst, wird die Datenbank nicht kleiner, sie wächst nur eine Weile nicht meht. Ein Backup/Restore führt deshalb meistens zu einer kleineren Datei. Zitat:
|
Re: Optimierung einer Tabelle
Problem ist eigentlich nur das ich ein Insert Statement nicht absetzen kann und ich die Vermutung haben das es daran liegt !
Dieses Statement :
SQL-Code:
Danach kommt folgende Meldung :
Insert Into TableA Select * from TableB where zaehler = 984
Overflow occurred during data type conversion. conversion error from string "Diverse Adresse". Die beiden Tabellen sind von der struktur her absolut identisch ! |
Re: Optimierung einer Tabelle
Die interne Reihenfolge der Felder aber nicht
|
Re: Optimierung einer Tabelle
Liste der Anhänge anzeigen (Anzahl: 1)
Ich weiss das beide Tabellen identisch ist und habe im vergleich in IBExpert
[edit=Matze]Bild angehängt. MfG, Matze[/edit] |
Re: Optimierung einer Tabelle
gibt beim insert und beim select die feldnamen mit an.
|
Re: Optimierung einer Tabelle
:wall: Bei 168 Feldnamen ????????????????
Sicher abbbbbbbbbbbbbbbbbbbäääääääääääääääääääääääääääärr rrrrrrrrrrrrrrrrrrrrrrrrrr. :warn: |
Re: Optimierung einer Tabelle
Zitat:
Das kann bestimmt in eine der Normalformen übergeleitet werden. Falls Dir das jetzt nichts sagt, solltest Du Dich mal ein Wenig über DB-Design informieren. |
Re: Optimierung einer Tabelle
Hallo pronny31,
Zitat:
- in der linken Tabelle ist kein BEZ1 zu sehen. - in der linken Tabelle BEZ2, BEZ3 VARCHAR(60) und in der rechten VARCHAR(160). Das ist nicht wirklich identisch. Fehler Zitat:
Ich gehe mal davon aus das "Diverse Adresse" kein Feldname ist sondern der Inhalt eines Feldes. Du solltes mal untersuchen welches Feld das ist und die Typen dieses Feldes in beiden Tabellen vergleichen. alex |
Re: Optimierung einer Tabelle
Zitat:
und schon kannst du auswählen,was für ein sql du dazu haben möchtest :-) |
Re: Optimierung einer Tabelle
Nein die Tabelle ist genau durchdacht !
Ich will jetzt nur durch Benutzersteuerung die Datensätze von a nach b kopieren (archivieren) Die Struktur ist identisch 100 % |
Re: Optimierung einer Tabelle
Du könntest Dir von der DB die Feldnamen geben lassen und dann durchiterieren.
|
Re: Optimierung einer Tabelle
Ich denke das es Lücken gibt und in Mysql nutze ich den Befehl Optimize was es hier icht gibt und Backup Restore oder Sweep macht nix !
Das Problem ist das ich im IBExpert jetzt noch nachollziehen kann das es Felder gibt welche nachträglich hinzugefügt wurden oder angepasst worden sind ! Ich denke das an den stellen wo was gelöscht worden ist der "Raum" nie mehr nutzbar ist und somit Löcher entstehen was sich mit der Übersicht in IBEXPERT deckt ! Ich bräuchte einen Befehl welcher die Tabellen bei bestehenden Datenmenge so organisiert das es kein "Lücken" mehr gibt. |
Re: Optimierung einer Tabelle
Zitat:
|
Re: Optimierung einer Tabelle
Hallo,
ein
SQL-Code:
liefert bestimmt nicht die gleiche Feld-Reihenfolge zurück wie
select * from TableA
SQL-Code:
Abhilfe1:
select * from TableB
siehe oben Abhilfe2: ibexpert Tabelle bearbeiten , Popup "reorder fields" Das Ändern der Länge eines Felds kann auch einfach in IBExpert gemacht werden, ohne ein neues Feld ("edit domain"). Ein Optimize macht nicht so viel Sinn, woher soll denn Firebird wissen, das Name in TableA das gleiche wie Name in TableB ist ? Heiko |
Re: Optimierung einer Tabelle
Zitat:
|
Re: Optimierung einer Tabelle
Falsche Aussage 1: Die Tabelle ist durchdacht
Das mag ja schon sein, dass Du Dir etwas überlegt hast. Du hast aber nicht genug überlegt und die Idee des DB-Designs missachtet. Falsche Aussage 2: Backup/Restore macht nix Das macht sehr wohl etwas. a) wie es der Name schon sagt, legt es ein Backup an und stellt dieses wieder her. b) es "löscht" nicht mehr benutzten Platz in der DB (z.B. von Delete) |
Re: Optimierung einer Tabelle
Ja es geht mir jetzt aber auch um den Aufbau dieser Tabelle und warum er dieses Lücken hat und die Tabelle hat sie 100 %!
Weil wenn ich explizit die Spaltennamen angebe geht es mache ich aber * kommt diese Fehlermeldung ! Ich habe den eindruck das Firebird bei der angabe * einfach annimmt das alles in der selben reihenfolge ist und dadurch der Fehler zustande kommt ! |
Re: Optimierung einer Tabelle
Zitat:
Das, was Du im IBExpert siehst, ist der logische Aufbau der Tabelle. Die Lücken stellt der IBExpert eben so dar. Wie willst Du sehen, wie die Tabelle intern von der DB verwaltet wird? Warum der Fehler bei der Sache mit dem * kommt kann ich Dir auch sagen. Die Felder der Tabelle sind unterschiedlich beim Datentyp, ausserdem ist die Anzahl Felder unterschiedlich, weiterhin gibt es in der einen Tabell manche Felder der anderen Tabelle nicht. Les Dir nochmal die Beiträge meiner Vorredner durch und überleg vorher, was Du von Dir gibst. |
Re: Optimierung einer Tabelle
Zitat:
|
Re: Optimierung einer Tabelle
Bevor ich hier was reinstelle überlege ich mir schon was ich sage !
Ich habe Prozeduren geschrieben die die Gleichheit bezogen auf die Struktur und Feldnamen prüft , welche ergeben hat das alles Korrekt ist ! Ihr solltet schon mal lesen was ich schreibe und erst dann Urteilen !! |
Re: Optimierung einer Tabelle
Zitat:
Wenn Du alles richtig machst, dann kannst Du z.B. mit ExamDiff die Unterschiede feststellen. |
Re: Optimierung einer Tabelle
Hallo,
> Ich habe Prozeduren geschrieben die die Gleichheit bezogen < > auf die Struktur und Feldnamen prüft , welche ergeben hat das alles Korrekt ist > Struktur <> Reihenfolge der Felder mache einfach mal was ich gesagt habe (select * und Reihenfolge ändern). Heiko |
Re: Optimierung einer Tabelle
Zitat:
es kann ja durchaus sein das bei einem Volumen von ca. 40 - 50 Mio Datensätzen es etwas länger dauert :coder2: mach mal bitte einen Vorschlag |
Re: Optimierung einer Tabelle
Du brauchst doch die Abfrage mit Feldliste nur einmal erstellen und kannst das Skript dann abspeichern
|
Re: Optimierung einer Tabelle
Also ich behaupte jetzt mal ganz einfach.... NUTZE NIEMALS EIN SELECT * FROM ...
sondern gebe immer alle Feldnamen an, auch wenn es 168 sind. Die Zeit, die durch diesen Thread schon verplempert wurde, um dein Problem zu schildern, währenddessen hättest du die 168 Feldnamen schon 10 mal sogar händisch eingetippt. |
Re: Optimierung einer Tabelle
Das stimmt schon mir ging es eben auch um den Hintergrund (Datenbanksystemtechnisch) und ich wollte eben eine logische Erklärung haben. Ich dachte es kennt jemand die genauen Gründe dafür und kann mir dabei helfen !
Viele Beiträge hätten nicht verfasst werden müssen , wenn man versucht hätte meine Beiträge aufmerksam zu lesen ! Ich habe z.B. gesagt, dass meine Tabellen von der Struktur her absolut 100 % identisch sind -> anschließend folgt ein Hinweis das die Fehlermeldung auf die Tatsache zurük zu führen wäre, dass die Struktur der beiden Tabellen nicht identisch wäre ! Zitat:
Dann kamen Hinweise bezüglich des Aufbaus der Datenbank . Ich Rede hier von einer Datenbank die ca 40-50 Millionen Datensätze hat und ansonsten auch hervoragend funktioniert und man sagt mir ich sollte den Aufbau der Datenbank überdenken . Zitat:
Naja ich habe jetzt beschlossen die Feldnamen manuell zu übergeben und das Statement anschließend auszuführen ! Ich danke all denen die sich ernsthaft damit beschäftigt haben und sinnvolle Beiträge verfasst haben !!!!!!!! |
Re: Optimierung einer Tabelle
Zitat:
In ![]() Du meinst also nicht im ernst, dass ich darauf noch weiter eingehen möchte. Und noch was: Ob nun 1000 oder 50 Millionen Datensätze in einer Tabelle stehen, das sagt noch längst nichts über ein gescheites DB Design aus. Und glaube mir, du hast hier von einigen alten Hasen Antworten auch zu der theoretischen Frage erhalten, sogar von IBExpert selbst, dem Autor von IBExpert. Der kennt Firebird wie seine Westentasche, und wagst es trotzdem sein Wissen anzuzweifeln, und auf deine leichtsinnige, unbegründete Aussage zu basieren, die Tabellen wären identisch... Alswo wirklich, ja :gruebel: |
Re: Optimierung einer Tabelle
Liste der Anhänge anzeigen (Anzahl: 4)
Schau dir doch die Einträge der beiden Tabellen in der Systemtabelle an und du wirst sehen das selbe Struktur nicht gleiche Reihenfolge bei select * bedeutet.
Ich habe mal eine Testtabelle erzeugt und die Änderungen an den Systemtabellen mit Screenshoots dokumentiert. 1: Tabelle vor dem Update 2: Nach Anlage des temporären Feldes. 3: Nach Löschen des alten Feldes 4: Umbenennen des neuen Feldes Vergleiche mal 1 und 4 und du siehst das Problem |
Re: Optimierung einer Tabelle
Mkinzler vielen dank !
Das heißt also , wenn an einer Tabelle A Änderungen vorgenommen worden sind und an der Tabelle B keine Änderungen vorgenommen worden sind anschließend sichergestellt wird das die Tabelle A wieder identisch ist mit der Tabelle B das
SQL-Code:
Insert Into Tabelle A select * from Tabelle B nicht geht !
Stimmst du mir da zu ? |
Re: Optimierung einer Tabelle
Hallo,
ibexpert, tabelle bearbeiten - rechte maustaste reihenfolge ändern) Heiko |
Re: Optimierung einer Tabelle
Zitat:
Wenn du an Tabelle A die Metadaten änderst (alter table), warum sollte sich die Tabellenstruktur wieder zurückspielen duch ein Insert into? |
Re: Optimierung einer Tabelle
Nein ich will jetzt in die Tabelle A meine Daten zurückspielen daher das Insert Statement !
Meine beiden Tabellen sind mitlerweile wieder identisch .... und jetzt habe ich vor alles von a nach zu kopieren b das Bild, welches ich vorhin reingestellt habe zeigt das die Reihenfolge nicht identisch ist und ich habe gelesen das eine Änderung der Reihenfolge nur an der Systemtabelle vorgenommen werden kann und das ist ziemlich gefährlich da dies zur vollständigen Zerstörung der Datenbank führen kann ! Also denke ich das es in diesen Zustand ohne Änderung der Reihenfolge nicht möglich ist dieses Statement abzusetzen und außerdem kann man eine Änderung dieser Reihenfolge nicht via Sql - Statement korregieren ! |
Re: Optimierung einer Tabelle
Zitat:
Zitat:
Zitat:
|
Re: Optimierung einer Tabelle
Hallo,
zur Positionsänderung ![]()
SQL-Code:
alter table table1 alter field1 position 3 modify field1 position 2;
Das sollte ab FB1.5 gehen. Heiko |
Re: Optimierung einer Tabelle
Bist du dir sicher das das keinen einfluß auf bestehende Datenbestände hat bzw. nichts zerstört ?
Habe gehört das sowas nicht empfohlen wird ! |
Re: Optimierung einer Tabelle
Wie gesagt sollte gleichzeitig kein Zugriff auf die Datenbank erfolgen. Außerdem sollte man vor jeder Strukturänderung einer Datenbank vorher ein Backup durchführen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz