COLUMNSTORE_ARCHIVE compression type pushed compression close to 80% while the tables are essentially append-only audit logs. That's exactly the type of workload where paying a little extra CPU during compression is a bargain. Saving over 100 GB on a single table, where total database size is 230 GB, means smaller backups, less storage, more useful pages in the buffer pool, and less I/O whenever the table is scanned.
Even though ColumnScore won’t recommend it, why does columnstore work in this case? Imagine you have an application database with a log or audit table where:
- new rows are constantly inserted,
- existing rows are never updated,
- data stays around for years (hopefully with some retention policy before the storage team starts asking uncomfortable questions),
- operators only read it occasionally when they're investigating what happened three months ago at 2:37 AM.
Does this sound familiar? Congratulations! You’ve just found a great candidate for a clustered columnstore index. No matter that it is in application OLTP database and rows are inserted one by one and not in batches. Are you scared of data movement from delta store to compressed column in the middle of the day? That’s what COMPRESSION_DELAY parameter is for. It lets you control how long newly inserted rows remain in the delta store before becoming eligible for compression.
So yes, you can have a clustered columnstore index on a table sitting happily inside your application OLTP database.
"But I need Index Seeks!"
The moment someone mentions replacing the clustered index with a clustered columnstore index, every DBA instinctively reaches for the panic button because "it's going to scan everything!"
Not necessarily. SQL Server 2016+ allows nonclustered rowstore indexes on top of a clustered columnstore index, so you can simply create traditional B-tree indexes for the columns your application frequently searches on.
Need to look up logs of a specific UserID or SessionID? Create a nonclustered index. Your application will keep using Index Seeks, while the rest of the table enjoys massive compression.
Continuous Columnstore Improvements (CCI:)
After the rough start, Microsoft continues to work on columnstore engine:
SQL Server 2016 SP1 and later versions made columnstore indexes available in all SQL Server editions, so you cannot make licensing excuses anymore.
Starting with SQL Server 2019, the tuple mover is helped by a background merge task that automatically compresses smaller open delta rowgroups that have existed for some time, or merges compressed rowgroups from where many rows have been deleted.
SQL Server 2022 introduced ordered columnstore indexes. Well... ordered-ish. If your log table is mostly queried by date, ordering the columnstore on the timestamp column can make those occasional investigations noticeably faster while keeping all the compression benefits.
SQL Server 2025 adds online creation / rebuild of ordered columnstore indexes, improves sort quality for ordered columnstore indexes, and improves shrink operations when clustered columnstore indexes are present.
These and many more improvements can be studied at Microsoft Learn.
Don't Put It Everywhere
Before you run off replacing every clustered index in your OLTP database... "Don't".
Columnstore is fantastic for append-heavy tables with rare updates. It is considerably less fantastic for tables that spend their lives processing UPDATEs and DELETEs. The deltastore, delete bitmap, and tuple mover all exist for good reasons, but they're not magic.
Use it where it makes sense. And as always, test your index modifications in non-production first.