-
Problem gepackte und gezonte Felder (SQL)
Moin Kollegens',
folgendes Anliegen:
Ich lese eine Datei per SQL und setze zudem ein subselect auf eine andere Datei ab.
In der Ausgangsdatei ist das Schlüsselfeld gepackt und in der zugelesenen Datei ist das Schlüsselfeld gezont.
Auf beiden Dateien gibt es entsprechend logische Dateien - aber SQL liest immer sequentiell - logische bleiben unberücksichtigt !
Weiß jemand, wie man dieses Problem in den Griff bekommt ?
Liebe Grüße und ein schönes Wochenende
wünscht
BratMaxxe
-
Hallo,
gib zunächst einmal das SQL-Statement an.
u.U. ist dann schon ersichtlich, warum jeweils ein Table Scan erforderlich ist. (mich macht der Sub-Select stutzig!)
Ansonsten sind gepackt (Decimal) und gezont (Numeric) auch für SQL unterschiedliche Datentypen. Zugriffswege können nur auf Original-Spalten erstellt werden. Für die Verknüpfung ist zumindest für eine Datei eine Konvertierung erforderlich, d.h. für diese Datei kein Zugriffsweg verwendet werden.
Es könnte demnach für eine der beiden Dateien ein Zugriffsweg verwendet werden.
Eventuell kann dies durch Umschreiben des SQL-Statements errreicht werden. Aber das ist ohne das SQL-Statement zu kennen und ohne weitere Analyse reine Spekulation.
Birgitta
-
wie Birgitta bereits bemerkte, lässt sich ein (in Ziffern 1) sequentieller Zugriff noch wegkriegen, wobei noch offen ist, ob das was bringt, aber wirklich heilen kann man dies nur mit einer Verbesserung des Datenbank Designs, sprich Keyfelder müssen zueinander passen.
D*B
 Zitat von Bratmaxxe
Moin Kollegens',
folgendes Anliegen:
Ich lese eine Datei per SQL und setze zudem ein subselect auf eine andere Datei ab.
In der Ausgangsdatei ist das Schlüsselfeld gepackt und in der zugelesenen Datei ist das Schlüsselfeld gezont.
Auf beiden Dateien gibt es entsprechend logische Dateien - aber SQL liest immer sequentiell - logische bleiben unberücksichtigt !
Weiß jemand, wie man dieses Problem in den Griff bekommt ?
Liebe Grüße und ein schönes Wochenende
wünscht
BratMaxxe
-
Das Problem tritt leider häufig bei Kombination diverser Anwendungen auf, die ursprünglich wenig oder gar nichts mit einander zu tun haben.
Bei Join-Beziehungen (auch Subselect), muss dann eben die linke Seite gecastet werden:
select ...
from filea
join fileb on cast(filea.key as ...)=fileb.key
In deinem Fall also
cast(a.key as zoned(n, m)) = b.key
Ist die Ausprägung ggf. auch noch anders muss ggf. mehrfach gecastet werden.
Ich habe z.B. das Problem, dass in Brain-XPPS die Kunden-Nr. 8-stellig gepackt ist, in DCW-Fibu aber 7-stellig Alpha!
Dies geht auch sehr schnell eben mit:
substr(digits(kdkdnr), 2, 7) = UKTO
Für andere Feldtypen müssen eben entsprechende Regeln angewendet werden.
-
hier könnte es auch Sinn machen eine zusätzliche Umschlüsselungstabelle für die Kundennummer anzulegen und zusätzlich zu joinen (geht natürlich auch nicht immer)
D*B
 Zitat von Fuerchau
