(ASP.NET) Come si va sulla creazione di un contatore in tempo reale, che tiene traccia delle modifiche del database?

StackOverflow https://stackoverflow.com/questions/1072067

Domanda

Ecco il problema.

In un sito Recentemente ho preso su di esso tracce "miglia" si corse in un giorno. Quindi, un utente può accedere al sito, aggiungere che correvano 5 miglia. Questo viene poi aggiunto al database.

Alla fine della giornata, intorno 01:00, viene eseguito un servizio che calcola tutte le miglia, tutti gli utenti corse nel corso della giornata e le uscite di un file di testo da App_Data. Questo file di testo viene quindi visualizzato in Flash nella home page.

Credo che questo è una specie di ridicolo. Mi è stato detto che dovevano fare questo a causa di problemi di prestazioni di massa. Non mi dirà esattamente come stavano facendo prima o qual è il problema maggiore performance è stata.

Allora, cosa approccio sarebbe voi ragazzi prendere? La prima cosa che mi è venuta in mente era un servizio web che ottiene i dati tramite una chiamata AJAX. Forse ogni volta che viene aggiunta una nuova voce "miglio", un trigger viene licenziato e aggiorna la tabella "GlobalMiles".

Ti sarei grato qualsiasi info o suggerimenti su questo.

Grazie mille!

È stato utile?

Soluzione

Rispondere a questa domanda è un po 'difficile dato che ci non conosciamo tutte le vostre esigenze e qualcosa non ha funzionato prima. Così qui sono alcune idee diverse.

Per prima cosa, rivedere le vostre ipotesi. Generazione di un report statico una volta al giorno è una soluzione perfettamente valida se tutto ciò che serve è report giornalieri. Perché colpire il database più volte throghout il giorno, se tutto ciò che serve è una fotografia (per esempio, un sacco di blog software utilizzato per scrivere i file html quando un blog è stato postato piuttosto che servire la voce dal database ogni volta - molti ancora lo fanno come ottimizzazione). È il "tempo reale" caratteristica qualcosa si sta aggiungendo?

Non vorrei saltare a AJAX subito. Utilizzare lo stesso metodo di input, basta spostare il rapporto da statico a dinamico. Facendo troppo in una volta è un buon modo per farti sepolto. Quando si modifica il codice esistente cerco di trovare le aree che posso cambiare in isolamento wih la minor quantità di impatto al resto dell'applicazione. Poi una volta che hai il rapporto dinamico quindi è possibile aggiungere AJAX (e vi prego di usare progressiva valorizzazione ).

Per quanto riguarda il rapporto dinamico in sé avete alcune opzioni.

Naturalmente si può basta selezionare SUM (), ma suona come che potrebbe causare i problemi di prestazioni se ogni utente ha un gran numero di voci.

Se il database supporta, vorrei guardare utilizzando un vista indicizzata (a volte chiamato una vista materializzata). Esso dovrebbe sostenere permette aggiornamenti veloci al data somma in tempo reale:

CREATE VIEW vw_Miles WITH SCHEMABINDING AS 
SELECT SUM([Count]) AS TotalMiles, 
COUNT_BIG(*) AS [EntryCount],
UserId
FROM Miles
GROUP BY UserID
GO
CREATE UNIQUE CLUSTERED INDEX ix_Miles ON vw_Miles(UserId)

Se il sovraccarico di che è troppo, la soluzione @ di jn29098 è una buona volta. Roll it up utilizzando un'operazione pianificata. Se ci sono un sacco di voci per ogni utente, si poteva solo aggiungere il delta dall'ultima volta che l'operazione è stata eseguita.

UPDATE GlobalMiles SET [TotalMiles] = [TotalMiles] + 
  (SELECT SUM([Count]) 
    FROM Miles 
    WHERE UserId = @id 
      AND EntryDate > @lastTaskRun
    GROUP BY UserId)
WHERE UserId = @id

Se non si cura di memorizzazione delle singole voci, ma solo il totale è possibile aggiornare il conteggio al volo:

UPDATE Miles SET [Count] = [Count] + @newCount WHERE UserId = @id

È possibile utilizzare questo metodo in combinazione con lo SPROC che aggiunge la voce e hanno entrambi i mondi.

Infine, il metodo di innesco avrebbe funzionato pure. E 'un'alternativa alla vista indicizzata dove si fa l'aggiornamento da soli su un tavolo instad di SQL farlo automaticamente. E 'anche simile all'opzione precedente in cui si sposta l'aggiornamento globale fuori dalla sproc e in un trigger.

Le ultime tre opzioni rendono più difficile gestire la situazione quando una voce viene rimossa, anche se questo non è una caratteristica della vostra applicazione, allora potrebbe non essere necessario preoccuparsi di questo.

Ora che hai materializzato, dati in tempo reale nel database ora è possibile generare dinamicamente il rapporto. Quindi è possibile aggiungere fantasia con AJAX.

Altri suggerimenti

Se sono veramente avendo problemi di prestazioni a causa di molte visite per il database allora suggerisco che si prende tutti gli input e stipare in una coda di messaggi (MSMQ). Poi si può avere un servizio su l'altra estremità che raccoglie i messaggi e fa un inserimento di massa dei dati. In questo modo si ha un minor numero di colpi db. Poi si può produrre il file di testo sul aggiornamento troppo.

Vorrei creare una tabella riassuntiva che è arrotolato una volta / ora o notte che calcola miglia di funzionamento totale. Per le singole richieste si potrebbe estrarre dalla tabella riassuntiva notte più eventuali miglia percorse supplementari per il periodo compreso tra l'ultimo calcolo cumulativo e quando l'utente visualizza la pagina per ottenere il totale per l'utente.

Quanti utenti stai parlando e quante registro record al giorno?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top