![]() |
Datenbank: ib6 • Version: 6 • Zugriff über: sql
Effiziente sql-abfrage oder knick in der logik?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Gemeinde,
ich habe mit jetzt vorgenommen, eine sql-abfrage zu optimieren. hier ist sie:
SQL-Code:
ich sage auch kurz was dazu: die felder ANG_KUNDEN, ANG_PRODUKTE ANG_EXLCLUDE, ANG_EXCLUDE_GRUPPEN sind eine Art Array als string realisiert. (mir fiel kein besserer weg ein eine R^3 matrix zu realisieren... :-( )
SELECT * FROM ANGEBOTE WHERE VON <= 'NOW' AND BIS >= 'NOW'
AND ANG_EXCLUDE NOT LIKE '%;;%' AND ANG_EXCLUDE_GRUPPEN NOT LIKE '%;1;%' AND( (ANG_PRODUKTE LIKE '%;;%' AND ANG_KUNDEN LIKE '%;;%') OR (ANG_PRODUKTE LIKE '%;*;%' AND ANG_KUNDEN LIKE '%;*;%') OR (ANG_PRODUKTE LIKE '%;;%' AND ANG_KUNDEN LIKE '%;*;%') OR (ANG_PRODUKTE LIKE '%;*;%' AND ANG_KUNDEN LIKE '%;;%') ) so. jetzt hab ich mich mal mit den logik-rechenregeln darangetraut und bin auf foolgendes gestoßen: das
SQL-Code:
schreibe ich mal.... http://www.delphipraxis.net/download.php?id=16324 ähh nix schreiben... habe hier ein bild angehängt, wo die rechnung drin ist. (das forum könnte *tex vertragen ;-) )
AND( (ANG_PRODUKTE LIKE '%;;%' AND ANG_KUNDEN LIKE '%;;%')
OR (ANG_PRODUKTE LIKE '%;*;%' AND ANG_KUNDEN LIKE '%;*;%') OR (ANG_PRODUKTE LIKE '%;;%' AND ANG_KUNDEN LIKE '%;*;%') OR (ANG_PRODUKTE LIKE '%;*;%' AND ANG_KUNDEN LIKE '%;;%') ) so.. wie man auch erwarten kann, liefert die "rechnung" als sql-query müll. jetzt meine frage an euch kenner, welche ansätze der optimierung gibt es ohne die struktur komplett über den haufen schmeissen zu müssen? gruß mojo |
Re: Effiziente sql-abfrage oder knick in der logik?
Habe wir deine Abbildung angesehen,
dass die 1. Zeile eine Tautologie ist, sieht man leicht. Aber wie kommst du auf die 2. Zeile. Welche de Morgansche Regel hast du da angewandt? mfg DD |
Re: Effiziente sql-abfrage oder knick in der logik?
hmm... ich weiss nicht mehr welche rechenregel das ist. die gilt aber auf jeden fall. :-)
das problem ist der ansatz der rechnung. der gilt nicht, weil die anzahl der sql-zustände >2 ist. ich werde gleich versuchen, die rechenarbeit etwas mehr auf delphi umzulagern und erst dann sql zu starten. ergebnisse kommen später hier rein. gruß |
Re: Effiziente sql-abfrage oder knick in der logik?
naja... manchmal ist die erkenntniss doch so nah. :-D
habe gerade die indices überprüft und etwas verändert und muss sagen, indizierte suche ist nicht immer gleich eine gute indizierte suche. :-) statt 900 ms jetzt 30 ms abfragezeit :dancer2: naja. und sorry fürs zumüllen hier. das problem war ja doch einer einfachen art. :-P |
Re: Effiziente sql-abfrage oder knick in der logik?
Hallo mojo,
von Tautologie in der ersten Zeile möchte ich nicht sprechen - für mich selektierst du da die laufenden Angebote, wenn du statt dem Literal 'NOW' den Parameter :now verwenden würdest. Was mich interessieren würde, wäre eine genauere Beschreibung deiner Strings (ANG_EXCLUDE, etc.). Du schreibst von einer Matrix der dritten Dimension, aber ich vermute da eher einen Vektor. Welche Bedeutung und welchen Wertebereich hat der? Weisst du, dass Interbase gewisse NF2 Leistungsmerkmale aufweist? Du kannst ein Feld auch als ANG_EXCLUDE integer [3] definieren, um einen Vektor der Dimension 3 zu speichern. Aber ob dass wirklich nötig ist? Oft ist eine 1:n relationship die bessere, weil portable Lösung. Grüße vom marabu |
Re: Effiziente sql-abfrage oder knick in der logik?
SQL-Code:
Warum nicht gleich so? :)
AND (ANG_PRODUKTE LIKE '%;;%' OR ANG_PRODUKTE LIKE '%;*;%')
AND (ANG_KUNDEN LIKE '%;;%' OR ANG_KUNDEN LIKE '%;*;%') Und wie kommst du darauf das %;;% das Gegenteil von %;*;% ist? |
Re: Effiziente sql-abfrage oder knick in der logik?
marabu,
wo kann ich mehr darüber nachlesen, wie ich arrays in den zellen benutze. inkl. durchsuchung und sonst, was damit zusammenhängen kann... würde mich sehr freuen, wenn ich darüber etwas genauer nachlesen könnte. dass es diese mögl. gibt habe ich schon mitbekommen, aber mich abber immer davor gescheut damit was anzufangen, weil ich wirklich keine informationen dazu habe um auf irgendwie auf fehler beim programmieren zu reagieren. :-( mystic, jau. das sieht in der tat blöd aus. aber das liegt daran, dass ich mir hier eine generierte Query als bsp ausgesucht habe, wo die variablen bei der generierung nicht belegt waren (sprich: x-beliebiger kunde, und produkt ohne EAN(preis per hand eingetippt)). mit den o.g. werten würde das ganze folgendermaßen aussehen:
SQL-Code:
das macht dann wieder etwas mehr sinn. so hoffe ich ist auch die frage nach dem gegenteil beantwortet :-)
SELECT * FROM ANGEBOTE WHERE VON <= 'NOW' AND BIS >= 'NOW'
AND ANG_EXCLUDE NOT LIKE '%;;%' AND ANG_EXCLUDE_GRUPPEN NOT LIKE '%;1;%' AND( (ANG_PRODUKTE LIKE '%;1547;%' AND ANG_KUNDEN LIKE '%;147;%') OR (ANG_PRODUKTE LIKE '%;*;%' AND ANG_KUNDEN LIKE '%;*;%') OR (ANG_PRODUKTE LIKE '%;1547;%' AND ANG_KUNDEN LIKE '%;*;%') OR (ANG_PRODUKTE LIKE '%;*;%' AND ANG_KUNDEN LIKE '%;147;%') ) die spalte ANG_EXCLUDE ist ein varchar (<1000) und die werte dir sort statt int[n] gespeichert sind, werden eben durch ";" getrennt |
Re: Effiziente sql-abfrage oder knick in der logik?
Zitat:
![]() Grüße vom marabu |
Re: Effiziente sql-abfrage oder knick in der logik?
Zitat:
SQL-Code:
Es sei denn ich hab was übersehen. :mrgreen:
AND (ANG_PRODUKTE LIKE '%;1547;%' OR ANG_PRODUKTE LIKE '%;*;%')
AND (ANG_KUNDEN LIKE '%;147;%' OR ANG_KUNDEN LIKE '%;*;%') |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 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