![]() |
Datenbank: firebird • Zugriff über: ibx, ibexpert
bde schneller als firebird
nochmal ne andere frage:
bin dabei eine db-anwendung, die auf bde und paradox basiert, für firebird umzuschreiben außerdem gibs dazu noch ne kleine software, die dann die datenbanken ins neue format konvertiert..jetzt hab ich mir mal testweise eine ziemlich große datenbank im alten format (mit zufallswerten) generieren lassen und sie ins neue format konvertiert und dann nach einträgen gesucht und dabei fällt auf, dass die suche unter der bde merklich schneller geht (ok, die datenbankstruktur ist im neuen format auch etwas komplexer aber die direkte suche nach indizierten feldern sollte das ja nicht beeinträchtigen, oder) woran kann denn das liegen, is das normal? achsoo: firebord als lokaler server danke martin |
Re: bde schneller als firebird
Wie ist dein Code für den Firebird-Zugriff (Beispiel)? Methoden die bei BDE bzw. lokalen DB's schnell sind sind u.U. bei SQL-Datenbanken nicht optimal.
|
Re: bde schneller als firebird
hast Du mal versucht, mit anderen Komponenten (z.B. ZEOS) auf deinen FB zuzugreifen.
Die ibexpert-Sachen sind nicht allzu optimiert. hast du firebird als Server laufen oder als embedded? bei einem direkten Vergleich zu BDE solltest du embedded wählen. |
Re: bde schneller als firebird
net erschrecken: das ist eine terminologiedatenbank..sucht man nach einem bestimmten asterm, dann wird sicherheitshalber (falls der asterm nicht enthalten ist) auch der vorgänger und soviele nachfolger geholt, bis 20 datensätze insgesamt da sind..asterm ist indiziert, ebenso wie sämtliche fremdschlüssel...(hier suche nach asterm 'peter'):
SQL-Code:
select * from (
select * from ( select d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm, d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef, d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio, d.zsvideo, asmain.asterm as asverw, zsmain.zsterm as zsverw, a.aut as aut, ua.aut as updaut, aslit.qcode as asqcode, zslit.qcode as zsqcode from dicentries d left join dicentries asmain on d.asverw = asmain.id left join dicentries zsmain on d.zsverw = zsmain.id left join aut a on d.aut = a.id left join aut ua on d.updaut = ua.id left join lit aslit on d.asqcode = aslit.id left join lit zslit on d.zsqcode = zslit.id where d.asterm < 'peter' order by asterm descending rows 1 ) union select d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm, d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef, d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio, d.zsvideo, asmain.asterm as asverw, zsmain.zsterm as zsverw, a.aut as aut, ua.aut as updaut, aslit.qcode as asqcode, zslit.qcode as zsqcode from dicentries d left join dicentries asmain on d.asverw = asmain.id left join dicentries zsmain on d.zsverw = zsmain.id left join aut a on d.aut = a.id left join aut ua on d.updaut = ua.id left join lit aslit on d.asqcode = aslit.id left join lit zslit on d.zsqcode = zslit.id where d.asterm = 'peter' union select * from ( select * from ( select d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm, d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef, d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio, d.zsvideo, asmain.asterm as asverw, zsmain.zsterm as zsverw, a.aut as aut, ua.aut as updaut, aslit.qcode as asqcode, zslit.qcode as zsqcode from dicentries d left join dicentries asmain on d.asverw = asmain.id left join dicentries zsmain on d.zsverw = zsmain.id left join aut a on d.aut = a.id left join aut ua on d.updaut = ua.id left join lit aslit on d.asqcode = aslit.id left join lit zslit on d.zsqcode = zslit.id where d.asterm > 'peter' order by asterm ascending rows 20 ) ) ) order by asterm ascending rows 20 |
Re: bde schneller als firebird
also wenn deine Abfrage so kompliziert ist, solltest Du vielleicht mal das DB-Design überdenken...
|
Re: bde schneller als firebird
Zitat:
beim firebird service control steht "as a service" wieso beeinträchtigt das die geschwindigkeit von suchen? |
Re: bde schneller als firebird
OK. Immerhin schon SQL und nicht mit Locate oder ähnlichen gearbeitet.
Wie sind denn die Zeiten? |
Re: bde schneller als firebird
Zitat:
Die BDE ist am ehesten mit der embedded Version des Firebird vergleichbar. |
Re: bde schneller als firebird
also es gibt in tabelle dicentries so etwa 100000 einträge...bei der bdedauert die suchen nen augenaufschlag...unter firebird so 3 sekunden...also schon noch zu verkraften aber eben langsamer :-(
|
Re: bde schneller als firebird
wie verwendest du denn die Suche in der BDE?
mit TTables, TDataste, TQuery oder wie? lass doch mal Quellcode der Suche für BDE und der Suche für Firebird sehen... |
Re: bde schneller als firebird
ttables kommen da zum einsatz
quelltext hab ich grad nicht parat aber das war da über "gotonearest" (ich glaub so hieß die procedure) gemacht... |
Re: bde schneller als firebird
Hi,
verwende zum Zugriff auf Firebird (V1.5 setzt Du hoffentlich ein) nicht mehr unbedingt die IBX. Die tun zwar, aber.... Verwende entweder die UIB (haben allerdings ne schlechte Oberflächenanbindung) oder die MOD (noch nicht getestet) oder gleich ein kommerzielles Produkt wie die FIBPlus. Wenn Du das Tabellendesign vernünftig gemacht hast, dann installier den FB-Server auf einem anderen Rechner, wenn das nicht geht schau zu dass die Datenbank (also das *.fdb File) auf einer anderen Festplatte auf deinem Rechner liegt, da solltest Du dann schon nen Geschwindigkeitsvorteil spüren, wobei ein eigener Server sicherlich Sinn machen würde. Desweiteren solltest Du die TTable Komponente ganz schnell vergessen. Verwende für die Abfrage eine TIBDataset oder was vergleichbares (TIBQuery bitte auch nicht!). Das war das wichtigste mal in Folge. Du wirst sicherlich noch viele Ecken finden, wo Deine Software langsamer ist als mit der BDE, aber das musst Du dann eben verbessern, sei es mit StoredProcedures, anderen Abfragen, Indizes,... Grüße Lemmy |
Re: bde schneller als firebird
Zitat:
|
Re: bde schneller als firebird
Zitat:
|
Re: bde schneller als firebird
Siehe
![]() Kein SQL, keine gefilterte Ergebnismenge, keine Performance, ... Wenn die BDE bei TTable nicht schneller gewesen wäre wäre irgendwas kaputt. Bei Paradox wirst du die ganze Tabelle direkt von der Datei in den Speicher laden. Das musst du da immer, deshalb sollte man annehmen, dass Borland dafür gesorgt hat, dass es halbwegs schnell geht. Ein SELECT * ist in einem (poststeinzeitlichen) serverbasierten DBMS eher eine krasse Ausnahme. Solche System sind darauf optimiert Teilmengen zu finden und an den Client zu übertragen. 3 Sekunden für solch eine krasse Abfrage sprechen eindeutig für FB: Viele (auch teure) DBMS hätten das sicher länger gebraucht. (natürlich andere auch 10-mal weniger ;) ). Alleine das SELECT * & UNION :shock: zeugt deutlich von "wie gates ohne dass ich groß drüber nachden muss?" |
Re: bde schneller als firebird
Welche Indices hast du für df FB-Datenbank angelegt?
|
Re: bde schneller als firebird
Zitat:
Zitat:
|
Re: bde schneller als firebird
Zitat:
Zitat:
|
Re: bde schneller als firebird
Moin, moin
Ja, das kann schon sein. Spricht aber noch nicht gegen FB. Paradox ist für relativ einfache SQL-Strukturen eine flotte Lösung. Und da kein Umweg über TCP/IP genommen wird, sind auch keine Synchronisationszeiten in diesem Berich vorhanden. Zudem beherscht FB einen wesentlich größeren Befehlssatz und Funktionen wie die Transaktionskontrolle, was auch Zeit nimmt. Da ist bei Paradox einfach Ende. Arbeitet man mit komplexeren Where-Sttements in Queries, dann geht aber auch Paradox deutlich in die Knie, den das Ergebnis wird komplett auf Festplatte zwischengespeichert (Dateien im tmp-Verzeichnis) und das Dauert dann. Paradox ist nicht schlecht. Probleme treten aber bei der gleichzeitigen Verwendung mehrere BDE-Anwendungen auf, da es hier schonmal zu Synchronisationsproblemen kommen kann. Hier liegt der Grund für den Entwicklungsstop der BDE. FAZIT: Die Umstellung ist letzlich trotzdem der richtige Weg. Grüße // Martin |
Re: bde schneller als firebird
Das Fazit von Martin stimmt. Es nützt aber nichts, die DB falsch anzulegen. Ich sehe einen BIBU also Insert UND Update-Trigger mit sage und schreibe 50 Zeilen, die alle mit OR verknüpft sind. D.h.: alles muß abgearbeitet werden. Und das soll jetzt als Vergleich zur BDE dienen ? Wie ist so ein Trigger damit überhaupt hinzukriegen ? :shock: Ein Vergleich zwischen Äpfel und Birnen ist normal. :mrgreen: Hier handelt es sich aber eher um einen Vergleich zwischen Mücke und Elefant auf 3 Beinen.
|
Re: bde schneller als firebird
ja wie gesagt, die datenbankstruktur ist etwas komplexer
aber kann ein insert/update-trigger als erklärung dafür herhalten, dass die suche von datensätzen langsam ist?? |
Re: bde schneller als firebird
HAi sancho1980,
kannst Du deinen "SQL-Code" aus Beitrag #18 bitte als Datei anhängen. Bei sovielen Zeilen scrollt man sich sonst die Flossen wund. Danke. |
Re: bde schneller als firebird
Zitat:
Stop, nur beim "suchen" nach Datensätzen ? :shock: Dann ist es an der Stelle nicht der Trigger. Ich lasse das bereits Geschriebene aber vorsichtshalber trotzdem mal stehen. Wie wird denn "gesucht" ? |
Re: bde schneller als firebird
Eine solch Komplexe Query würde ich persönlich immer in eine Stored-Procedure packen. Wie sieht denn der Ausführungsplan der Query aus? Wieviele Datensätze werden denn gelesen?
|
Re: bde schneller als firebird
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
gruß martin |
Re: bde schneller als firebird
Zitat:
Lemmy |
Re: bde schneller als firebird
ok, hab ich gemacht
aber man hätte es auch einfach zusammenfalten können... |
Re: bde schneller als firebird
Uff, das Select in #4 ist gemeint ? :shock: Das ist ja alleine schon ziemlich Flossen-ungeeignet. :lol: :wall: Du wirst doch hoffentlich meine Frage mit dem Union dieser Tage nicht zum Anlass genommen haben, solch ein Ungetüm zu konstruieren ? Da ging es nämlich auch um ein 3faches per Union verknüpftes select mit Joins drin. Um die ursprüngliche Frage zu beantworten : es bestand bei mir keinerlei Bedarf einer Zeitmessung und die beteiligten Tabellen sind nicht gerade klein. Die Ursache ist wohl in Deinem Code zu suchen. An #4 komme ich jetzt nicht mehr dran, aber da war doch innerhalb der Unions gleich ein MEHRFACHES Join, oder ? :gruebel: Der Trick bei so was besteht darin, die Datemengen einzugrenzen und zwar mit "where". Der nächste besteht darin, das nicht ins Programm einzubauen, sondern zuerst extern zu testen. Sprich : in IBExpert. Dann sieht man auch die Anzahl der zurückgelieferten Datensätze. Dauert es auch da zu lange, dann besser dort die Logik überprüfen. Dann fehlt noch die Angabe der DB-Version. Firebird alleine genügt nicht mehr ! Ist es die 1.5, dann wäre es denkbar, daß die IBX querschießen. Das zu überprüfen wäre allerdings erst notwendig wenn das Ganze in IBExpert überhaupt sauber läuft.
Jetzt habe ich das obige als Entwurf gesichert und #4 nochmals durchgeguckt. Mann, mann. Da sind sage und schreibe 6 :!: Joins drin pro Select und das per Union. Jedes Select hat noch 2 Unter-Selects. Was soll das ? Im "Where" steht allerdings nur eine Bedingung. Wer soll denn jemals wieder verstehen, was da irgendwann gemacht wurde ? Du mußt das dringendst vereinfachen, dann sind die "Fehler" wahrscheinlich von alleine weg. |
Re: bde schneller als firebird
schau, der sinn der ganzen abfrage ist folgender:
ich muss in dem programm UNBEDINGT das dbgrid beibehalten..macht sich bei sql natürlich schwer; also war mein ausweg: immer genau 20 datensätze holen und wenn der benutzer bild-up oder -down drück, die vorherigen oder nächsten zwanzig holen...also wird das select-sql-statement immer wieder neu generiert das sql-statement von dem du redest ist ein beispiel, wo der user grad nach dem record sucht, wo asterm = peter...mein ziel ist, dass der benutzer dan folgendes zurückbekommt im grid: -zuerst den eintrag (falls vorhanden), der in der datenbank genau VOR 'peter' kommt -dann (falls vorhanden) 'peter' -dann sortiert alle weiteren, die nach 'peter' kommen ..und insgesamt zwanzig..also wie in nem richtigen grid, in dem sich 'alle`datensätze befinden... jetzt verständlicher? ps: ein einzelnder record wird ausgewählt mit:
SQL-Code:
select d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm, d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef, d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio, d.zsvideo, asmain.asterm as asverw, zsmain.zsterm as zsverw, a.aut as aut, ua.aut as updaut, aslit.qcode as asqcode, zslit.qcode as zsqcode
from dicentries d left join dicentries asmain on d.asverw = asmain.id left join dicentries zsmain on d.zsverw = zsmain.id left join aut a on d.aut = a.id left join aut ua on d.updaut = ua.id left join lit aslit on d.asqcode = aslit.id left join lit zslit on d.zsqcode = zslit.id where ... |
Re: bde schneller als firebird
ich dachte mir grad, ich versuch mich mal an ner sp, um zu sehen, ob damit irgendwas schneller wird...jetzt wollt ich testweise erstmal ne sp schreiben, die einen bigint entgegen nimmt, und mir alle records zurückgibt, deren id direkt auf diesen wert folgen, aber folgendes klappt irgendwie nicht:
SQL-Code:
woran liegt das?
SET TERM ^ ;
CREATE PROCEDURE NEW_PROCEDURE ( X BIGINT) RETURNS ( ASTERM VARCHAR(80)) AS DECLARE VARIABLE I BIGINT; BEGIN for select dicentries.asterm from dicentries where dicentries.id > :x order by id rows 20 into :asterm do suspend; END^ SET TERM ; ^ danke, martin |
Re: bde schneller als firebird
Ich weiß nicht was nicht geht, aber deine SP gibt ja nur ein Feld aus und nicht die Datensätze. Außerdem ist die Ausgabe auf 20 beschränkt.
|
Re: bde schneller als firebird
genau
aber geht das bei dir etwa? bei mir nicht... |
Re: bde schneller als firebird
ahhh...habs schon:
statt "rows 20" am ende "select first 20" am anfang komisch, warum das in der sp auf einmal anders heißen muss... :?: |
Re: bde schneller als firebird
Ich habe mal dei datenbank angelegt und ein parr testdatensätze eingefügt. Ich habe auch einen Begin..end Block um das suspend gelegt. Bei mir funktioniert es.
SQL-Code:
GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA;
SET TERM ^ ;
CREATE PROCEDURE NEW_PROCEDURE ( X BIGINT) RETURNS ( ASTERM VARCHAR(80) CHARACTER SET WIN1252) AS begin for select dicentries.asterm from dicentries where dicentries.id > :x order by id rows 20 into :asterm do begin suspend; end end^ SET TERM ; ^ GRANT SELECT ON DICENTRIES TO PROCEDURE NEW_PROCEDURE; |
Re: bde schneller als firebird
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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-2025 by Thomas Breitkreuz