Anmelden

View Full Version : SQL + Performance



Robi
18-02-11, 12:37
Hi
ich habe folgenes select im interaktiven SQL abgesetzt, es ist rasend schnell

select 'K1',susunr, susun2, case
when length(replace(replace(sukto1, '-', ''), ' ', ''))=9
then '0' concat replace(replace(sukto1, '-', ''), ' ', '')
when length(replace(replace(sukto1, '-', ''), ' ', ''))=8
then '00' concat replace(replace(sukto1, '-', ''), ' ', '')
when length(replace(replace(sukto1, '-', ''), ' ', ''))=7
then '000' concat replace(replace(sukto1, '-', ''), ' ', '')
when length(replace(replace(sukto1, '-', ''), ' ', ''))=6
then '0000' concat replace(replace(sukto1, '-', ''), ' ', '')
when length(replace(replace(sukto1, '-', ''), ' ', ''))=5
then '00000' concat replace(replace(sukto1, '-', ''), ' ', '')
when length(replace(replace(sukto1, '-', ''), ' ', ''))=4
then '000000' concat replace(replace(sukto1, '-', ''), ' ', '')
when length(replace(replace(sukto1, '-', ''), ' ', ''))=3
then '0000000' concat replace(replace(sukto1, '-', ''), ' ', '')
else replace(replace(sukto1, '-', ''), ' ', '')
end as kto,
replace(replace(sublz1, '-', ''), ' ', '') as blz
from schulp where sukto1 <> ' '
union all
select 'K2',susunr, susun2, case
when length(replace(replace(sukto2, '-', ''), ' ', ''))=9
then '0' concat replace(replace(sukto2, '-', ''), ' ', '')
when length(replace(replace(sukto2, '-', ''), ' ', ''))=8
then '00' concat replace(replace(sukto2, '-', ''), ' ', '')
when length(replace(replace(sukto2, '-', ''), ' ', ''))=7
then '000' concat replace(replace(sukto2, '-', ''), ' ', '')
when length(replace(replace(sukto2, '-', ''), ' ', ''))=6
then '0000' concat replace(replace(sukto2, '-', ''), ' ', '')
when length(replace(replace(sukto2, '-', ''), ' ', ''))=5
then '00000' concat replace(replace(sukto2, '-', ''), ' ', '')
when length(replace(replace(sukto2, '-', ''), ' ', ''))=4
then '000000' concat replace(replace(sukto2, '-', ''), ' ', '')
when length(replace(replace(sukto2, '-', ''), ' ', ''))=3
then '0000000' concat replace(replace(sukto2, '-', ''), ' ', '')
else replace(replace(sukto2, '-', ''), ' ', '')
end as kto,
replace(replace(sublz2, '-', ''), ' ', '') as blz
from schulp where sukto2 <> ' '

Ich 'normalisiere' das Feld KontoNr ( eine alpha Feld )
auf 10 Stellen mit führender 0, ohne blank und -
Da in der Datei 2 KontoNr sind, hänge ich die 2. Nr
einfach dahinter.

Erstelle ich damit eine View und mache ein
Select * from view
warte ich über eine Stunde auf die Anzeige.
Interactiv im SQL, ohne View, habe ich sofort ein Bild.
Auch ein LF (Index) über SUKTO1, SUBLZ1 bringt nix (auch SUKTO2 SUBLZ2)

Muß ich nun die Daten doch physikalisch kopieren
um schnell mit meiner Kontonr einen Debitor zu finden?

Wie kann ich das beschleunigen ?
V5R4, ca 1,25 Mio Debitoren
Danke
Robi

Fuerchau
18-02-11, 14:35
Die erste Frage die sich mir stellt ist, warum machst du das ?
Kannst du die Daten nicht anders selektieren ?

Der interaktive SQL macht sowieso irgend was anderes, was ich bisher auch noch nicht rausgefunden habe, auch Birgitta hat sich hierzu noch nicht geäußert.
Debug und sonstige Analysen habe da noch nichts gebracht.

Ausserdem enthält dein SQL auch keine Where-Klausel (die bezieht sich auf den Einzelsatz), dann zeigt SQL von Anfang an.

Nun zu deiner View:

Da du mit Sicherheit auf die View mit einer Whereklausel losgehst ist SQL gezwungen einen Tablescan durchzuführen, da diese Where-Klausel erst auf das Ergebnis angewendet werden kann.
Durch die Union auch noch 2 Mal, wenn in der ersten nichts gefunden ist.

Hier hilft nur tatsächlich ein Feld anzuhängen (bzw. 2. Datei), diese mit einem Trigger aus der 1. Datei im passenden Format füllen.

Interaktiv kannst du das auch so machen:

with
MyView as (
Select ...
)
select * from MyView
where ...

Ich denke, interaktiv wirst du da auch nicht schneller.

Fuerchau
18-02-11, 14:41
Übrigens versuch mal:

right('0000000000' concat trim(replace(Konto, '-', '')), 10)

Robi
18-02-11, 15:00
moin

Die erste Frage die sich mir stellt ist, warum machst du das ?
Kannst du die Daten nicht anders selektieren ?

Habe Daten, die von den Erfassern 'Optisch angenem Lesbar' erfasst wurden. mit -, mit blank, mit ...(diverses)

Bekomme vom Lieferanten nun Kontonr. Immer 10 Stellen, immer ohne Blank.
Und nun soll ich die zuordnen. Ich habe zwar auch einen Namen, diese sind aber noch schlimmer verunstaltet, ggf sogar falsch.


Da du mit Sicherheit auf die View mit einer Whereklausel losgehst ist SQL gezwungen einen Tablescan durchzuführen, da diese Where-Klausel erst auf das Ergebnis angewendet werden kann.

Nö, zum testen ob das so geht wie ich mir das denke, mach ich nur : select * from view (mehr nicht)

Habe nun zunächst die interaktive selektion in eine datei ausgegeben und teste die Erfolgsquote.

Aber ohne Redundante Daten währ es mir 1000 mal lieber.
na dann muß wohl später ein Trigger eine 2. Datei pflegen
Gruß
Robi

BenderD
20-02-11, 10:32
@interaktives SQL anders: es wird (fast) immer auf die schnelle Anzeige der ersten Sätze optimiert

@View Stunden lang: typischer Bug des Query Optimizers

@zusätzliche Datei: drittbeste Lösung

@zweitbeste Lösung: zusätzliches Feld in derselben Datei per Trigger pflegen

@Lösung: Datenbankdesign korrigieren!!! Kontonummer ist ein Schlüsselfeld - und Hunz in solchen Feldern führt zu Problemen jeder Art (Doubletten inklusiver falscher Zuordnung)

D*B