Záznam z přednášky pro konferenci SQL Server Bootcamp 2020, kterou pořádalo sdružení WUG Česká Republika ve dnech 12. a 13. září 2020
https://github.com/hakenr/SqlInjectionDemo
https://github.com/hakenr/SqlConnectionPoolingDemo
Záznam z přednášky pro konferenci SQL Server Bootcamp 2020, kterou pořádalo sdružení WUG Česká Republika ve dnech 12. a 13. září 2020
https://github.com/hakenr/SqlInjectionDemo
https://github.com/hakenr/SqlConnectionPoolingDemo
Záznam z přednášky pro konferenci SQL Server Bootcamp 2020, kterou pořádal WUG Česká Republika ve dnech 12. a 13. září 2020.
Záznam ze Vzdělávacího okénka HAVIT z 5. září 2019, kde Jiří Kanda povídal o izolaci transakcí na SQL Serveru.
Nahrávka je publikována na našem HAVIT YouTube Channelu.
Záznam ze Vzdělávacího okénka HAVIT ze 30. května 2019, kde Jiří Kanda povídal o Ranking functions a Running totals v T-SQL.
Nahrávka je publikována na našem HAVIT YouTube Channelu.
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éž:
Záznam ze Vzdělávacího okénka HAVIT z 26. dubna 2018, kde Jiří Kanda prezentoval Temporal Tables na Microsoft SQL Serveru. Nahrávka je publikována na našem HAVIT YouTube Channelu.
Záznam ze Vzdělávacího okénka HAVIT z 5. dubna 2018. Je publikován na našem HAVIT YouTube Channelu.
Dotčená témata:
Záznam z přednášky pro konferenci FreshIT Praha z 27.3.2018. Je publikován na našem HAVIT YouTube Channelu.
a další…
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
LogParser (download) je command-line utilita od Microsoftu, kterou můžete použít pro SQL-styl dotazování do libovolného textového log-souboru, resp. i mnoha souborů zároveň. Základní sada podporovaných formátů je úctyhodná: IISW3C, NCSA, IIS, IISODBC, BIN, IISMSID, HTTPERR, URLSCAN, CSV, TSV, W3C, XML, EVT, ETW, NETMON, REG, ADS, TEXTLINE, TEXTWORD, FS a COM.
Já ho používám obvykle pro dotazování IIS Logů a musím říct, že je neuskutečně rychlý. Na mém notebooku Lenovo X1 i7/16GB/SSD je schopen vyřešit následující dotaz do 8.97GB logů za 2min 12sec!
SELECT Date, TO_INT(COALESCE(EXTRACT_VALUE(cs-uri-query, 'id'), EXTRACT_VALUE(cs-uri-query, 'SouborSablonyID'))) AS SouborID, COUNT(*) AS Total FROM '[LOGFILEPATH]' WHERE (cs-uri-stem = '/business/sablony/soubor-partner.aspx') OR (cs-uri-stem = '/business/sablony/soubor.aspx') GROUP BY Date, SouborID ORDER BY Total DESC
LogParser umí nejenom vyhodnocovat dotazy, ale můžete jeho výsledky nasměrovat i do databáze či mnoha dalších výstupních formátů (CSV, XML, …), např.
C:\Program Files (x86)\Log Parser 2.2>logparser "SELECT * INTO iisLogs FROM c:\temp\logs\*.log" -i:iisw3c -o:SQL -server:localhost -database:MyLogs -username:sa -password:sa -createTable: ON
Poznámka: Pokud chcete čistý import logů do DB (bez filtrování, projekce či agregací) zvažte použití Import Flat File… wizarda z SQL Management Studia, který může být ještě rychlejší. Pokud použijete LogParser, mrkněte na volbu transactionRowCount k seskupení uploadovaných dat do menšího množství transakcí (např. -transactionRowCount:-1
pro jedinou transakci).
LogParser sám je command-line utilita. Nabízí dále COM API, které můžete volat ze svých aplikací (asi ne). Nicméně právě toto API bylo využito autory několika uživatelských rozhraní, které vám při občasném využití LogParseru usnadní život:
Následující odkazy se mohou při seznamování LogParserem hodit: