Sto lavorando a un'applicazione di tipo CRM (.NET, SQL Server) che deve generare report da set di dati di grandi dimensioni, milioni di righe di database in una dozzina di tabelle diverse con un sacco di aggregazione e logica. I report sono attualmente generati da lunghe e complicate stored procedure con molti join, tabelle temporanee e logica. Questi report devono seguire una specifica di terze parti e il modo in cui sono attualmente scritti spesso produce dati non corretti. Ci sono anche problemi di prestazioni in quanto i rapporti richiedono circa 10 volte più tempo di quanto dovrebbero. Mi trovo a dover riscrivere le stored procedure o trovare un altro modo di generare i report. Ho due requisiti principali, velocità e precisione.
SQL sembra la scelta migliore per la velocità. I dati sono relazionali e già esistono in un database. Lo svantaggio di SQL è che i report sono molto complessi e avere tutto in una o più query giganti rende difficile testare diversi pezzi della logica.
Effettuare i calcoli in C # sembra una scelta migliore per testabilità / accuratezza, ma non credo che funzionerebbe molto bene a causa dei requisiti di memoria e della natura lenta del codice procedurale.
Ciò che mi rende incline a una soluzione non SQL è che a volte i nostri clienti ritengono che i rapporti siano sbagliati quando si tratta davvero di dati personali sbagliati. I clienti spesso si aspettano che un record personale venga visualizzato in un report, ma in base alle regole del report il record non deve essere incluso in base ai valori di determinate colonne. Poiché la logica è così complessa e i nostri rapporti sono scritti in modo così grave, di solito non possiamo dire ai clienti che i loro dati sono negativi e perché fino a quando non trascorriamo un giorno o due per tracciare quel record attraverso la logica della query del report. Sarebbe bello se avessimo un motore di regole che potremmo eseguire su qualsiasi dato record per vedere esattamente quali colonne di dati stanno causando che vengano filtrate dal rapporto. Preferirei non implementare la logica del rapporto due volte, una volta nella query del report e di nuovo in un motore di convalida.
Qual è la scelta migliore qui? Esistono dei motori di regole che possono operare su dataset di grandi dimensioni? Non so molto dei big data, ma ho sentito parlare di map / reduce e Hadoop. Qualcosa del genere sarebbe d'aiuto? Che dire di un linguaggio funzionale come F #? Altre opzioni?