SQL Server Performance, Best Practices, & Productivity
This is the first in a series of posts documenting big wins encountered using columnstore indexes in SQL Server 2012 & 2014. Many of these can be found in this deck along with details such as internals, best practices, caveats, etc. The purpose of sharing the case studies in this context is to provide an easy-to-consume quick-reference alternative.
If we’re looking for a subset of columns from one or a few rows, given the right indexes, SQL Server can do a superlative job of providing an answer. If we’re asking a question which by design needs to hit lots of rows—DW, reporting, aggregations, grouping, scans, etc., SQL Server has never had a good mechanism—until columnstore.
Columnstore indexes were introduced in SQL Server 2012. However, they're still largely unknown. Some adoption blockers existed; yet columnstore was nonetheless a game changer for many apps. In SQL Server 2014, potential blockers have been largely removed & they're going to profoundly change the way we interact with our data. The purpose of this series is to share the performance benefits of columnstore & documenting columnstore is a compelling reason to upgrade to SQL Server 2014.
At MSIT, performance & configuration data is captured by SCOM. We archive much of the data in a partitioned data warehouse table in SQL Server 2012 for reporting via an application called SONAR. By definition, this is a primary use case for columnstore—report queries requiring aggregation over large numbers of rows. New data is refreshed each night by an automated table partitioning mechanism—a best practices scenario for columnstore.
Compared to performance using classic indexing which resulted in the expected query plan selection including partition elimination vs. SQL Server 2012 nonclustered columnstore, query performance increased significantly. Logical reads were reduced by over a factor of 50; both CPU & duration improved by factors of 20 or more. Other than creating the columnstore index, no special modifications or tweaks to the app or databases schema were necessary to achieve the performance improvements. Existing nonclustered indexes were rendered superfluous & were deleted, thus mitigating maintenance challenges such as defragging as well as conserving disk capacity.
The table provides the raw data & summarizes the performance deltas.
Logical Reads (8K pages) CPU (ms) Durn (ms) Columnstore 160,323 20,360 9,786 Conventional Table & Indexes 9,053,423 549,608 193,903 Δ x56 x27 x20
Logical Reads (8K pages)
Conventional Table & Indexes
The charts provide additional perspective of this data. "Conventional vs. Columnstore Metrics" document the raw data. Note on this linear display the magnitude of the conventional index performance vs. columnstore.
The “Metrics (Δ)” chart expresses these values as a ratio.
For DW, reports, & other BI workloads, columnstore often provides significant performance enhancements relative to conventional indexing. I have documented here, the first in a series of reports on columnstore implementations, results from an initial implementation at MSIT in which logical reads were reduced by over a factor of 50; both CPU & duration improved by factors of 20 or more. Subsequent features in this series document performance enhancements that are even more significant.