Author Archives: Robert Haken

avatar Neznámé

About Robert Haken

Software Architect, Founder at HAVIT, Microsoft MVP - ASP.NET/IIS

GIT prakticky [Martin Havel, HAVIT Vzdělávací okénko 1.2.2018]

Záznam ze Vzdělávacího okénka HAVIT z 1.2.2018. Je publikován na našem HAVIT YouTube Channelu. Téma prezentoval Martin Havel.

Azure AppService, Storage, SQL – Tips, Tricks – záznam, slides a dema [ShowIT 2/2018]

Záznam z přednášky pro konferenci ShowIT Bratislava z 1.2.2018. Je publikován na našem HAVIT YouTube Channelu.

Dotčená témata

  • Azure AppService Deployment
  • Azure AppService Configuration
  • Azure AppService Diagnostics
    • Remote Debugging
    • Log Streaming
    • Profiling
    • KUDU, Memory Dumps
  • Azure SQL
    • Elastic Pool, DTU, eDTU
    • Performance Insights (Query Store, Automatic Tuning)
  • DateTime.Now, WEBSITE_TIME_ZONE

Visual Studio a C# vNext – záznamy, dema [G2B TechEd Brno, ShowIT Bratislava, 01/2018]

Záznamy stejné přednášky z konferencí G2B TechEd Brno a ShowIT Bratislava.

Brněnská verze z 30.1.2018 se musela vmáčknout do 45 minut:

Bratislavská verze z 31.1.2018 měla prostor 70 minut:

Záznamy jsou uloženy na našem HAVIT YouTube Channelu.

Dotčená témata:

Materiály z přednášky:

Agilní metodika a TFS [Daniel Hrubý, HAVIT Vzdělávací okénko 25.1.2018]

Záznam z interního vzdělávacího okénka HAVIT z 25.1.2018 je publikován na našem HAVIT YouTube Channel. Téma prezentoval Daniel Hrubý.

Pravidelné zasílání reportů [Jiří Kanda, HAVIT Vzdělávací okénko, 18.1.2018]

Záznam z interního vzdělávacího okénka HAVIT z 18.1.2018, je publikován na našem HAVIT YouTube Channel. Téma prezentoval Jiří Kanda.

Visual Studio Code [Pavel Kříž, HAVIT Vzdělávací okénko 11.1.2018]

Záznam z interního vzdělávacího okénka HAVIT z 11.1.2018 je publikován na našem HAVIT YouTube Channel. Téma prezentoval Pavel Kříž.

Modulární CSS – záznam [Vít Heřman, HAVIT Vzdělávací okénko 4.1.2018]

Záznam z interního vzdělávacího okénka HAVIT z 4.1.2018 je publikován na našem HAVIT YouTube Channel. Téma prezentoval Vít Heřman.

Dotčená témata:

  • CSS Zen Garden
  • Klasický přístup k CSS vs. Modulární přístup
  • OOCSS – Object Oriented CSS

Perly z codereview [Jiří Kanda, HAVIT Vzdělávací okénko 21.12.2017]

Záznam z interního vzdělávacího okénka HAVIT ze 21.12.2017 je publikován na našem HAVIT YouTube Channel. Téma prezentoval Jiří Kandal:

 

Jak jsme psali jednu stránku dva měsíce, aneb můj výlet do světa Javascriptu – promítání s diapozitivy [Martin Havel, HAVIT Vzdělávací okénko 13.12.2017]

Záznam z interního vzdělávacího okénka HAVIT ze 13.12.2017 je publikován na našem HAVIT YouTube Channel. Téma prezentoval Martin Havel:

Dotčená témata:

  • React
  • Flow
  • ImmutableJS
  • Moment

Poznámka: Část prezentace (ukázka výsledku práce) byla z důvodu ochrany zákazníka ze záznamu vystřižena.

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