Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   IIF In Joinstatement (https://www.delphipraxis.net/156064-iif-joinstatement.html)

Pro_RJ 18. Nov 2010 13:57

Datenbank: FireBird • Version: 2.0 • Zugriff über: IBX

IIF In Joinstatement
 
Huhu,
ich hätte mal eine kleine Frage ob eine solche Funktion überhautp möglich ist.

Ich hab mel eine kleines Beispielstatement vorbereitet.
Das Ziel dieser Abfrage ist es, die Anzahl der Lesevorgänge zu reduzieren.

SQL-Code:
Select A.Zaehler, IIF(A.WGR <> 0,W.bezeichnung,Cast('Keine WGR' as VarChar(10)))
from Artikel A
iif (A.WGR <> 0 ,left outer join warengruppen W on A.Mnr = W.Mnr and A.wgr = W.wgrnr and W.AdressNr = 0)
where .......

vielen Dank im Vorraus
Jens

DeddyH 18. Nov 2010 14:02

AW: IIF In Joinstatement
 
Wo soll genau der Unterschied zu einem INNER JOIN sein?

Pro_RJ 18. Nov 2010 14:45

AW: IIF In Joinstatement
 
Es geht mir nicht um das Join oder left outer join sondern darum, das join garnicht zu machen.
PS:
Ich möchte die Verbindung zu den Warengruppen nur lesen, wenn die WGR <> 0 ist sonst soll nichts gelesen werden

DeddyH 18. Nov 2010 14:47

AW: IIF In Joinstatement
 
Ich will mich nicht zu weit aus dem Fenster lehnen, denke aber, dass das so nicht möglich ist. Wenn es jemand besser weiß, lasse ich mich gern belehren.

[edit] Wobei: in einer SP kann man sich das Statement ja zur Not auch selbst zusammenbasteln, vielleicht wäre das ein Ansatz. [/edit]

shmia 18. Nov 2010 16:40

AW: IIF In Joinstatement
 
Diese Art der Optimierung halte ich für ziemlich unglücklich.

Wieviel würde das denn einsparen?
Es spart einen "Index-Lookup" auf den Index der Tabelle "warengruppen".
Index-Strukturen werden bevorzugt im Speicher gehalten; die mögliche Ersparnis liegt im Millisekunden Bereich.
Ausserdem würde der Interpreter, der das SQL auf interne Anweisungen umsetzt, mehr Zeit benötigen. Gespart wird also so gut wie nichts.

Was würde man verlieren?
Die Query wird durch die Optimierung so "verhunzt", dass ein fremder Programmierer den Sinn und Zweck erstmal nicht verstehen würde.
Falls er dann kapiert hat, dass es nur um Optimierung geht, würde er seinen Kopf gegen den Monitor :wall:

Pro_RJ 19. Nov 2010 09:09

AW: IIF In Joinstatement
 
Es geht darum, ich habe eine View die eine SP aufruft die Entweder Daten neu berechnet oder aus einer Gespeicherten liste zulinkt.
die Sp gibt mir 12 Feldinformationen wieder zurück.
da ich in einer View eine SP nur per (Select XXX from YYY()) aufrufen kann wurde ich das gerne abkürzen.
bsp:


SQL-Code:
Create View Artikel
Select ArtikelNr,
Bez,
(Select LagerBestand from SP(A.PIX)),
(Select Lagerwert from SP(A.PIX)),
(Select Bestellt from SP(A.PIX)),
(Select Bestelltwert from SP(A.PIX)),
.....
from Artikel
in der SP wird entschieden,
1. Wenn der Artikel Bearbeitet wurde -->
JA --> Dann Lagerwerte neu Berechnen
Nein --> sonst letzte gespeicherten Lagerwerte anzeigen (hiert wird eine weitere Tabelle gelesen)

und jetzt wollte ich die SP so umbauen, dann wenn nur die letzten werte geladen werden sollen dann per

SQL-Code:
Create View Artikel
Select ArtikelNr,
Bez,
iif(LetzteDatenanzeigen = 1, L.Lagerbestand,(Select LagerBestand from SP(A.PIX)))
iif(LetzteDatenanzeigen = 1, L.LagerWert,(Select LagerBestand from SP(A.PIX)))
iif(LetzteDatenanzeigen = 1, L.Bestellt,(Select LagerBestand from SP(A.PIX)))
iif(LetzteDatenanzeigen = 1, L.Bestellwert,(Select LagerBestand from SP(A.PIX)))
.....
from Artikel
iif(LetzteDatenanzeigen = 1, Left outer join Lageranzeige))
Über dieses Konstrukt würde ich statt 12 mal 2 Lesevorgänge nur einen lesevorgang benötigen
--> Das Ganze auf 400.000 - 500.000 Daten gibt das schon einiges anzeitersparniss


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 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