SQL Server Managed Instance IO Performance is dependant on a few settings.
- Service Tier
- vCore Count
- File Sizes !!
Yes, File Sizes. A quick explanation, if you have a small database < 128GB your not going to get much data throughput. Only around the 500 IOPS or 100 MB/s. It’s all explained here. https://docs.microsoft.com/en-us/azure/azure-sql/managed-instance/resource-limits
You will need to make your data file bigger, how to do that and measure the impact – that’s here https://techcommunity.microsoft.com/t5/azure-sql-database/increase-data-file-size-to-improve-hammerdb-workload-performance/ba-p/823337
You can find the Azure Managed Disks and their performance profiles – https://azure.microsoft.com/en-us/pricing/details/managed-disks/
I wrote a small proc in SQL to show you your current file sizes, IOPS, Throughput and Disk Tier your data files would be on in your SQL Server Managed Instance.
If your moving big sets of data around then increasing your file sizes will have a big performance boost. As always you have to measure it against your current workload, and of course bigger files cost more money in Azure Storage costs.
USE master;
GO
DROP PROCEDURE IF EXISTS dbo.sp_tdc_get_sql_managed_instance_iops_performance;
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE PROCEDURE dbo.sp_tdc_get_sql_managed_instance_iops_performance
AS
BEGIN;
WITH DatabaseFiles AS (
SELECT DB_NAME(database_id) AS [Database Name],
type_desc AS [File Type],
name AS [File Name],
CAST(( size * 8.0 ) / 1024 AS DECIMAL(38, 1)) AS [Size MB],
CAST(( size * 8.0 ) / 1024 / 1024 AS DECIMAL(38, 1)) AS [Size GB]
FROM sys.master_files
WHERE type IN ( 0 ) AND
database_id >= 5
)
SELECT DF.[Database Name],
DF.[File Type],
DF.[File Name],
DF.[Size MB],
DF.[Size GB],
CASE WHEN DF.[Size GB] >= 0 AND
DF.[Size GB] <= 128 THEN 'P10'
WHEN DF.[Size GB] > 128 AND
DF.[Size GB] <= 256 THEN 'P15'
WHEN DF.[Size GB] > 256 AND
DF.[Size GB] <= 512 THEN 'P20'
WHEN DF.[Size GB] > 512 AND
DF.[Size GB] <= 1024 THEN 'P30'
WHEN DF.[Size GB] > 1024 AND
DF.[Size GB] <= 2048 THEN 'P40'
WHEN DF.[Size GB] > 2048 AND
DF.[Size GB] <= 4096 THEN 'P40'
WHEN DF.[Size GB] > 4096 AND
DF.[Size GB] <= 8192 THEN 'P50'
ELSE 'P60'
END AS [Azure Disk],
CASE WHEN DF.[Size GB] >= 0 AND
DF.[Size GB] <= 128 THEN 500
WHEN DF.[Size GB] > 128 AND
DF.[Size GB] <= 256 THEN 1100
WHEN DF.[Size GB] > 256 AND
DF.[Size GB] <= 512 THEN 2300
WHEN DF.[Size GB] > 512 AND
DF.[Size GB] <= 1024 THEN 5000
WHEN DF.[Size GB] > 1024 AND
DF.[Size GB] <= 2048 THEN 7500
WHEN DF.[Size GB] > 2048 AND
DF.[Size GB] <= 4096 THEN 7500
WHEN DF.[Size GB] > 4096 AND
DF.[Size GB] <= 8192 THEN 12500
ELSE 12500
END AS [Max IOPS Per FILE],
CASE WHEN DF.[Size GB] >= 0 AND
DF.[Size GB] <= 128 THEN 100
WHEN DF.[Size GB] > 128 AND
DF.[Size GB] <= 256 THEN 125
WHEN DF.[Size GB] > 256 AND
DF.[Size GB] <= 512 THEN 150
WHEN DF.[Size GB] > 512 AND
DF.[Size GB] <= 1024 THEN 200
WHEN DF.[Size GB] > 1024 AND
DF.[Size GB] <= 2048 THEN 250
WHEN DF.[Size GB] > 2048 AND
DF.[Size GB] <= 4096 THEN 250
WHEN DF.[Size GB] > 4096 AND
DF.[Size GB] <= 8192 THEN 500
ELSE 500
END AS [Max T/P Per File MiB/s]
FROM DatabaseFiles AS DF
ORDER BY DF.[Database Name],
DF.[File Type];
END;
GO