Risoluzione dei problemi di prestazioni nelle configurazioni di ER
Questo articolo spiega come trovare e risolvere i problemi di prestazioni nelle configurazionidi Creazione di report elettronici (ER).
In genere, l'analisi delle prestazioni consiste in diversi passaggi.
- Raccolta dei dati.
- Analisi dei dati raccolti.
- Sulla base dei risultati dell'analisi, utilizzare le configurazioni ER per apportare modifiche oppure decidere di raccogliere più dati.
Risoluzione dei problemi
Analizzare il tempo di esecuzione
Il tempo di esecuzione può dipendere da fattori imprevedibili, quali altre attività in esecuzione nello stesso ambiente e la memorizzazione nella cache che utilizza i dati quando vengono chiamati per la prima volta. Pertanto, è necessario ripetere l'esecuzione e la misurazione più volte.
A volte, i problemi di prestazioni non sono causati da una configurazione del formato ER utilizzata per i rapporti. Sono invece causati dal codice X++ utilizzato per aprire quella configurazione del formato ER.
Osservare il tempo di esecuzione del report, riportato nel Centro azioni o nel registro eventi.
Confrontare il tempo di esecuzione del report con il tempo di esecuzione totale nello scenario.
Se il tempo di esecuzione del report è molto inferiore al tempo di esecuzione totale, considerare la quantità di dati elaborati dal report:
- Se il report elabora una piccola quantità di dati, il problema potrebbe riguardare il tempo di caricamento della configurazione.
- Se il report elabora una grande quantità di dati, il problema potrebbe riguardare la preelaborazione di X++. Usare il parser di traccia per analizzare questo caso.
Per altri casi, vedere le sezioni successive.
Eseguire più test che coinvolgono diverse quantità di dati per determinare in che modo il tempo di esecuzione dipende dalla quantità di dati.
Analizzare le tracce con il parser di traccia
Preparare un piccolo esempio o raccogliere diverse tracce durante le parti casuali della generazione del rapporto.
Quindi, nel parser di traccia, esegui un'analisi dal basso verso l'alto standard e rispondi alle seguenti domande:
- Quali sono i metodi migliori in termini di consumo di tempo?
- Quanta parte del tempo totale utilizzano questi metodi?
Rispondere alle stesse domande per le query.
Se si nota che i metodi sono preceduti dal prefisso "ER", passare alla sezione successiva.
Se i metodi o le query hanno avuto origine nella suite di applicazioni, prendere in considerazione le ottimizzazioni generiche (ad esempio la creazione di indici).
Analizzare il numero di chiamate. Se il numero è significativamente più alto del previsto, prendere in considerazione la memorizzazione nella cache dei nodi corrispondenti della configurazione.
Analizzare le chiamate al database
Preparare un esempio che contenga una piccola quantità di dati, in modo da poter raccogliere una traccia ER.
Quindi, aprire la traccia nella soluzione di progettazione del mapping del modello ER e guardare in fondo alla pagina. Rispondere alle seguenti domande:
C'è una duplicazione della query? In caso affermativo, considerare una delle seguenti correzioni:
- Usare la memorizzazione nella cache se si pensa che ci siano più chiamate all'interno di un unico record padre.
- Usare un campo calcolato memorizzato nella cache e parametrizzato se si pensa che ci siano chiamate allo stesso record all'interno di record diversi.
- Usare un'origine dati JOIN se occorre leggere un numero elevato di record diversi da un database.
Il numero di query e record recuperati corrisponde alla quantità complessiva di dati? Ad esempio, se un documento ha 10 righe, le statistiche mostrano che il report estrae 10 righe o 1.000 righe? Se si dispone di un numero considerevole di record recuperati, prendere in considerazione una delle seguenti correzioni:
- Utilizzare la funzione FILTER invece della funzione WHERE per elaborare dati sul lato Microsoft SQL Server.
- Utilizzare la memorizzazione nella cache per evitare di recuperare gli stessi dati.
- Utilizzare le funzioni dei dati raccolti per evitare di recuperare gli stessi dati per il riepilogo.
Analizzare le tracce di PerfView
PerfView è uno strumento per sviluppatori esperti. Per informazioni più dettagliate sui seguenti passaggi, vedere Nozioni di base sull'indagine in tempo reale.
Raccogliere una traccia utilizzando il tempo di thread.
Includere solo gli stack che usano runUnattended, per filtrare solo il thread che ha l'esecuzione della configurazione. (Aggiungere runUnattended alla casella di input IncPats.)
Ridurre tutta la CPU, la rete e il tempo bloccato.
Caricare le impostazioni ER predefinite per PerfView.
Selezionare ER>Altre impostazioni predefinite.
Guardare i nomi:
Probabilmente verrà mostrato il codice della piattaforma che consuma più tempo.
È possibile toccare due volte (o fare doppio clic) ed esaminare l'elenco callees.
Se si trovano classi con il prefisso "ERExpression" e se queste sono funzioni correlate a formule, è possibile inferire il nome della funzione in base al nome della classe e guardare il repository ER per visualizzare gli attributi.
Correzioni
Se si nota che la maggior parte del tempo della CPU viene consumato dalle query, provare a ridurre il numero di query:
- Rivedere la traccia ER per query duplicate.
- Guardare quanti record vengono recuperati e valutare quanti dati dovrebbero essere teoricamente recuperati.
Se la maggior parte del tempo della CPU viene consumato dalle funzioni utilizzate, provare a trovare il punto nella configurazione che utilizza la maggior parte delle risorse.
Se la maggior parte del tempo della CPU viene consumato dalle funzioni di raccolta dati, considerare la possibilità di sostituirle con SQL group by sul lato di mapping del modello.
Raccolta dei dati
A seconda dell'ambiente, esistono diversi modi per raccogliere i dati disponibili:
Ottenere il tempo di esecuzione totale:
- Dal Centro azioni
- Dal registro degli eventi
Creare un profilo per l'esecuzione:
- Usando gli strumenti ER
- Usando il parser di traccia
- Usando PerfView
Raccolta dei dati in un ambiente di produzione
A volte, i problemi possono essere riprodotti solo in un ambiente di produzione. I dati possono essere raccolti in uno dei modi indicati di seguito:
- Usando le tracce del parser di traccia
- Usando le tracce dell'esecuzione ER
- Usando il tempo di esecuzione totale
Raccolta dei dati in un ambiente di sviluppo
Oltre agli strumenti che possono essere utilizzati in un ambiente di produzione, esistono diversi strumenti che è possibile utilizzare in un ambiente di sviluppo:
- Registro eventi (Microsoft-Dynamics-ElectronicReporting). Questo registro può fornire il tempo di esecuzione totale.
- Strumenti .NET comuni, come PerfView.
Inoltre, un ambiente di sviluppo offre maggiore flessibilità per sperimentare. Ad esempio, è possibile disattivare parti dei report per vedere come viene influenzato il tempo di esecuzione.
Strumenti
Tempo di esecuzione nel Centro azioni
ER può mostrare il tempo di esecuzione della configurazione nel Centro azioni. Questa opzione funziona solo per un utente specifico e un'azienda specifica e solo per sessioni interattive. Per rendere disponibile questa funzione, seguire questi passaggi.
- Vai a Amministrazione organizzazione>Creazione di report elettronici>Configurazioni.
- Nella pagina Configurazioni, nel Riquadro azioni, nella scheda Configurazioni, nel gruppo Impostazioni avanzate, selezionare Parametri utente.
- Nella finestra di dialogo Parametri utente, impostare l'opzione Mostra tempo di generazione file su Sì.
Tempo di esecuzione nel registro eventi
- Aprire il visualizzatore eventi di Windows.
- In Registri applicazioni e servizi, aprire Microsoft-Dynamics-ElectronicReporting/Operativo.
- Cercare gli eventi FormatMapingRun in cui EventID=2, poiché questi eventi contengono informazioni sul tempo trascorso.
Tracce del parser di traccia
Poiché ER è implementato in X++, è possibile usare strumenti X++ comuni per analizzare le prestazioni. Per ulteriori informazioni, vedere Acquisire le tracce usando il parser di traccia.
Esistono alcune limitazioni a questo approccio. Poiché parte di ER è implementata in C#, non tutti i dettagli saranno disponibili. Tuttavia, è possibile visualizzare i dettagli sull'utilizzo dei dati. Inoltre, lunghe esecuzioni di report possono superare i limiti di archiviazione delle tracce.
Tracce ER
ER è in grado di raccogliere le proprie tracce e dispone di strumenti di visualizzazione e analisi per tali tracce. Per altre informazioni, vedi Tenere traccia dell'esecuzione dei formati di creazione di report elettronici per risolvere i problemi di prestazioni.
PerfView
Poiché sia X++ che ER sono implementati sulla piattaforma .NET, è possibile usare strumenti .NET comuni. Ad esempio, puoi utilizzare lo strumento gratuito PerfView.
È anche possibile raccogliere dati dalla riga di comando. Ad esempio, lo script di Windows PowerShell seguente raccoglie il tempo di esecuzione fino all'interruzione dell'esecuzione di qualsiasi formato nel computer.
c:\programs\PerfView collect "e:\traces\$(date -format "ddMMyyyy_hhmm").etl" `
-CircularMB:20000 -ThreadTime `
-NoNGenRundown `
-StopOnEtwEvent:Microsoft-Dynamics-ElectronicReporting/FormatMappingRun/Stop
Esistono alcune limitazioni a questo approccio. È necessario disporre dell'accesso al computer. Inoltre, occorre essere uno sviluppatore esperto, perché la curva di apprendimento è particolarmente ripida.
Apportare modifiche
Usare la memorizzazione nella cache
Sebbene la memorizzazione nella cache riduca la quantità di tempo necessaria per recuperare nuovamente i dati, ha un costo significativo in termini di memoria. Usare la memorizzazione nella cache nei casi in cui la quantità di dati recuperati non è molto grande. Per ulteriori informazioni e un esempio che mostra come utilizzare la memorizzazione nella cache, vedere Migliorare il mapping del modello in base alle informazioni della traccia di esecuzione.
Ridurre il volume dei dati recuperati
È possibile ridurre il consumo di memoria per la memorizzazione nella cache limitando il numero di campi nei record di una tabella dell'applicazione che si recupera in fase di esecuzione. In questo caso, recupererai solo quei valori di campo di una tabella dell'applicazione di cui hai bisogno nel mapping di modello ER. Gli altri campi in quella tabella non verranno recuperati. Pertanto, il volume di memoria necessario per memorizzare nella cache i record recuperati viene ridotto. Per ulteriori informazioni, vedi Migliorare le prestazioni delle soluzioni ER riducendo il numero di campi della tabella recuperati in fase di esecuzione.
Usare un campo calcolato memorizzato nella cache e parametrizzato
A volte, i valori devono essere cercati ripetutamente. Gli esempi includono nomi di account e numeri di conto. Per risparmiare tempo, è possibile creare un campo calcolato con parametri al livello più alto, quindi aggiungere il campo alla cache.
Si consiglia di utilizzare questo approccio solo quando la dimensione dei dati memorizzati nella cache è ridotta. Per ulteriori informazioni, vedere Migliorare le prestazioni delle soluzioni ER aggiungendo origini dati CAMPO CALCOLATO parametrizzate.
Usare un'origine dati JOIN
Un'origine dati JOIN permette di recuperare più record connessi tramite un'unica query. Non è necessario utilizzare una query separata per recuperare ogni record connesso. Ad esempio, se si dispone di 1.000 righe e si recuperano i dati dell'articolo per ogni riga per relazione, si avranno 1.001 query (= 1.000 + 1). Se si usa un'origine dati JOIN, sarà sufficiente un'unica query per recuperare gli stessi dati. Per maggiori informazioni, vedere Usare le origini dati JOIN nei mapping di modello ER per ottenere dati da più tabelle dell'applicazione.
Usare la funzione FILTER anziché la funzione WHERE
La funzione FILTER esegue condizioni su SQL Server, mentre la funzione WHERE recupera tutti i dati dall'elenco, un record alla vota, e applica la condizione per ciascun record. Ad esempio, si desidera selezionare un record su 1.000 record. Se si usa WHERE, verranno recuperati tutti i 1.000 record. Se invece si usa FILTER, verrà recuperato un singolo record. FILTER può anche usare gli indici sul lato database.
Utilizzo delle funzioni dei dati raccolti o di un'origine dati accumulata
Se la configurazione ha un componente group by che riepiloga i dati precedentemente recuperati per report, il componente recupererà nuovamente tutti i dati. Utilizzando le funzioni dei dati raccolti, si abilite ER ad accumulare dati durante il primo recupero. Per ulteriori informazioni, vedere Configurare il formato ER per eseguire il conteggio e la sommatoria.
Riscrivere parti della configurazione in X++
ER supporta i metodi di chiamata di tabelle e classi, incluse le estensioni. Considerare la possibilità di riscrivere parti del mapping del modello in X++ per migliorare le prestazioni.
ER può utilizzare dati dalle seguenti origini:
- Classi (origini dati oggetto e classe)
- Tabelle (origini dati tabella e record di tabella)
L'API ER fornisce inoltre un modo per inviare dati precalcolati dal codice chiamante. La suite di applicazioni contiene numerosi esempi di questo approccio.