Skip to content

Commit e9a94c2

Browse files
Merge pull request #36187 from MicrosoftDocs/main
Auto Publish – main to live - 2026-01-07 23:30 UTC
2 parents ae96262 + ed1377f commit e9a94c2

7 files changed

Lines changed: 155 additions & 201 deletions

File tree

azure-sql/database/hyperscale-automated-backups-overview.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: Learn about automated backups for Hyperscale databases in Azure SQL
55
author: WilliamDAssafMSFT
66
ms.author: wiassaf
77
ms.reviewer: dinethi, mathoma, danil, randolphwest
8-
ms.date: 02/03/2025
8+
ms.date: 01/07/2026
99
ms.service: azure-sql-database
1010
ms.subservice: backup-restore
1111
ms.topic: conceptual
@@ -36,7 +36,7 @@ You can restore a database to any point in time within its backup retention peri
3636

3737
As such, restore isn't a size-of-data operation that remains the same. Restore of a Hyperscale database within the same Azure region finishes in minutes instead of hours or days, even for multi-terabyte databases.
3838

39-
Changing the [storage redundancy](hyperscale-automated-backups-overview.md#data-and-backup-storage-redundancy) when issuing a restore can result in longer restore times as the restore is the size of data, and hence the time is proportional to the database size.
39+
Changing the [storage redundancy](hyperscale-automated-backups-overview.md#data-and-backup-storage-redundancy) or zone redundancy when issuing a restore can result in longer restore times as the restore is the size of data, and hence the time is proportional to the database size.
4040

4141
Creating new databases by restoring an existing backup or copying the database, also takes advantage of compute and storage separation in Hyperscale. You can create copies for development or testing purposes, even of multi-terabyte databases, in minutes within the same region when you use the same storage type.
4242

docs/relational-databases/collations/collation-and-unicode-support.md

Lines changed: 49 additions & 49 deletions
Large diffs are not rendered by default.

docs/relational-databases/indexes/columnstore-indexes-what-s-new.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ For feature availability in Azure SQL Managed Instance with a SQL Server [update
7474

7575
In [!INCLUDE [sql-server-2025](../../includes/sssql25-md.md)], when an ordered clustered columnstore index is built online, the sort algorithm uses `tempdb` instead of sorting the data in memory. If `MAXDOP` for the index build is 1, the build produces a fully ordered clustered columnstore index that doesn't have overlapping segments. This can improve performance of queries using the index. However, index build might take longer because of the additional I/O required for spills to `tempdb`. If a clustered columnstore index already exists, queries can continue using it while the fully ordered online index rebuild is in progress.
7676

77-
For more information, see [Reduce segment overlap](ordered-columnstore-indexes.md#reduce-segment-overlap).
77+
For more information, see [Reduce segment overlap and improve query performance](ordered-columnstore-indexes.md#reduce-segment-overlap-and-improve-query-performance).
7878

7979
- Improved database and file shrink operations.
8080

docs/relational-databases/indexes/ordered-columnstore-indexes.md

Lines changed: 31 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ title: "Performance Tuning with Ordered Columnstore Indexes"
33
description: "Learn more about how ordered columnstore indexes can benefit query performance."
44
author: WilliamDAssafMSFT
55
ms.author: wiassaf
6-
ms.reviewer: nibruno; xiaoyul, randolphwest, dfurman
7-
ms.date: 12/29/2025
6+
ms.reviewer: nibruno, xiaoyul, randolphwest, dfurman
7+
ms.date: 01/06/2026
88
ms.service: sql
99
ms.subservice: performance
1010
ms.topic: article
@@ -21,7 +21,7 @@ Ordered columnstore indexes can provide faster performance by skipping large amo
2121

2222
When a query reads a columnstore index, the [!INCLUDE [ssDE](../../includes/ssde-md.md)] checks the minimum and maximum values stored in each column segment. The process eliminates segments that fall outside the bounds of the query predicate. In other words, it skips these segments when reading data from disk or memory. A query finishes faster if the number of segments to read and their total size is significantly smaller.
2323

24-
With certain data load patterns, data in a columnstore index might already be ordered. For example, if data loads occur every day, then the data might be ordered by a `load_date` column. In this case, query performance can already benefit from this implicit order. Ordering the columnstore index by the same `load_date` column explicitly isn't likely to provide an extra performance benefit.
24+
With certain data load patterns, data in a columnstore index might be ordered implicitly without specifying the `ORDER` clause. For example, if data loads occur every day, then the data might be ordered by a `load_date` column. In this case, query performance can already benefit from this implicit order. Ordering the columnstore index by the same `load_date` column explicitly in the `ORDER` clause isn't likely to provide an extra performance benefit.
2525

2626
For ordered columnstore index availability in various SQL platforms and SQL Server versions, see [Ordered columnstore index availability](columnstore-indexes-overview.md#ordered-columnstore-index-availability).
2727

@@ -33,57 +33,53 @@ In a columnstore index, the data in each column of each rowgroup is compressed i
3333

3434
When a columnstore index isn't ordered, the index builder doesn't sort the data before compressing it into segments. That means that segments with overlapping value ranges can occur, causing queries to read more segments to obtain the required data. As a result, queries can take longer to finish.
3535

36-
When you create an ordered columnstore index, the [!INCLUDE [ssDE](../../includes/ssde-md.md)] sorts the existing data by the order keys you specify before the index builder compresses them into segments. With sorted data, segment overlapping is reduced or eliminated, allowing queries to use a more efficient segment elimination and thus faster performance because there are fewer segments and less data to read.
36+
When you create an ordered columnstore index by specifying the `ORDER` clause in the [CREATE COLUMNSTORE INDEX](../../t-sql/statements/create-columnstore-index-transact-sql.md) statement, the [!INCLUDE [ssDE](../../includes/ssde-md.md)] sorts the data in each segment of each order column before the index builder compresses the data into segments. With sorted data, segment overlapping is reduced or eliminated, allowing queries to use a more efficient segment elimination and thus faster performance because there are fewer segments and less data to read.
3737

38-
## Reduce segment overlap
38+
<a id="reduce-segment-overlap"></a>
3939

40-
When you build an ordered columnstore index, the [!INCLUDE [ssDE](../../includes/ssde-md.md)] sorts the data on a best-effort basis. Depending on the available memory, the data size, the degree of parallelism, the index type (clustered vs. nonclustered), and the type of index build (offline vs. online), the sort for ordered columnstore indexes might be full with no segment overlap, or partial with some segment overlap.
40+
## Reduce segment overlap and improve query performance
4141

42-
The following table describes the resulting sort type when you create or rebuild an ordered columnstore index, depending on the index build options.
42+
When you build an ordered columnstore index, the [!INCLUDE [ssDE](../../includes/ssde-md.md)] sorts the data on a best-effort basis. Depending on the available memory, the data size, the degree of parallelism, the index type (clustered vs. nonclustered), and the type of index build (offline vs. online), the order a column in a columnstore index might be full with no segment overlap, or partial with some segment overlap. When there are fewer overlapping segments, a query that can take advantage of column order runs faster.
4343

44-
| Prerequisites | Sort type |
44+
> [!TIP]
45+
> Even if the order in a column of a columnstore index is partial, segments can still be eliminated (skipped). A full order isn't required to gain performance benefits if a partial order avoids many segment overlaps.
46+
47+
The following table describes the resulting order type when you create or rebuild an ordered columnstore index, depending on the index build options.
48+
49+
| Prerequisites | Order type |
4550
| --- | --- |
4651
| `ONLINE = ON` and `MAXDOP = 1` | Full |
4752
| `ONLINE = OFF`, `MAXDOP = 1`, and the data to sort fully fits in the query workspace memory | Full |
4853
| All other cases | Partial |
4954

50-
In the first case when both `ONLINE = ON` and `MAXDOP = 1`, the sort isn't limited by the query workspace memory because an online build of an ordered columnstore index uses the `tempdb` database to spill the data that doesn't fit in memory. This approach can make the index build process slower due to the additional `tempdb` I/O. However, because the index build is performed online, queries can continue using the existing index while the new ordered index is being built.
55+
In the first case when both `ONLINE = ON` and `MAXDOP = 1`, the sort isn't limited by the query workspace memory because an online build of an ordered columnstore index uses the `tempdb` database to spill the data that doesn't fit in memory. This approach can make the index build process slower due to the additional `tempdb` I/O, and requires sufficient free space in `tempdb`. However, because the index build is performed online, queries can continue using the existing index while the new ordered index is being built.
5156

5257
Similarly, with an offline rebuild of a partitioned columnstore index, the rebuild is done one partition at a time. Other partitions remain available for queries.
5358

5459
When `MAXDOP` is greater than 1, each thread used for ordered columnstore index build works on a subset of data and sorts it locally. There's no global sorting across data sorted by different threads. Using parallel threads can reduce the time to create the index, but it results in more overlapping segments than when using a single thread.
5560

56-
> [!TIP]
57-
> Even if the sort in an ordered columnstore index is partial, segments can still be eliminated (skipped). A full sort isn't required to gain query performance benefits if a partial sort avoids many segment overlaps.
58-
>
59-
> To find the number of overlapping and non-overlapping segments in an ordered columnstore index, see the [Determine the sort quality for an ordered columnstore index](#determine-the-sort-quality-for-an-ordered-columnstore-index) example.
60-
6161
You can create or rebuild ordered columnstore indexes online only in some SQL platforms and SQL Server versions. For more information, see [Feature summary for product releases](columnstore-indexes-what-s-new.md#feature-summary-for-product-releases).
6262

6363
In SQL Server, online index operations aren't available in all editions. For more information, see [Editions and supported features of SQL Server 2025](../../sql-server/editions-and-components-of-sql-server-2025.md) and [Perform index operations online](perform-index-operations-online.md).
6464

65-
### Add new data or update existing data
66-
67-
The new data resulting from a DML batch or a bulk load operation on an ordered columnstore index is sorted within that batch only. There's no global sorting that includes existing data in the table. To reduce segment overlaps after inserting new data or updating existing data, rebuild the index.
68-
6965
## Query performance
7066

71-
The performance gain from an ordered columnstore index depends on the query patterns, the size of data, the sort quality, and the compute resources available for query execution.
67+
The performance gain from an ordered columnstore index depends on the query patterns, the size of data, the number of overlapping segments, and the compute resources available for query execution.
7268

7369
Queries with the following patterns typically run faster with ordered columnstore indexes:
7470

7571
- Queries that have equality, inequality, or range predicates.
7672
- Queries where the predicate columns and the ordered CCI columns are the same.
7773

78-
In this example, table `T1` has a clustered columnstore index ordered in the sequence of `Col_C`, `Col_B`, and `Col_A`.
74+
In the following example, table `T1` has a clustered columnstore index with `Col_C`, `Col_B`, and `Col_A` as ordered columns.
7975

8076
```sql
81-
CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI
77+
CREATE CLUSTERED COLUMNSTORE INDEX OrderedCCI
8278
ON T1
83-
ORDER(Col_C, Col_B, Col_A);
79+
ORDER (Col_C, Col_B, Col_A);
8480
```
8581

86-
The performance of query 1 and 2 can benefit from ordered columnstore index more than query 3 and 4, because they reference all the ordered columns.
82+
Query 1 benefits from the ordered columnstore index more than queries 2 and 3, because query 1 references all the ordered columns in its predicate.
8783

8884
```sql
8985
-- query 1
@@ -97,18 +93,11 @@ WHERE Col_C = 'c'
9793
SELECT *
9894
FROM T1
9995
WHERE Col_B = 'b'
100-
AND Col_C = 'c'
10196
AND Col_A = 'a';
10297

10398
-- query 3
10499
SELECT *
105100
FROM T1
106-
WHERE Col_B = 'b'
107-
AND Col_A = 'a';
108-
109-
-- query 4
110-
SELECT *
111-
FROM T1
112101
WHERE Col_A = 'a'
113102
AND Col_C = 'c';
114103
```
@@ -117,6 +106,12 @@ WHERE Col_A = 'a'
117106

118107
The performance of a data load into a table with an ordered columnstore index is similar to a partitioned table. Loading data can take longer than with a non-ordered columnstore index because of the data sorting operation, but queries can run faster afterwards.
119108

109+
### Add new data or update existing data
110+
111+
The new data resulting from a DML batch or a bulk load operation on a table with an ordered columnstore index is sorted within that batch only. There's no global sorting that includes existing data in the table because compressed rowgroups in a columnstore index are immutable.
112+
113+
To reduce segment overlap after inserting new data or updating existing data, rebuild the columnstore index.
114+
120115
## Examples
121116

122117
### Create an ordered columnstore index
@@ -171,7 +166,9 @@ ORDER(Column1, Column2)
171166
WITH (DROP_EXISTING = ON);
172167
```
173168

174-
### Create an ordered clustered columnstore index online with full sort on a heap table
169+
<a id="create-an-ordered-clustered-columnstore-index-online-with-full-sort-on-a-heap-table"></a>
170+
171+
### Create an ordered clustered columnstore index online with full order on a heap table
175172

176173
```sql
177174
CREATE CLUSTERED COLUMNSTORE INDEX OCCI
@@ -180,7 +177,9 @@ ORDER(Column1)
180177
WITH (ONLINE = ON, MAXDOP = 1);
181178
```
182179

183-
### Rebuild an ordered clustered columnstore index online with full sort
180+
<a id="rebuild-an-ordered-clustered-columnstore-index-online-with-full-sort"></a>
181+
182+
### Rebuild an ordered clustered columnstore index online with full order
184183

185184
```sql
186185
CREATE CLUSTERED COLUMNSTORE INDEX OCCI
@@ -189,56 +188,6 @@ ORDER(Column1)
189188
WITH (DROP_EXISTING = ON, ONLINE = ON, MAXDOP = 1);
190189
```
191190

192-
### Determine the sort quality for an ordered columnstore index
193-
194-
This example determines the sort quality for all ordered columnstore indexes in the database. In this example, sort quality is defined as a ratio of non-overlapping segments to all segments for each order column, expressed as a percentage.
195-
196-
```sql
197-
WITH ordered_column_segment
198-
AS (SELECT p.object_id,
199-
i.name AS index_name,
200-
ic.column_store_order_ordinal,
201-
cls.row_count,
202-
cls.column_id,
203-
cls.min_data_id,
204-
cls.max_data_id,
205-
LAG(max_data_id) OVER (
206-
PARTITION BY cls.partition_id, ic.column_store_order_ordinal
207-
ORDER BY cls.min_data_id
208-
) AS prev_max_data_id,
209-
LEAD(min_data_id) OVER (
210-
PARTITION BY cls.partition_id, ic.column_store_order_ordinal
211-
ORDER BY cls.min_data_id
212-
) AS next_min_data_id
213-
FROM sys.partitions AS p
214-
INNER JOIN sys.indexes AS i
215-
ON p.object_id = i.object_id
216-
AND p.index_id = i.index_id
217-
INNER JOIN sys.column_store_segments AS cls
218-
ON p.partition_id = cls.partition_id
219-
INNER JOIN sys.index_columns AS ic
220-
ON ic.object_id = p.object_id
221-
AND ic.index_id = p.index_id
222-
AND ic.column_id = cls.column_id
223-
WHERE ic.column_store_order_ordinal > 0)
224-
SELECT OBJECT_SCHEMA_NAME(object_id) AS schema_name,
225-
OBJECT_NAME(object_id) AS object_name,
226-
index_name,
227-
INDEXPROPERTY(object_id, index_name, 'IsClustered') AS is_clustered_column_store,
228-
COL_NAME(object_id, column_id) AS order_column_name,
229-
column_store_order_ordinal,
230-
SUM(row_count) AS row_count,
231-
SUM(is_overlapping_segment) AS overlapping_segments,
232-
COUNT(1) AS total_segments,
233-
(1 - SUM(is_overlapping_segment) / COUNT(1)) * 100 AS order_quality_percent
234-
FROM ordered_column_segment
235-
CROSS APPLY (SELECT CAST (IIF (prev_max_data_id > min_data_id
236-
OR next_min_data_id < max_data_id, 1, 0) AS FLOAT) AS is_overlapping_segment
237-
) AS ios
238-
GROUP BY object_id, index_name, column_id, column_store_order_ordinal
239-
ORDER BY schema_name, object_name, index_name, column_store_order_ordinal;
240-
```
241-
242191
## Related content
243192

244193
- [Columnstore index design guidelines](../sql-server-index-design-guide.md#columnstore_index)

docs/reporting-services/report-data/oracle-connection-type-ssrs.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ Register Unmanaged ODP.NET:
6262
C:\oracle64\product\18.0.0\client_1\odp.net\bin\4\OraProvCfg.exe /action:config /force /product:odp /frameworkversion:v4.0.30319 /providerpath:C:\oracle64\product\18.0.0\client_1\odp.net\bin\4\Oracle.DataAccess.dll
6363
```
6464
65-
## 32-bit drivers for Microsoft Report Builder
65+
## 32-bit drivers for Report Builder
6666
6767
[Microsoft Report Builder](https://www.microsoft.com/download/details.aspx?id=53613) uses Managed ODP.NET for authoring paginated (RDL) reports. You only need the following steps for Oracle ODAC drivers 12.2 and later. Otherwise, they install by default to a non-machine-wide configuration for a new Oracle home installation.
6868
@@ -83,10 +83,10 @@ Register Managed ODP.NET:
8383
C:\oracle32\product\18.0.0\client_1\odp.net\bin\4\OraProvCfg.exe /action:config /force /product:odpm /frameworkversion:v4.0.30319 /providerpath:C:\oracle32\product\18.0.0\client_1\odp.net\managed\common\Oracle.ManagedDataAccess.dll
8484
```
8585
86-
## 64-bit drivers for Power BI Report Builder
86+
## 64-bit drivers for Report Builder
8787
8888
> [!NOTE]
89-
> The following instructions apply to Power BI Report Builder version 15.7.01678.0001 and later. For versions before 15.7.01678.0001, follow the **32-bit drivers for Microsoft Report Builder** instructions.
89+
> The following instructions apply to Power BI Report Builder version 15.7.01678.0001 and later as well as Microsoft Report Builder version 15.1.20318.47 and later. For previous versions, follow the **32-bit drivers for Report Builder** instructions.
9090
9191
[Power BI Report Builder](https://www.microsoft.com/download/details.aspx?id=105942) uses Managed ODP.NET for authoring paginated (RDL) reports. You only need the following steps for Oracle ODAC drivers 12.2 and later. Otherwise, they install by default to a non-machine-wide configuration for a new Oracle home installation.
9292

0 commit comments

Comments
 (0)