LCK_M_IS SQL Server Wait Type

Wait Type LCK_M_IS

The wait type LCK_M_IS is ranked #13 by Stedman Solutions and Database Health Monitor.

Wait statistics, in the context of SQL Server, refer to the amount of time that a query spends waiting to access data in the database. When a client application requests data from the database, the request is placed in a queue and the client application must wait for its turn to access the data. The time that the query spends waiting is called a "wait" and is tracked by SQL Server. This information can be used to identify potential performance bottlenecks and optimize the performance of the database. Wait statistics are commonly used by database administrators to diagnose and troubleshoot performance issues in SQL Server.


SQL Server uses various locks to manage data access and maintain consistency in multi-user environments. One specific lock wait type is LCK_M_IS, which stands for Intent Shared Lock. This wait type occurs when SQL Server is waiting to acquire a shared lock on a resource, typically because other transactions are already holding incompatible locks. In this post, we’ll explain what LCK_M_IS means, when it appears, and how it may impact SQL Server performance.

What Is the LCK_M_IS Wait Type?

The LCK_M_IS wait type appears when SQL Server is trying to acquire an Intent Shared (IS) lock on a database resource. An IS lock is used when SQL Server wants to read data but needs to signal that it may need to acquire more specific shared locks on individual rows or pages within that resource. An IS lock does not block other reads, but it may need to wait if an exclusive lock (which prevents reads) is already in place.

In simpler terms, a LCK_M_IS wait happens when SQL Server is trying to prepare for a read operation by acquiring a lock that lets it signal its intent to read data. If another transaction is modifying that data with an exclusive lock, SQL Server may have to wait until the other transaction completes before it can proceed.

When Does LCK_M_IS Appear?

LCK_M_IS waits generally occur in environments with high levels of concurrent reads and writes. Some common scenarios where LCK_M_IS waits may appear include:

  • High-Concurrency Environments – In systems with many users reading and writing data simultaneously, SQL Server may encounter more lock contention as it tries to manage data access safely.
  • Transactions with Shared and Exclusive Locks – When multiple transactions hold shared locks and others attempt to acquire exclusive locks, SQL Server may need to wait for locks to be released to maintain data consistency.
  • Long-Running Updates or Inserts – If a transaction holds an exclusive lock on a resource for an extended time, other transactions may experience LCK_M_IS waits as they wait to acquire intent shared locks.

Some LCK_M_IS waits are normal in any multi-user system, but frequent or prolonged waits may indicate a locking issue that could impact performance.

Why LCK_M_IS Waits Matter

While some LCK_M_IS waits are expected, high or frequent waits can slow down the system, causing delays in query processing. Excessive LCK_M_IS waits may indicate that SQL Server is spending too much time waiting to acquire intent shared locks, which can impact overall performance. Common causes of high LCK_M_IS waits include:

  • Lock Contention – When many users or processes are trying to access or modify the same data at once, SQL Server may encounter more locking waits.
  • Blocking Queries – Long-running queries that hold exclusive locks can block other processes from acquiring intent shared locks, increasing wait times.
  • Inefficient Indexing – Poorly designed indexes may lead to more locking as SQL Server reads larger portions of data, causing higher chances of lock contention.

How to Address LCK_M_IS Waits

If LCK_M_IS waits are causing performance issues, consider these strategies to help reduce them:

  • Optimize Queries – Review and optimize long-running or inefficient queries that may be holding exclusive locks for extended periods.
  • Improve Indexing – Create or adjust indexes to allow SQL Server to read data more efficiently, reducing the need for extensive locking.
  • Use Shorter Transactions – Keeping transactions short and committing them promptly can help reduce lock contention and lower LCK_M_IS waits.
  • Consider Row-Level Locking – In some cases, switching to row-level locking instead of page or table locking can help reduce contention and avoid LCK_M_IS waits.
  • Monitor for Blocking – Use SQL Server monitoring tools to identify blocked sessions and understand where locks may be causing delays.

Conclusion

The LCK_M_IS wait type in SQL Server occurs when the system is waiting to acquire an intent shared lock on a resource. While some waits are expected, frequent or long waits may indicate lock contention, long-running transactions, or inefficient queries that could be affecting performance. By optimizing queries, improving indexing, using shorter transactions, and monitoring for blocking, you can help reduce LCK_M_IS waits and improve SQL Server performance.

If you need assistance with SQL Server performance tuning, lock management, or query optimization, Stedman Solutions offers managed services to help keep your SQL Server environment running smoothly and efficiently.


Watch on YouTube


Find out more about our SQL Server Managed Services

Applies to

Related Waits

LCK_M_BU
LCK_M_BU_ABORT_BLOCKERS
LCK_M_BU_LOW_PRIORITY
LCK_M_IS_ABORT_BLOCKERS
LCK_M_IS_LOW_PRIORITY
LCK_M_IU
LCK_M_IU_ABORT_BLOCKERS
LCK_M_IU_LOW_PRIORITY
LCK_M_IX
LCK_M_IX_ABORT_BLOCKERS
LCK_M_IX_LOW_PRIORITY
LCK_M_RIn_NL
LCK_M_RIn_NL_ABORT_BLOCKERS
LCK_M_RIn_NL_LOW_PRIORITY
LCK_M_RIn_S
LCK_M_RIn_S_ABORT_BLOCKERS
LCK_M_RIn_S_LOW_PRIORITY
LCK_M_RIn_U
LCK_M_RIn_U_ABORT_BLOCKERS
LCK_M_RIn_U_LOW_PRIORITY
LCK_M_RIn_X
LCK_M_RIn_X_ABORT_BLOCKERS
LCK_M_RIn_X_LOW_PRIORITY
LCK_M_RS_S
LCK_M_RS_S_ABORT_BLOCKERS
LCK_M_RS_S_LOW_PRIORITY
LCK_M_RS_U
LCK_M_RS_U_ABORT_BLOCKERS
LCK_M_RS_U_LOW_PRIORITY
LCK_M_RX_S
LCK_M_RX_S_ABORT_BLOCKERS
LCK_M_RX_S_LOW_PRIORITY
LCK_M_RX_U
LCK_M_RX_U_ABORT_BLOCKERS
LCK_M_RX_U_LOW_PRIORITY
LCK_M_RX_X
LCK_M_RX_X_ABORT_BLOCKERS
LCK_M_RX_X_LOW_PRIORITY
LCK_M_S
LCK_M_S_ABORT_BLOCKERS
LCK_M_S_LOW_PRIORITY
LCK_M_SCH_M
LCK_M_SCH_M_ABORT_BLOCKERS
LCK_M_SCH_M_LOW_PRIORITY
LCK_M_SCH_S
LCK_M_SCH_S_ABORT_BLOCKERS
LCK_M_SCH_S_LOW_PRIORITY
LCK_M_SIU
LCK_M_SIU_ABORT_BLOCKERS
LCK_M_SIU_LOW_PRIORITY
LCK_M_SIX
LCK_M_SIX_ABORT_BLOCKERS
LCK_M_SIX_LOW_PRIORITY
LCK_M_U
LCK_M_U_ABORT_BLOCKERS
LCK_M_U_LOW_PRIORITY
LCK_M_UIX
LCK_M_UIX_ABORT_BLOCKERS
LCK_M_UIX_LOW_PRIORITY
LCK_M_X
LCK_M_X_ABORT_BLOCKERS
LCK_M_X_LOW_PRIORITY

See Also


All Wait Types
LCK_M_IS SQL Server Wait Type