Ottenere RowCount senza sprecare risorse

0

Ho una query SQL di grandi dimensioni che mette in relazione 6-7 diverse tabelle e restituisce quattordici file diverse come set distinti, in un'unione con una query ugualmente grande, che a volte può restituire più di mille risultati.

Fortunatamente per noi, abbiamo la possibilità di restituire semplicemente i primi 100 risultati di tale query, che riduce significativamente il tempo di elaborazione.

Tuttavia, abbiamo anche bisogno di un conteggio esatto di quella query, che siamo riusciti a ottenere solo interrogando l'intero intero e quando raggiungiamo un rendimento maggiore set, fa sì che la nostra app si blocchi.

Questo è estremamente inefficiente, in cima al quale il vero problema è la nostra query di conteggio: fondamentalmente è la stessa esatta query, ma invece di restituire le righe distinte, è solo restituendo un conteggio di quelle righe!

Non possiamo filtrare le nostre tabelle oi nostri valori di ritorno - perché sono un insieme distinto, cambiano il conteggio delle righe. Ma non possiamo eseguire questa query due volte di fila solo per ottenere il numero di file che ci aspettiamo, con il conteggio delle righe che è più ingombrante delle due ogni volta.

Ci deve essere un modo migliore - come posso ottenere il mio SQL per restituire un conteggio delle righe di una query di grandi dimensioni, senza sprecare le risorse di tale query?

    
posta Zibbobz 08.03.2016 - 15:37
fonte

3 risposte

2

Se hai bisogno del conteggio preciso dei record, c'è poco che puoi fare se non eseguire effettivamente la stessa intera query. Il recupero dei dati non è probabilmente la parte più pesante della query, i join lo sono. (Se non fosse così, select count(*)... sarebbe veloce e lo useresti.)

Puoi velocizzare la query in vari modi. È difficile dire qualcosa senza vedere la query e il piano di query.

Se esiste un membro dei pesi massimi (o un gruppo di essi) che non dipende da (la maggior parte) del resto della query, è possibile creare una tabella ausiliaria con i risultati pre-calcolati e utilizzare invece il join. Probabilmente avrai bisogno di un trigger o di un processo batch per aggiornarlo o utilizzare una vista materializzata se il tuo DBMS li supporta.

Se la tabella delle subquery precalcata non viene aggiornata immediatamente con ogni aggiornamento delle tabelle coinvolte nella sottoquery, è possibile con il contenuto con i risultati approssimativi e ricalcolare i dati, ad es. una volta al minuto o una volta all'ora.

    
risposta data 08.03.2016 - 18:46
fonte
2

Se la query è una query predefinita che non richiede alcun parametro e i risultati non cambiano spesso, è possibile considerare di eseguirlo durante le ore non di punta e di memorizzare in cache il risultato da utilizzare in un secondo momento. Se si utilizzano i parametri e si recuperano set di risultati diversi, è possibile esaminare la query e verificare se siano presenti parti statiche e considerare la creazione della vista per incapsulare tali parti; un buon RDBMS memorizzerà nella cache i risultati della vista in modo da non dover ripetere di nuovo quelle parti della query. Se non riesci a fare nessuna di queste cose, allora il miglior consiglio che posso dare è di andare avanti e restituire tutti i risultati tutto il tempo e contare semplicemente le righe dal set di risultati. Almeno allora non devi eseguire la query due volte.

    
risposta data 08.03.2016 - 19:01
fonte
-4

Utilizza la funzione di aggregazione COUNT nella tua query.

SELECT COUNT(*) AS 'row_count', * FROM Table WHERE [...]

La funzione COUNT è standard nella maggior parte dei database SQL.

    
risposta data 08.03.2016 - 17:30
fonte

Leggi altre domande sui tag