AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Effiziente sql-abfrage oder knick in der logik?
Thema durchsuchen
Ansicht
Themen-Optionen

Effiziente sql-abfrage oder knick in der logik?

Ein Thema von mojo777 · begonnen am 28. Dez 2005 · letzter Beitrag vom 31. Dez 2005
Antwort Antwort
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#1

Effiziente sql-abfrage oder knick in der logik?

  Alt 28. Dez 2005, 16:10
Datenbank: ib6 • Version: 6 • Zugriff über: sql
Hallo liebe Gemeinde,
ich habe mit jetzt vorgenommen, eine sql-abfrage zu optimieren.
hier ist sie:
SQL-Code:
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 '%;;%') )
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... )
so. jetzt hab ich mich mal mit den logik-rechenregeln darangetraut und bin auf foolgendes gestoßen:
das
SQL-Code:
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 '%;;%') )
schreibe ich mal.... ähh nix schreiben... habe hier ein bild angehängt, wo die rechnung drin ist. (das forum könnte *tex vertragen )
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
Miniaturansicht angehängter Grafiken
tex_911.gif  
Muh macht die kUh
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: Effiziente sql-abfrage oder knick in der logik?

  Alt 28. Dez 2005, 19:00
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
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#3

Re: Effiziente sql-abfrage oder knick in der logik?

  Alt 29. Dez 2005, 11:18
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ß
Muh macht die kUh
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#4

Re: Effiziente sql-abfrage oder knick in der logik?

  Alt 29. Dez 2005, 11:58
naja... manchmal ist die erkenntniss doch so nah.
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

naja. und sorry fürs zumüllen hier. das problem war ja doch einer einfachen art.
Muh macht die kUh
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Effiziente sql-abfrage oder knick in der logik?

  Alt 29. Dez 2005, 11:59
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
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Effiziente sql-abfrage oder knick in der logik?

  Alt 29. Dez 2005, 13:16
SQL-Code:
AND (ANG_PRODUKTE LIKE '%;;%OR ANG_PRODUKTE LIKE '%;*;%')
  AND (ANG_KUNDEN LIKE '%;;%OR ANG_KUNDEN LIKE '%;*;%')
Warum nicht gleich so?

Und wie kommst du darauf das %;;% das Gegenteil von %;*;% ist?
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#7

Re: Effiziente sql-abfrage oder knick in der logik?

  Alt 29. Dez 2005, 13:39
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:
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;%') )
das macht dann wieder etwas mehr sinn. so hoffe ich ist auch die frage nach dem gegenteil beantwortet

die spalte ANG_EXCLUDE ist ein varchar (<1000) und die werte dir sort statt int[n] gespeichert sind, werden eben durch ";" getrennt
Muh macht die kUh
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Effiziente sql-abfrage oder knick in der logik?

  Alt 29. Dez 2005, 20:28
Zitat von mojo777:
wo kann ich mehr darüber nachlesen, wie ich arrays in den zellen benutze
Die ultimative Informationsquelle ist der Interbase ApiGuide. Da die BDE arrays garnicht unterstützt und SQL nicht vollständig - arrays stammen noch aus GDML - musst du entweder array-kompatible Komponenten finden oder die API calls benutzen. Ich selbst habe arrays aus den bereits angedeuteten Gründen bisher vermieden.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Effiziente sql-abfrage oder knick in der logik?

  Alt 31. Dez 2005, 11:11
Zitat von mojo777:
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:
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;%') )
das macht dann wieder etwas mehr sinn.
Eigentlich nicht. Es lässt sich nämlich immer noch so schreiben:

SQL-Code:
AND (ANG_PRODUKTE LIKE '%;1547;%OR ANG_PRODUKTE LIKE '%;*;%')
  AND (ANG_KUNDEN LIKE '%;147;%OR ANG_KUNDEN LIKE '%;*;%')
Es sei denn ich hab was übersehen.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  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 11:24 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