The Cost vs. Speed Dilemma
When building a massive file server or a Hyper-V cluster, you face an architectural dilemma. Solid State NVMe drives are incredibly fast, but they are very expensive (e.g., $1,000 for 2TB). Traditional spinning Hard Disk Drives (HDDs) are incredibly slow, but they are dirt cheap (e.g., $200 for 16TB). If you build a server entirely out of NVMe, you will run out of budget. If you build it entirely out of HDDs, your SQL databases will crawl.
Windows Server solves this using Storage Spaces Tiering. You install both NVMe drives and cheap HDDs into the same physical server. Storage Spaces merges them into a single, unified logical volume (e.g., the D: drive). The Windows kernel then runs a continuous background analysis algorithm. When it identifies “Hot” data (files that are accessed frequently, like active SQL databases or current Hyper-V VHDXs), it silently moves that data to the NVMe tier for maximum IOPS. When it identifies “Cold” data (like 5-year-old PDF archives), it silently demotes that data to the spinning HDD tier.
This gives you the blinding speed of NVMe combined with the massive capacity of cheap HDDs. Deploying this hybrid architecture requires precise PowerShell execution.
Step 1: Identifying the Physical Disks
First, you must identify the raw, unformatted drives sitting in the server.
Get-PhysicalDisk | Where-Object CanPool -eq $true | Select-Object FriendlyName, MediaType, Size
Ensure that Windows correctly identified the MediaType (e.g., it knows which drives are SSD and which are HDD). If it misidentified an SSD as an HDD, the tiering logic will fail.
Step 2: Creating the Storage Pool
You must grab all the raw drives and pool them together into a unified aggregate.
$PhysicalDisks = Get-PhysicalDisk | Where-Object CanPool -eq $true
New-StoragePool -FriendlyName "HybridPool" -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $PhysicalDisks
Step 3: Defining the Storage Tiers
Once the pool exists, you must explicitly define the two architectural tiers within it. We will create a Performance tier (SSD) and a Capacity tier (HDD).
# Create the Fast Tier
New-StorageTier -StoragePoolFriendlyName "HybridPool" -FriendlyName "PerformanceTier" -MediaType SSD -ResiliencySettingName Mirror
# Create the Slow Tier
New-StorageTier -StoragePoolFriendlyName "HybridPool" -FriendlyName "CapacityTier" -MediaType HDD -ResiliencySettingName Parity
(Note: We use Mirroring for the fast tier to maximize read/write performance, and Parity for the slow tier to maximize storage efficiency).
Step 4: Creating the Tiered Virtual Disk
Now, you carve out the actual volume that the end-users will see. You specify exactly how much of the SSD tier and how much of the HDD tier should be dedicated to this specific drive.
# Allocate 500GB of the fast NVMe storage and 5TB of the slow HDD storage
$FastTier = Get-StorageTier -FriendlyName "PerformanceTier"
$SlowTier = Get-StorageTier -FriendlyName "CapacityTier"
New-VirtualDisk -StoragePoolFriendlyName "HybridPool" -FriendlyName "TieredDisk_01" -StorageTiers @($FastTier, $SlowTier) -StorageTierSizes @(500GB, 5TB)
Step 5: Formatting and Mounting
Finally, format the new 5.5TB hybrid disk and assign it a drive letter so the operating system can use it.
Get-VirtualDisk -FriendlyName "TieredDisk_01" | Get-Disk | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem ReFS -NewFileSystemLabel "CorporateData" -Confirm:$false
Monitoring the Tiering Engine
The D: drive is now live. By default, the Storage Tiers Optimization task runs automatically via a scheduled task at 1:00 AM every night. It analyzes the heat map of all files and physically shifts the blocks between the NVMe and HDD platters.
If you need to force the optimization to run immediately during the day, you can execute:
Optimize-Volume -DriveLetter D -TierOptimize
Your server is now operating with extreme financial and architectural efficiency, dynamically optimizing performance without any further human intervention.