[PL/SQL] Optimierungsmöglichkeiten

Cappaja

Erfahrenes Mitglied
Hallo,

ich muss aus 10 Spalten derselben Tabelle alle von NULL verschiedenen Werte einmalig vorkommend aneinander fügen. Einzelne Spalten können unterschiedlich viele oder gar keine Werte enthalten. Bislang mache ich das wie folgt und es funktioniert:

Code:
SELECT  DISTINCT stpkl_1
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_1 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_2
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_2 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_3
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_3 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_4
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_4 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_5
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_5 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_6
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_6 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_7
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_7 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_8
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_8 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_9
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_9 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_10
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_10 IS NOT NULL

Der Befehl ist quasi 10mal derselbe aneinandergereiht, gibt es hierfür vielleicht eine Kurzschreibweise? UNION sollte nämlich laut SQL-Konvetion immer zwischen 2 SELECT-Abfragen stehen.
Dank im voraus!

Grüße Cappaja
 
PL/SQL - also Oracle.
Das einzige was ich gerade sehe, ist das du 'pruefspec = 83333' in einen WITH-Block setzt.
Ob es das schneller macht? Müsste man testen
SQL:
WITH mydata AS (
	-- TODO: Im Select die anderen stpkl auflisten
	SELECT  stpkl_1, stpkl_2, stpkl_3
	FROM    merkmaltab_daten_pruefspec
	WHERE   pruefspec = 83333 
)
SELECT  DISTINCT stpkl_1
FROM    mydata
WHERE   stpkl_1 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_2
FROM    mydata
WHERE   stpkl_2 IS NOT NULL
UNION
SELECT  DISTINCT stpkl_3
FROM    mydata
WHERE   stpkl_3 IS NOT NULL
-- TODO: Weitere hinzufügenm
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yaslaw,

vielen Dank für die Anregung, sofern man dem SQL Developer vertrauen kann benötigt deine vorgeschlagene Variante leider länger (93ms gegenüber 57ms).
Es scheint wohl keine andere Alternative zu geben, ich lass den Beitrag für heute mal noch geöffnet ansonsten hake ich ihn morgen als erledigt ab.

Vielen Dank und Grüße
 
Sind die einzelnen Spalten untereinander immer verschieden? Falls ja dann verwende UNION ALL. Falls nicht evtl. trotzdem UNION ALL, das ganze in eine inline view verpacken und dann nochmals ein SELECT DISTINCT darauf. Könnte evtl. schneller sein, da nicht jedes mal abgeglichen werden muss (natürlich kannst du dann die anderen distincts auch weglassen).

Ein Index auf pruefspec kann auch was bringen.

Ein Parallel hint wäre auch noch ein Versuch wert.
 
Zuletzt bearbeitet:
Die einzelnen Spalten können untereinander verschieden und gleich sein. Einen View kann ich leider nicht nutzen da die bestehende Datenbankarchitektur nicht verändert werden darf. Auf pruefspec habe ich bereits einen Index.

Parallel hint sagt mir auf anhieb jetzt nichts, werde ich mir aber bei Gelegenheit gerne ansehen, vielen Dank schonmal soweit.

Die Stored Procedure funktioniert jetzt im Ganzen auch soweit weswegen meine Frage als erledigt markiert wird.

Nochmals Danke für eure Mühen
 
view <> inline view

http://www.orafaq.com/wiki/Inline_view

Mein Vorschlag zielte auf sowas hier ab:

SQL:
SELECT DISTINCT col 
FROM (
SELECT  stpkl_1 as col
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_1 IS NOT NULL
UNION ALL
SELECT  stpkl_2 as col
FROM    merkmaltab_daten_pruefspec
WHERE   pruefspec = 83333 
AND     stpkl_2 IS NOT NULL
UNION ALL
...
)
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück