Die Aufteilung könnte wie folgt aussehen ...

Dieses (eigentlich sehr simple) SQL kann auf Grund von riesen Datenmengen und entsprechte auswahlkriterien der Key-Felder enorm lang dauern:
Code:
SELECT * FROM TAB1
WHERE (SP1 = 'XXXX' OR SP2 = 'YYY') 
AND SP3 <> '1'
AND SP3 <> '2' 
AND SP4 <> 'M' 
ORDER BY SP5 DESC
FETCH FIRST 102 ROWS ONLY
Mit einer Aufteilung kann die DB die Anfrage besser verarbeiten und diverse Indices gezielt, und vor allem auch Parallel, verarbeiten:
Code:
WITH p AS (
SELECT id FROM TAB1 
WHERE SP1 = 'XXXX' 
AND SP3 <> '1' 
AND SP3 <> '2' 
AND SP4 <> 'M' ),
 
v AS (
SELECT id FROM TAB1 
WHERE SP2 = 'YYY' 
AND SP3 <> 'L' 
AND SP3 <> 'S' 
AND SP3 <> '1' ) ,
 
a AS (
SELECT id FROM 
    (SELECT id FROM  p 
     Order By SP5 Desc 
     FETCH FIRST 102 ROWS ONLY) T1
UNION
SELECT id FROM 
    (SELECT id FROM v 
     Order By SP5 Desc 
     FETCH FIRST 102 ROWS ONLY) T2
)
 
SELECT * FROM TAB1 WHERE id IN (SELECT id FROM a)
Order By SP5 Desc
FETCH FIRST 102 ROWS ONLY;
Es sieht zunächst mal etwas viel aus, ist es aber im grunde nicht.
Und ein weiterer Vorteil mit WITH ist, dass du jede Abfrage einzeln testen und optimieren kannst.
Sicher gibt es auch noch andere Möglichkeiten, diese hat für mich jedoch perfekt geklappt.

lg Andreas