## Kedy použiť Pri čakaní PAGEIOLATCH_* alebo WRITELOG, pomalom restore či podozrení na preťažené úložisko. ## Ako čítať výsledok `avg_read_ms` = io_stall_read_ms / num_of_reads, `avg_write_ms` obdobne. Orientačne: log súbor nad ~5 ms zápisu a dátové súbory nad ~20 ms čítania stoja za preskúmanie. > [!WARNING] > Hodnoty sú kumulatívne od štartu SQL Servera – pre incident urob dva odbery a porovnaj rozdiel. Je to latencia z pohľadu SQL Servera, nie čistá latencia disku. **Oprávnenia:** `VIEW SERVER STATE` (na SQL Server 2022 stačí aj `VIEW SERVER PERFORMANCE STATE`). **Režim:** READ ONLY · **Verzia:** SQL Server 2016 – 2022 ## Súvisiace recepty - [Transaction log – obsadenie, reuse wait a VLF](script.php?id=33&s=transaction-log-obsadenie-reuse-wait-a-vlf)
Skript
I/O latencia podľa databázových súborov
Priemerná latencia čítania a zápisu pre každý MDF / NDF / LDF súbor od štartu inštancie.
Parametre skriptu doplň a kopíruj hotový skript
/* DeadlockCafe | I/O latencia podľa databázových súborov
Účel: Priemerná latencia čítania a zápisu pre každý MDF / NDF / LDF súbor od štartu inštancie.
Režim: READ ONLY | SQL Server 2016 – 2022, on-premises
*/
SET NOCOUNT ON;
SELECT DB_NAME(v.database_id) AS database_name, f.name AS logical_file_name,
f.type_desc, f.physical_name,
v.num_of_reads, v.num_of_writes,
CAST(v.io_stall_read_ms * 1.0 / NULLIF(v.num_of_reads,0) AS decimal(18,2)) AS avg_read_ms,
CAST(v.io_stall_write_ms * 1.0 / NULLIF(v.num_of_writes,0) AS decimal(18,2)) AS avg_write_ms,
CAST(v.num_of_bytes_read / 1048576.0 AS decimal(18,1)) AS read_mb,
CAST(v.num_of_bytes_written / 1048576.0 AS decimal(18,1)) AS written_mb
FROM sys.dm_io_virtual_file_stats(NULL,NULL) AS v
JOIN sys.master_files AS f ON f.database_id=v.database_id AND f.file_id=v.file_id
ORDER BY COALESCE(v.io_stall_read_ms*1.0/NULLIF(v.num_of_reads,0),0)
+ COALESCE(v.io_stall_write_ms*1.0/NULLIF(v.num_of_writes,0),0) DESC;