Hallo zusammen,
folgende Konstellation:
- Tabelle A: Datensätze mit eindeutiger ID und einem langem Textfeld
- Tabelle B: Datei für die Indizierung von Tabelle A. Enthält zu jedem Wort des Textefeldes von Tabelle A eine Zeile mit Bezug auf die eindeutige ID
Mit folgendem SQL wird nun auf die Tabelle zugriffen:
Code:
with x as (
select IXFNAM, IXTEXT, IXRECL from matindex
where
IXFNAM = 'DBTEXT'
and IXTEXT = 'KUNDE')
SELECT
'DBTEXT', PDPRN2, PDPRN3, PDKDK, PDMA, PDBTDT,
rtrim(PDTXT1)||rtrim(PDTXT2)||rtrim(PDTXT3)||
rtrim(PDTXT4)||rtrim(PDTXT5) as Txt
FROM DBTEXT right join x on
IXRECL = PDLFDN order by pdbtdt
Die MATINDEX Datei ist hier die Indizierungsdatei (B) und die DBTEXT die Tabelle (A).
Ich habe schon verschiedene Variationen durchprobiert mit EXISTS, JOIN und nun diese common table expression.
Die aktuelle Variante ist von der Performance her nun die Beste, aber allgemein bin ich mit der Leistung nicht zufrieden.
Als Grund für die mangelhafte Performance habe ich das ORDER BY auf ein Datumsfeld ausgemacht. Wenn das SQL z.B. 9000 Sätze ausgibt braucht es auf einer 4000 CPW Power6 Maschine unter V5R4M0 etwa 20 Sekunden. Ohne ORDER BY sind es nur ca. 2 Sekunden.
Was kann ich tun um diese Abfrage zu verbessern? Laut Visual Explain habe ich schon bei beiden Tabellen Zugriff über einen optimalen Index. Warum dauert das dennoch so lange?
Die selben Abfragen (ohne CTE, aber mit Subselect) unter MySQL mit den gleichen Daten brauchen nur einen Bruchteil der Zeit.
Was mache ich hier falsch?
Gruß
Matthias Schatte
Bookmarks