Clustered vs Nonclustered Index: What are the main differences?

By Josip Miskovic
A thumbnail showing clustered vs nonclustered index

Clustered vs Nonclustered Index

Clustered index stores data based on key values, while nonclustered index stores index key values separately with row pointers. A table can have one clustered index, but multiple nonclustered.

Clustered index is usually the primary key, while nonclustered is some other frequently used column.

When retriving data based on index, clustered indexes are faster than nonclustered indexes because the data is physically stored in the same order.

Clustered vs Nonclustered Index
Clustered Index Nonclustered Index
Data Storage

Data rows are physically sorted and stored in the same order as the index

Index and data rows are stored separately
Key Columns

Created on one column, usually the table's primary key

Can be created on any column or set of columns frequently used in queries

Index Size Typically larger because it includes all the data rows Only includes index key values and pointers to the data rows
Maintenance

Requires entire index to be rebuilt if primary key column(s) are changed

Only requires updates to affected index pages
Performance Faster for retrieving large ranges of sequential data

Faster for retrieving small sets of data or for sorting and aggregating data

What are indexes?

  • Indexes are either on-disk or in-memory structures associated with a table or view used to quickly locate rows.
  • They include keys composed of one or more columns from the table or view.
  • They are stored in a B-Tree structure that enables SQL Server to efficiently find the row related to the key values.


What is a clustered index?

A clustered index is a type of database index that sorts and stores data rows in a table or view based on their key values.

It determines the physical order of data rows in a table, and therefore, a table can only have one clustered index.

Pros of Clustered Index

  • Faster query performance: Data is physically sorted by the Clustered Key in your storage subsystem, which allows efficient data retrieval.
  • Lower complexity: The complexity of a seek operation is always O(log N).
  • Improved query performance: Queries that join tables or perform aggregations can benefit from a clustered index. The physical sort order minimizes the need for sorting operations.

Cons of Clustered Index

  • INSERT, UPDATE, and DELETE operations may be slower due to the rearrangement of clustered indexes.
  • To maintain good performance, we need to maintain the clustered indexes to keep it free from fragmentation.
  • Last Page Insert Latch Contention: caused when data is inserted only at the end of a clustered index, resulting in multiple queries competing against each other for access.
  • Hard page splits occur when a random clustered key is used, which increases transaction log work and causes index fragmentation.
  • Index fragmentation can lead to poor disk head movement on platters and reduced performance.

What is a nonclustered index?

Nonclustered indexes have a structure that is separate from the data rows. Each key-value pair in the nonclustered index has a pointer (row locator) to the key for a clustered index.

Pros of Nonclustered Index

  • Multiple indexes: One table can have many clustered indexes to support different query optimizations.
  • Improved query performance: Nonclustered indexes can improve query performance by providing quick access to specific data rows based on the index key values.
  • Reduced I/O: by providing quick access to specific rows, SQL Server can read fewer data pages.
  • Flexibility: Nonclustered indexes can be created on any column or combination of columns, allowing for greater flexibility in query optimization.
  • Supports large data sets: Efficient access to specific rows even in very large tables.

Cons of Nonclustered Index

  • Increased storage space
  • Decreased performance for write operations: Write operations can become slow because the server must update the index as well as the table.
  • Index fragmentation
  • Maintenance overhead: Require maintenance from a DBA to keep them optimized.
  • Index selection: The SQL Server query optimizer must choose which indexes to use for each query, and sometimes it can choose suboptimal indexes.

Should a table have a clustered index?

It's a good practice for every table to have a clustered index. In most cases, a clustered index is placed on the primary key of a table.

If a table does not have a clustered index, the data rows are stored in an unordered structure called a heap.

Clustered Index Seek Execution
An example of clustered index seek in the query execution plan.

What happens when we modify an indexed column?

When we modify a record of an indexed column in a clustered index, the database may need to move the entire row into a new position to maintain the sorted order. Under the hood, the update turns into a DELETE followed by an INSERT query. It's way more work, so it decreases performance.

The clustered index in the table typically uses primary or foreign key columns since key values don't usually change after insertion.

Why is database index important?

A database index is important because it makes finding records faster.

On-disk indexes allow SQL Server to move faster through the table's rows using index keys, allowing direct retrieval of results instead of scanning all records.

For example, we created an index on the primary key column and we query for data based on a primary key value. SQL Server will first look for that value in the index before using it to locate the whole row of data. Without an index, the SQL Server would have o scan the table, which significantly affects performance.

The scanning process is expensive. SQL Server navigates from the root node through the other intermediate nodes until it arrives at the target leaf node that contains the data row or pointer.

How to choose a clustered index?

Choose indexes that benefit as many queries as possible.

Since a table can have only one clustered index, choose it based on which query would benefit most from it:

  • Most selective
  • Most likely to be used to sort
  • Most likely to be used to filter
  • Most likely to be used to join
  • Less likely to change often

Should I add an index to my table?

When creating an index, there are a few key considerations to keep in mind:

  • Consider the trade-off between faster queries and slower updates
  • Disk space usage since indexes require disk space
  • Attributes in WHERE clauses are good candidates for index keys
  • Clustering is especially useful for range queries, but can also help with equality queries if there are many duplicates.

Summary: Difference between Clustered and Nonclustered Index

  • Clustered indexes store data based on key values and are usually the primary key, while nonclustered indexes store index key values separately with row pointers and can be created on any column or set of columns frequently used in queries.
  • Retrieving data based on the index is faster using clustered indexes than nonclustered indexes because the data is physically stored in the same order.
  • Clustered indexes are faster for retrieving large ranges of sequential data, while nonclustered indexes are faster for retrieving small sets of data or for sorting and aggregating data.
  • Choosing the right index can improve query performance, and maintaining the index is essential for good performance.
Josip Miskovic
About Josip

Josip Miskovic is a software developer at Americaneagle.com. Josip has 10+ years in experience in developing web applications, mobile apps, and games.

Read more posts →
Published on:
Download Free Software Developer Career Guide

I've used these principles to increase my earnings by 63% in two years. So can you.

Dive into my 7 actionable steps to elevate your career.