Quick Answer
LCK_M_SIU_LOW_PRIORITY occurs when a session waits for a Shared Intent Update lock with low priority scheduling, typically from ALTER TABLE or ALTER INDEX operations using the WAIT_AT_LOW_PRIORITY option. This wait type indicates the operation is yielding to other workloads and is generally expected behavior, not a performance problem.
Root Cause Analysis
This wait type exists exclusively for ALTER TABLE and ALTER INDEX operations configured with the WAIT_AT_LOW_PRIORITY option, introduced in SQL Server 2014. The lock manager implements a priority-based scheduling system where these low-priority operations voluntarily yield CPU and lock resources to normal-priority transactions.
When an ALTER operation specifies WAIT_AT_LOW_PRIORITY, SQL Server's lock manager places the request in a separate low-priority queue. The scheduler periodically checks if higher-priority operations need the same resources. If conflicts exist, the low-priority operation enters the LCK_M_SIU_LOW_PRIORITY wait state and releases its time slice.
The SIU (Shared Intent Update) lock type combines shared access with intent to escalate to update locks, required for schema modification operations. Unlike standard lock waits, this wait type includes built-in timeout and abort mechanisms. The operation can specify MAX_DURATION to limit total wait time and ABORT_AFTER_WAIT behavior when timeouts occur.
SQL Server 2016 enhanced the priority scheduling algorithm to better handle mixed workloads. SQL Server 2019 improved the lock escalation detection for low-priority operations. The core behavior remains consistent through SQL Server 2022.
The wait occurs in these scenarios: online index rebuilds with low priority, table alterations during peak hours, and partition switching operations configured to minimize blocking. The wait duration depends on competing workload intensity and the MAX_DURATION setting.
AutoDBA checks Low-priority lock wait monitoring, ALTER operation scheduling, and maintenance window optimization across your entire SQL Server instance in 60 seconds. Download the free diagnostic script and see what else needs attention.
Diagnostic Queries
-- Check current low priority lock waits and their duration
SELECT
r.session_id,
r.wait_type,
r.wait_time,
r.blocking_session_id,
t.text AS sql_text,
r.command,
s.login_name
FROM sys.dm_exec_requests r
INNER JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.wait_type = 'LCK_M_SIU_LOW_PRIORITY'
ORDER BY r.wait_time DESC;
-- Identify objects involved in low priority operations
SELECT
r.session_id,
DB_NAME(r.database_id) AS database_name,
OBJECT_NAME(p.object_id, r.database_id) AS object_name,
p.index_id,
i.name AS index_name,
r.percent_complete,
r.estimated_completion_time,
r.command
FROM sys.dm_exec_requests r
INNER JOIN sys.dm_os_tasks t ON r.session_id = t.session_id
INNER JOIN sys.partitions p ON t.task_address = p.partition_id
LEFT JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id
WHERE r.wait_type = 'LCK_M_SIU_LOW_PRIORITY';
-- Monitor blocking chains affecting low priority operations
WITH BlockingHierarchy AS (
SELECT
session_id,
blocking_session_id,
wait_type,
wait_time,
1 AS level
FROM sys.dm_exec_requests
WHERE blocking_session_id != 0
UNION ALL
SELECT
r.session_id,
r.blocking_session_id,
r.wait_type,
r.wait_time,
bh.level + 1
FROM sys.dm_exec_requests r
INNER JOIN BlockingHierarchy bh ON r.session_id = bh.blocking_session_id
WHERE bh.level < 10
)
SELECT * FROM BlockingHierarchy
WHERE session_id IN (
SELECT session_id FROM sys.dm_exec_requests
WHERE wait_type = 'LCK_M_SIU_LOW_PRIORITY'
)
ORDER BY level, session_id;
-- Check ALTER operations with WAIT_AT_LOW_PRIORITY settings
SELECT
r.session_id,
r.start_time,
r.command,
r.percent_complete,
SUBSTRING(t.text, r.statement_start_offset/2 + 1,
CASE WHEN r.statement_end_offset = -1
THEN LEN(t.text)
ELSE r.statement_end_offset/2 - r.statement_start_offset/2 + 1
END) AS current_statement
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.wait_type = 'LCK_M_SIU_LOW_PRIORITY'
OR UPPER(t.text) LIKE '%WAIT_AT_LOW_PRIORITY%';
Fix Scripts
Increase MAX_DURATION for long-running operations
-- Modify existing ALTER operation to allow longer wait times
-- CAUTION: Only increase if operation is critical and blocking is minimal
ALTER INDEX IX_YourIndex ON dbo.YourTable REBUILD
WITH (
ONLINE = ON,
WAIT_AT_LOW_PRIORITY (
MAX_DURATION = 30 MINUTES, -- Increased from default
ABORT_AFTER_WAIT = SELF -- Operation aborts itself after timeout
)
);
-- Expected impact: Operation waits longer before timing out, may complete successfully
-- Test in development first to validate timeout values
Kill competing high-priority sessions (use with extreme caution)
-- Identify and terminate blocking sessions if absolutely necessary
-- WARNING: This can cause application errors and data loss
DECLARE @BlockingSession INT;
SELECT @BlockingSession = blocking_session_id
FROM sys.dm_exec_requests
WHERE wait_type = 'LCK_M_SIU_LOW_PRIORITY'
AND session_id = <your_session_id>;
-- Only execute after confirming the blocking session can be safely terminated
-- KILL @BlockingSession; -- Uncomment only after verification
-- Expected impact: Immediately resolves the wait, allows operation to proceed
-- Risk: May cause rollbacks, connection errors, or data inconsistency
Switch to offline operation during maintenance window
-- Convert online operation to offline for guaranteed completion
-- Use during scheduled maintenance when blocking is acceptable
ALTER INDEX IX_YourIndex ON dbo.YourTable REBUILD
WITH (ONLINE = OFF);
-- Alternative: Disable low priority and accept blocking
ALTER INDEX IX_YourIndex ON dbo.YourTable REBUILD
WITH (ONLINE = ON); -- No WAIT_AT_LOW_PRIORITY clause
-- Expected impact: Operation completes faster but may cause blocking
-- Schedule during low-activity periods to minimize user impact
AutoDBA generates fix scripts like these automatically, with impact estimates and rollback SQL included.
Prevention
Schedule ALTER operations with WAIT_AT_LOW_PRIORITY during maintenance windows or low-activity periods. Monitor sys.dm_exec_requests regularly to identify patterns of competing workloads that consistently block low-priority operations.
Configure appropriate MAX_DURATION values based on historical operation completion times. Set ABORT_AFTER_WAIT to BLOCKERS rather than SELF when the operation is more critical than competing transactions. Use BLOCKERS carefully in production environments.
Implement workload management through Resource Governor to separate maintenance operations from user workloads. Create dedicated resource pools for index maintenance with higher importance settings when low-priority operations consistently fail.
Monitor index fragmentation levels and rebuild frequency to optimize maintenance schedules. Consider partitioning large tables to reduce ALTER operation scope and duration. Use incremental statistics updates instead of full rebuilds when appropriate.
Establish baseline measurements for typical ALTER operation durations without low priority settings. Set monitoring alerts when LCK_M_SIU_LOW_PRIORITY waits exceed normal thresholds, indicating increased workload conflicts or system resource pressure.
Need hands-on help?
Dealing with persistent lck_m_siu_low_priority issues across your environment? Samix Technology provides hands-on SQL Server performance consulting with 15+ years of production DBA experience.