è una stored procedure con più UNION efficienti rispetto all'esecuzione di tutti gli SQL in parallelo?

1

Ho sotto il mio stored proc

if
 then

    SELECT TABLE1.COLUMN1,TABLE1.COLUMN2,TABLE1.COLUMN3,TABLE1.COLUMN4 FROM TABLE1,TABLE2 where criteria1 (covers functionality 1)
    UNION
    SELECT TABLE1.COLUMN1,TABLE1.COLUMN2,TABLE1.COLUMN3,TABLE1.COLUMN4 FROM TABLE1,TABLE3 where criteria2 (covers functionality 2)
    UNION
    SELECT TABLE1.COLUMN1,TABLE1.COLUMN2,TABLE1.COLUMN3,TABLE1.COLUMN4 FROM TABLE1,TABLE4 where criteria3 (covers functionality 3)
elseif
 then

    SELECT TABLE1.COLUMN1,TABLE1.COLUMN2,TABLE1.COLUMN3,TABLE1.COLUMN4 FROM TABLE1,TABLE5 where criteria4 (covers functionality 4)
    UNION
    SELECT TABLE1.COLUMN1,TABLE1.COLUMN2,TABLE1.COLUMN3,TABLE1.COLUMN4 FROM TABLE1,TABLE6 where criteria5 (covers functionality 5)
    UNION
    SELECT TABLE1.COLUMN1,TABLE1.COLUMN2,TABLE1.COLUMN3,TABLE1.COLUMN4 FROM TABLE1,TABLE7 where criteria6 (covers functionality 6)

è una buona idea eseguire questi SQL separatamente (in parallelo) e poi mettere i risultati in set (per ottenere solo univoci)?

Voglio capire teoricamente è una buona idea o c'è qualcosa che non sono in grado di vedere adesso?

Poiché le SQL sono separate, la stored procedure DB2 internamente potrebbe essere già in esecuzione in parallelo.

    
posta Vipin 24.04.2016 - 08:10
fonte

4 risposte

4

Esecuzione delle query in parallelo dall'applicazione e quindi la combinazione dell'output non sarà mai così veloce come eseguire una query sintonizzata dal database.

Esegui il lavoro dove è più appropriato

I motori di database sono progettati e ottimizzati per funzionare con set di dati. Certamente alcuni motori di database sono più efficienti di altri, ma questo è il loro compito principale. Semplicemente usando un riferimento a chiave esterna, il tuo database può aumentare le prestazioni collegando due tabelle (unendole) di più ordini di grandezza.

Anche quando puoi mostrarmi qualcosa che viene eseguito più rapidamente sul client rispetto al database, dovrai comunque calcolare il tempo necessario per spostare i dati lungo la pipe della rete. È ingenuo spostare i record 100K sul client solo per filtrarlo fino al 1 o 2 di cui hai bisogno.

L'invio di grandi serie di dati attraverso la rete influenzerà negativamente anche le prestazioni di altre applicazioni che utilizzano la rete.

    
risposta data 24.04.2016 - 20:49
fonte
0

Poiché tutti i tuoi dati provengono dalla stessa tabella, questo è uno strano uso di unione.

Potresti invece fare una singola selezione con un'istruzione Where più complicata.

Ora! se uno è più performante dell'altro credo dipenda dalla clausola where.

Non sono sicuro di come intendi eseguirli a Parralell? chiamarli dal codice e iterare i risultati? Questo sarà più scalabile se si sta eseguendo il codice su un server diverso nel database

    
risposta data 24.04.2016 - 11:20
fonte
0

Per quanto riguarda le prestazioni, si otterrà la corsa parallela meglio, ma a livello di codice potrebbe essere meglio mettere tutto nello stored procedure in un sindacato.

In futuro se hai bisogno di una modifica (ad esempio un aggiornamento dei dati recuperati accedendo ad un'altra tabella) o di altri 3-4 aggiunti alla query. Ora dovrai refactoring il tuo codice che chiama pesantemente la stored procedure / query.

    
risposta data 24.04.2016 - 11:47
fonte
0

Credo che l'utilizzo di un singolo SELECT con una clausola WHERE più complessa sia un'alternativa migliore, in termini di design.

Mi aspetto anche che, un po 'per caso, l'approccio UNION sia più lento perché il database deve eliminare i duplicati. Se invece stessi utilizzando UNION ALL , non sarei in grado di indovinare quale alternativa avrebbe prestazioni migliori (dovrei misurarla).

    
risposta data 24.04.2016 - 12:10
fonte

Leggi altre domande sui tag