Das Problem tritt leider häufig bei Kombination diverser Anwendungen auf, die ursprünglich wenig oder gar nichts mit einander zu tun haben.
Bei Join-Beziehungen (auch Subselect), muss dann eben die linke Seite gecastet werden:
select ...
from filea
join fileb on cast(filea.key as ...)=fileb.key
In deinem Fall also
cast(a.key as zoned(n, m)) = b.key
Ist die Ausprägung ggf. auch noch anders muss ggf. mehrfach gecastet werden.
Ich habe z.B. das Problem, dass in Brain-XPPS die Kunden-Nr. 8-stellig gepackt ist, in DCW-Fibu aber 7-stellig Alpha!
Dies geht auch sehr schnell eben mit:
substr(digits(kdkdnr), 2, 7) = UKTO
Für andere Feldtypen müssen eben entsprechende Regeln angewendet werden.
-
Hallo,
anbei das SQL Statement:
Code:
select terminkont.*,
(select sum(bmvmen) from pbestlo where bmkonz = mandant
and bmfirm = '001' and bmbedarfnr = bedarfnr)
as menge
from terminkont
where mandant = '100' and ktr = 666 and block = '10'
In der Datei pbestlo ist das Feld BMBEDARFNR ZONED
in der Datei Terminkont ist das Feld bedarfnr PACKED
Das nachfolgende Statement bringt auch keine Abhilfe !
Code:
select terminkont.*,
(select sum(bmvmen) from pbestlo where bmkonz = mandant
and bmfirm = '001' and cast (bmbedarfnr as dec(10, 0))= bedarfnr)
as menge
from terminkont
where mandant = '100' and ktr = 666 and block = '10'
Gruß und schönes Wochenede
Bratmaxxe
-
Hallo,
explizites casten bringt nichts, da der Optimizer wie zuvor erwähnt nur Zugriffwege, die über die Original-Spalten generiert wurden verwenden kann. Wenn Du ein Feld castest, veränderst Du es und damit ist die Verwendung eines Zugriffspfades über diese Spalte unmöglich.
M.E. bewirkt der Subselect, dass für beide Tabellen ein Table Scan erfolgen muss.
Versuch mal die Abfrage wie folgt umzuschreiben:
PHP-Code:
Wit x as (Select Bmkonz, bmbedarfnr, sum(bmvmen) as Menge
from pbestlo
Where bmKonz = '100' and bmfirm = '001'
group by bmkonz, bmbedarfnr)
select terminkont.*, Menge
from terminkont join x
on bmkonz = mandant and mandant = '100' and bmbedarfnr = bedarfNr
where ktr = 666 and block = '10'
;
oder
PHP-Code:
Select terminkont.*, Menge
from terminkont join (select bmkonz, bmbedarnr, sum(mbvmen) as Menge
from pbestlo
where bmkonz = '100' and bmfirm = '001'
group by bmkonz, bmbedarnr)
on bmkonz = mandant and mandant = '100' and bmbedarf = bedarfnr
Where ktr = 666 and block = '10'
Sofern ich mich nicht vertan habe, sollte der Optimizer jetzt in der Lage sein, zumindest für eine Tabelle einen Index zu verwenden, wenn nicht sogar für beide.
Vorausgesetzt entsprechende Zugriffswege (Mandant, KTR, Block, bmkonz, bmfirm) vorhanden sind und das Ergebnis nicht mehr als ca. 20% aller Datensätze betrifft.
Birgitta
-
da gibt es ja nicht nur den Subselect, sondern auch noch Auswahlfelder auf beiden Tables, da würde ich das Statement erst mal unter debug laufen lassen und mir im Joblog anschauen, was ihm an welchem Index nicht schmeckt und ob es einen anderen haben will.
D*B
 Zitat von Bratmaxxe
Hallo,
anbei das SQL Statement:
Code:
select terminkont.*,
(select sum(bmvmen) from pbestlo where bmkonz = mandant
and bmfirm = '001' and bmbedarfnr = bedarfnr)
as menge
from terminkont
where mandant = '100' and ktr = 666 and block = '10'
In der Datei pbestlo ist das Feld BMBEDARFNR ZONED
in der Datei Terminkont ist das Feld bedarfnr PACKED
Das nachfolgende Statement bringt auch keine Abhilfe !
Code:
select terminkont.*,
(select sum(bmvmen) from pbestlo where bmkonz = mandant
and bmfirm = '001' and cast (bmbedarfnr as dec(10, 0))= bedarfnr)
as menge
from terminkont
where mandant = '100' and ktr = 666 and block = '10'
Gruß und schönes Wochenede
Bratmaxxe
Similar Threads
-
By Xanas in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 13-06-06, 14:38
-
By Stefan_Sk in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 26-05-06, 16:37
-
By Lucky4712 in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 24-05-06, 15:57
-
By Robi in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 24-03-05, 14:43
-
By itec01 in forum IBM i Hauptforum
Antworten: 9
Letzter Beitrag: 16-09-04, 18:38
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks