Záznam ze Vzdělávacího okénka HAVIT z 9. května 2019, kde Jiří Kanda povídal o Azure Blob Storage a Azure CDN (Content Delivery Network).
Tag Archives: Performance
Span a jeho příbuzní [Martin Havel, HAVIT Vzdělávací okénko, 7.3.2019]
Záznam ze Vzdělávacího okénka HAVIT ze 7. března 2019, kde Martin Havel ukazoval nové způsoby efektivní práce s pamětí v .NET Core.
- Span<T>
- Memory<T>
- ref struct
- stackalloc
- Encoding.UTF8 / Utf8Parser
- MemoryMarshal
- ArrayPool<T>
- BenchmarkDotnet
Nahrávka je publikována na našem HAVIT YouTube Channelu.
Optimalizace výkonu [ASP].NET + profiling – záznam, slides a dema [Robert Haken, ShowIT SK 2019]
Záznam z mého vystoupení pro ShowIT Bratislava ze 6. února 2019.
Slides a dema:
Dotčená témata:
- Premature optimisation
- <compilation debug=“true“/>
- Data Structures – List, Sorted Arrray (Binary Search), Dictionary, Hashtable, Lookup
- String Concatentation vs. StringBuilder (Garbage Collection, Large Object Heap)
- Visual Studio Diagnostic Tools – CPU Profiling, Memory Usage
- Profiling – Instrumentation vs. Sampling
- Visual Studio Performace Profiler
- ANTS Performance Profiler
- PerfView
- Windows Performance Analyzer, Windows Performance Recorder
- Web Applications Caching
- Data Caching
- Output Caching
Nahrávka je publikována na našem HAVIT YouTube Channelu.
SQL: Datum poslední aktualizace statistik indexu
Jednoduchým dotazem se dá zjistit, kdy došlo k poslední aktualizaci statistik indexu (SQL si nepamatuje poslední rebuild indexu, ale tohle je taková odpovídající hodnota):
SELECT
o.name AS TableName,
i.name AS IndexName,
STATS_DATE(i.object_id, i.index_id) AS StatisticsUpdate
FROM sys.objects o
INNER JOIN sys.indexes i ON (o.object_id = i.object_id)
WHERE
(i.type > 0)
AND (o.type_desc NOT IN ('INTERNAL_TABLE', 'SYSTEM_TABLE'))
ORDER BY TableName, IndexName
-- ORDER BY StatisticsUpdate
Viz též:
Profiling výkonu a paměti [Update Days: Legacy Apps 05/2018]
Dema z mé přednášky pro Update Days: Legacy Apps z 29. května 2018:
- https://github.com/hakenr/PerformanceTuningDemos
- https://github.com/hakenr/Performance_Sessions_Demo
Záznam z přednášky je publikován na našem HAVIT YouTube Channel.
Prezentované nástroje:
- Visual Studio – Diagnostic Tools (Debug)
- Visual Studio – Performance Profiler – CPU, Memory Allocations
- Red Gate ANTS Performance Profiler
- CLR Profiler
- Glimpse
- PerfView
- Windows Performance Recorder + Analyzer
- DebugDiag
Optimalizace SQL dotazů [Robert Haken, FreshIT, 27.3.2018]
Záznam z přednášky pro konferenci FreshIT Praha z 27.3.2018. Je publikován na našem HAVIT YouTube Channelu.
Materiály
- 2018-03-27 – FreshIT – Optimalizace SQL dotazů.pdf – slides
- SqlQueryOptimization – dema v GitHub repository
- AdventureWorks – databáze použitá v ukázkách
Dotčená témata
- SQL Optimalizace
- Zacílení optimalizace
- Connection Pooling
- Cachování
- DB Schema
- Heap
- Clustered Index, Non-Clustered Index
- Execution Plans
- Statistiky
- Table Scan, Index Scan, Index Seek, Lookup
- Merge Join, Hashmatch, Nested Loops
- Parameter Sniffing
- Porovnávání dle data
a další…
SQL Query Store: Porovnání dvou období (počty spuštění dotazů, trvání)
Query Store je užitečnou novinkou v Azure SQL, resp. Microsoft SQL Server 2016+. Ukládá užitečné statistiky o spuštěných dotazech, jejich execution planech a mnoho dalšího. (Umí dokonce vynutit používání konkrétního execution planu a dokonce toto řešit automaticky, pokud detekuje výkonovou regresi. O tom ale někdy jindy.)
Jeden ze scénářů, který vám může být užitečný, je porovnání dvou období co se počtu spuštění jednotlivých dotazů týče, jejich průměrné doby trvání, atp. Hodit se to může při nenadálých poklesech výkonnosti, po nasazení nových verzí aplikací, atp.:
DECLARE @Period1Start datetime, @Period1End datetime, @Period2Start datetime, @Period2End datetime SET @Period1Start = '20171212 00:00' SET @Period1End = '20171213 00:00' SET @Period2Start = '20171214 00:00' SET @Period2End = '20171215 00:00' ;WITH period1 AS ( SELECT query_id, AVG(avg_duration) AS avg_duration, SUM(count_executions) AS count_executions_total FROM sys.query_store_runtime_stats INNER JOIN sys.query_store_runtime_stats_interval ON (query_store_runtime_stats_interval.runtime_stats_interval_id = query_store_runtime_stats.runtime_stats_interval_id) INNER JOIN sys.query_store_plan ON query_store_plan.plan_id = query_store_runtime_stats.plan_id WHERE (sys.query_store_runtime_stats_interval.start_time >= @Period1Start) AND (sys.query_store_runtime_stats_interval.end_time <= @Period1End) GROUP BY query_id ), period2 AS ( SELECT query_id, AVG(avg_duration) AS avg_duration, SUM(count_executions) AS count_executions_total FROM sys.query_store_runtime_stats INNER JOIN sys.query_store_runtime_stats_interval ON (query_store_runtime_stats_interval.runtime_stats_interval_id = query_store_runtime_stats.runtime_stats_interval_id) INNER JOIN sys.query_store_plan ON query_store_plan.plan_id = query_store_runtime_stats.plan_id WHERE (sys.query_store_runtime_stats_interval.start_time >= @Period2Start) AND (sys.query_store_runtime_stats_interval.end_time <= @Period2End) GROUP BY query_id ) SELECT query_store_query.query_id, period1.avg_duration AS period1_avg_duration, period2.avg_duration AS period2_avg_duration, CASE WHEN period1.count_executions_total IS NOT NULL THEN (period2.avg_duration - period1.avg_duration) * 100.0 / period1.avg_duration ELSE NULL END AS avg_duration_increase_percent, period1.count_executions_total AS period1_count_executions_total, period2.count_executions_total AS period2_count_executions_total, CASE WHEN period1.count_executions_total IS NOT NULL THEN (period2.count_executions_total - period1.count_executions_total) * 100.0 / period1.count_executions_total ELSE NULL END AS count_execution_increase_percent, query_sql_text FROM period2 LEFT JOIN period1 ON period1.query_id = period2.query_id LEFT JOIN sys.query_store_query ON query_store_query.query_id = period2.query_id LEFT JOIN sys.query_store_query_text ON query_store_query_text.query_text_id = query_store_query.query_text_id --ORDER BY period2.count_executions_total DESC ORDER BY count_execution_increase_percent DESC --ORDER BY avg_duration_increase_percent DESC
References
[ASP].NET Worst Practices – záznam, slides a dema [MS Fest Brno 03/2017]
Slides a dema z mé přednášky pro konferenci MS Fest Brno z 19.3.2017:
- Dema – Performance tuning – github.com/hakenr/PerformanceTuningDemos
- Alternativní demo – Caching na ASP.NET Core – github.com/hakenr/AspNetCoreCachingDemo
- Dema – ASP.NET Sessions – github.com/hakenr/Performance_Sessions_Demos
- Dema – Overposting – github.com/hakenr/ModelBindingMassAssignment
- Dema – Do not trust web clients (ASP.NET Core) – github.com/hakenr/DoNotTrustWebClient
- 2017-03-19 – MS Fest Brno – [ASP].NET Worst Practices.pdf
Záznam z přednášky je publikován na našem HAVIT YouTube Channel.
Dotčená témata
- skládání stringů vs. StringBuilder
- vyhledávání v datech – List vs. BinnarySearch vs. Dictionary vs. LINQ ToLookup()
- ASP.NET Sessions
- ASP.NET Over-posting / Mass-assignment
- Nevěřte vstupu od klientů
ASP.NET Performance Tuning – záznam, slides a dema [TechEd 05/2016]
5lides a dema z mé přednášky pro TechEd DevCon Praha ze 19.5.2016:
- 2016-05-19 – TechEd – ASP.NET Performance Tuning – slides [PDF]
- ASP.NET Core Caching dema na GitHub [online]
- ASP.NET Performance Tuning – dema [ZIP, 2MB]
Záznam z přednášky je publikován na našem HAVIT YouTube Channel.
Dotčená témata
- ASP.NET Sessions, tinyget.exe
- PerfView
- ANTS Performance Profiler
- String Concatenation – skládání řetězců vs. StringBuilder
- vyhledávání List<T>, Dictionary<TKey, TValue>, ToLookup(), BinnarySearch()
- Reflection, dynamic
- SQL Server Database Management Views [DMV]
- ASP.NET Data Caching (demo ASP.NET Core)
- ASP.NET Output Caching (demo ASP.NET Core)
[ASP].NET Performance Tuning – záznam, slides a dema [ShowIT SK 02/2016]
Slides a dema z mé přednášky pro konferenci Gopas ShowIT Bratislava z 9.2.2016:
- 2016-02 – ShowIT SK – [ASP].NET Performance Tuning – slides [PDF]
- 2016-02 – ShowIT SK – [ASP].NET Performance Tuning – Dema [ZIP, 372 KB]
Záznam z přednášky je publikován na našem HAVIT YouTube Channel.
Dotčená témata
- ASP.NET Sessions
- skládání stringů vs. StringBuilder
- vyhledávání v datech – List vs. BinnarySearch vs. Dictionary vs. LINQ ToLookup()
- reflexe + dynamic
- ASP.NET Data Cache + Output Cache
- SQL DMVs
- YSlow