Aracılığıyla paylaş


Sıralı columnstore dizinleriyle performans ayarlama

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'teki SQL veritabanı

Verimli segment eleme etkinleştirerek, sıralı columnstore dizinleri sorgu koşuluyla eşleşmeyen büyük miktarlardaki sıralı verileri atlayarak daha hızlı performans sağlar. Verileri sıralı bir columnstore dizinine yüklemek ve dizin yeniden derlemeleri aracılığıyla sıralı tutmak, veri sıralama işlemi nedeniyle sıralı olmayan bir dizinden daha uzun sürebilir, ancak sıralı columnstore dizinleri ile sorgular daha sonra daha hızlı çalışabilir.

Kullanıcılar bir columnstore tablosunu sorguladığında, iyileştirici her segmentte depolanan en düşük ve en yüksek değerleri denetler. Sorgu koşulunun sınırlarının dışında olan kesimler diskten belleğe okunmuyor. Okunacak kesim sayısı ve toplam boyutları daha küçükse sorgu daha hızlı tamamlanabilir.

Sıralı sütun deposu dizini kullanılabilirliği için bkz. Sıralı sütun deposu dizini kullanılabilirliği.

Columnstore dizinleri için son eklenen özellikler hakkında daha fazla bilgi için bkz. Columnstore dizinlerindeki yenilikler.

Düzenli ve düzensiz columnstore dizini karşılaştırması

Bir columnstore dizininde, her satır grubunun her sütunundaki veriler ayrı bir segmentte sıkıştırılır. Her kesim, en düşük ve en yüksek değerlerini açıklayan meta veriler içerdiğinden, sorgu koşulunun sınırlarının dışında olan kesimler sorgu yürütme sırasında diskten okunamaz.

Bir columnstore dizini sıralanmadığında, dizin oluşturma aracı verileri segmentlere sıkıştırmadan önce sıralamaz. Bu, çakışan değer aralıklarına sahip segmentlerin oluşabileceği ve sorguların diskten daha fazla kesim okumasına ve tamamlanmasının daha uzun sürmesine neden olabileceği anlamına gelir.

Sıralı bir columnstore dizini oluşturduğunuzda, Veritabanı Altyapısı mevcut verileri dizin oluşturucusu bunları segmentlere sıkıştırmadan önce belirttiğiniz sıralama anahtarlarına göre sıralar. Sıralanmış verilerle, segment çakışması azaltılır veya ortadan kalkar, böylece diskten okunacak segment sayısı az olduğundan sorguların daha verimli bir segment eleme ve dolayısıyla daha hızlı performans elde edilmesi sağlanır.

Kullanılabilir belleğe, veri boyutuna, paralellik derecesine, dizin türüne (kümelenmiş ve kümelenmemiş) ve dizin derleme türüne (çevrimdışı veya çevrimiçi) bağlı olarak, sıralı columnstore dizinleri için sıralama dolu (segment çakışması yok) veya kısmi (bazı segment çakışması) olabilir. Örneğin, kullanılabilir bellek tam sıralama için yetersiz olduğunda kısmi sıralama gerçekleşir. Sıralı columnstore dizini kullanan sorgular genellikle sıralı dizin kısmi sıralama kullanılarak oluşturulmuş olsa bile sıralı olmayan bir dizinden daha hızlı yürütülür.

Hem ONLINE = ON hem de MAXDOP = 1 seçenekleriyle oluşturulan veya yeniden oluşturulan sıralı kümelenmiş columnstore dizinleri için tam sıralama sağlanır. Bu durumda, sıralama kullanılabilir bellekle sınırlı değildir çünkü belleğe sığmayan verileri dökmek için tempdb veritabanını kullanır. Bu, ek tempdb G/Ç nedeniyle dizin derleme işlemini yavaşlatabilir. Ancak, çevrimiçi dizin yeniden derlemesi ile sorgular yeni sıralı dizin yeniden oluşturulurken mevcut dizini kullanmaya devam edebilir.

Sıralanacak veri miktarı kullanılabilir belleğe tam olarak sığacak kadar küçükse hem ONLINE = OFF hem de MAXDOP = 1 seçenekleriyle oluşturulan veya yeniden oluşturulan sıralı kümelenmiş ve kümelenmemiş columnstore dizinleri için de tam sıralama sağlanabilir.

Diğer tüm durumlarda, sıralı columnstore dizinlerindeki sıralama kısmidir.

Note

Şu anda sıralı columnstore dizinleri yalnızca Azure SQL Veritabanı'nda, Azure SQL Yönetilen ÖrneğiAUTD'de ve SQL Server 2025'te (17.x) çevrimiçi olarak oluşturulabilir veya yeniden oluşturulabilir.

Bir sütunun segment aralıklarını denetlemek ve herhangi bir segment çakışması olup olmadığını belirlemek için aşağıdaki sorguyu kullanın; yer tutucuları şema, tablo ve sütun adlarınızla değiştirin:

SELECT OBJECT_SCHEMA_NAME(o.object_id) AS schema_name,
       o.name AS table_name,
       cols.name AS column_name,
       pnp.index_id,
       cls.row_count,
       pnp.data_compression_desc,
       cls.segment_id,
       cls.column_id,
       cls.min_data_id,
       cls.max_data_id
FROM sys.partitions AS pnp
INNER JOIN sys.tables AS t
ON pnp.object_id = t.object_id
INNER JOIN sys.objects AS o
ON t.object_id = o.object_id
INNER JOIN sys.column_store_segments AS cls
ON pnp.partition_id = cls.partition_id
INNER JOIN sys.columns AS cols
ON o.object_id = cols.object_id
   AND
   cls.column_id = cols.column_id
WHERE OBJECT_SCHEMA_NAME(o.object_id) = '<Schema Name>'
      AND
      o.name = '<Table Name>'
      AND
      cols.name = '<Column Name>'
ORDER BY o.name, pnp.index_id, cls.min_data_id;

Örneğin, tam olarak sıralanmış bir columnstore dizini için bu sorgunun çıktısı aşağıdaki gibi görünebilir. Farklı segmentler için min_data_id ve max_data_id sütunlarında çakışma olmadığını unutmayın.

schema_name table_name column_name index_id row_count data_compression_desc segment_id column_id min_data_id max_data_id
----------- ---------- ----------- -------- --------- --------------------- ---------- --------- ----------- -----------
dbo         Table1     Column1     1        479779    COLUMNSTORE           0          1         -17         1469515
dbo         Table1     Column1     1        887658    COLUMNSTORE           1          1         1469516     2188146
dbo         Table1     Column1     1        930144    COLUMNSTORE           2          1         2188147     11072928

Note

Sıralı bir columnstore dizininde, aynı DML toplu işleminden veya veri yükleme işlemlerinden elde edilen yeni veriler yalnızca bu toplu iş içinde sıralanır. Tablodaki mevcut verileri içeren genel sıralama yoktur.

Yeni veri ekledikten veya mevcut verileri güncelleştirdikten sonra dizindeki verileri sıralamak için dizini yeniden oluşturun.

Bölümlenmiş columnstore dizininin çevrimdışı yeniden derlemesi için yeniden derleme işlemi bir kerede bir bölüm halinde gerçekleştirilir. Yeniden derlenen bölümdeki veriler, söz konusu bölüm için yeniden oluşturma tamamlanana kadar kullanılamaz.

Veriler çevrimiçi yeniden derleme sırasında kullanılabilir durumda kalır. Daha fazla bilgi için bkz. Dizin işlemlerini çevrimiçigerçekleştirme.

Sorgu performansı

Sıralı bir columnstore dizininden elde edilen performans artışı sorgu desenlerine, verilerin boyutuna, verilerin ne kadar iyi sıralandığına, segmentlerin fiziksel yapısına ve sorgu yürütme için kullanılabilen işlem kaynaklarına bağlıdır.

Aşağıdaki desenlere sahip sorgular genellikle sıralı columnstore dizinleriyle daha hızlı çalışır.

  • Eşitlik, eşitsizlik veya aralık koşullarını içeren sorgular.
  • Koşul belirten sütunlar ve sıralı CCI sütunlarının aynı olduğu sorgular.

Bu örnekte, T1 tablosu Col_C, Col_Bve Col_Asırasına göre düzenlenmiş bir kümelenmiş columnstore indeksine sahiptir.

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON T1
ORDER (Col_C, Col_B, Col_A);

Sorgu 1 ve 2'nin performansı, tüm sıralı sütunlara başvurdukları için sıralı sütun deposu dizininden, sorgu 3 ve 4'e kıyasla daha fazla faydalanabilir.

-- query 1
SELECT *
FROM T1
WHERE Col_C = 'c' AND Col_B = 'b' AND Col_A = 'a';

-- query 2
SELECT *
FROM T1
WHERE Col_B = 'b' AND Col_C = 'c' AND Col_A = 'a';

-- query 3
SELECT *
FROM T1
WHERE Col_B = 'b' AND Col_A = 'a';

-- query 4
SELECT *
FROM T1
WHERE Col_A = 'a' AND Col_C = 'c';

Veri yükleme performansı

Sıralı columnstore dizini olan bir tabloya veri yükünün performansı, bölümlenmiş tabloya benzer. Veri sıralama işlemi nedeniyle verilerin yüklenmesi sıralı olmayan bir columnstore dizininden daha uzun sürebilir, ancak sorgular daha sonra daha hızlı çalışabilir.

Segment çakışmalarını azaltma

Çakışan kesimlerin sayısı sıralı columnstore dizin derlemesi sırasında sıralanacak verilerin boyutuna, kullanılabilir belleğe ve en yüksek paralellik derecesi (MAXDOP) ayarına bağlıdır. Aşağıdaki stratejiler segment çakışmasını azaltır, ancak dizin derleme işleminin daha uzun sürmesini sağlayabilir.

  • Çevrimiçi dizin derlemesi varsa, sıralı bir kümelenmiş columnstore dizini oluştururken hem ONLINE = ON hem de MAXDOP = 1 seçeneklerini kullanın. Bu, tam olarak sıralanmış bir dizin oluşturur.
  • Çevrimiçi dizin derlemesi kullanılamıyorsa MAXDOP = 1 seçeneğini kullanın.
  • Verileri yüklemeden önce sıralama anahtarlarıyla önceden sıralayın.

MAXDOP 1'den büyük olduğunda, sıralı columnstore dizin derlemesi için kullanılan her iş parçacığı bir veri alt kümesi üzerinde çalışır ve yerel olarak sıralar. Farklı iş parçacıklarına göre sıralanan veriler arasında küresel bir sıralama yoktur. Paralel iş parçacıklarının kullanılması, dizini oluşturma süresini kısaltabilir, ancak tek bir iş parçacığı kullanıldığından daha fazla çakışan kesim oluşturur. Tek iş parçacıklı bir işlem kullanmak en yüksek sıkıştırma kalitesini sunar. MAXDOP komutuyla CREATE INDEX belirtebilirsiniz.

Examples

Sıralı sütunları ve sıralama sırasını denetleme

SELECT object_name(c.object_id) AS table_name,
       c.name AS column_name,
       i.column_store_order_ordinal
FROM sys.index_columns AS i
INNER JOIN sys.columns AS c
ON i.object_id = c.object_id
   AND
   c.column_id = i.column_id
WHERE column_store_order_ordinal <> 0;

Sıralı columnstore dizini oluşturun

Kümelenmiş sıralı sütun deposu dizini

CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER (Column1, Column2);

Kümelenmemiş sıralı sütun deposu dizini

CREATE NONCLUSTERED COLUMNSTORE INDEX ONCCI
ON dbo.Table1
(
Column1, Column2, Column3
)
ORDER (Column1, Column2);

Sipariş sütunlarını ekleyin veya kaldırın ve mevcut bir sıralı columnstore dizinini yeniden oluşturun.

Kümelenmiş sıralı sütun deposu dizini

CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER (Column1, Column2)
WITH (DROP_EXISTING = ON);

Kümelenmemiş sıralı sütun deposu dizini

CREATE NONCLUSTERED COLUMNSTORE INDEX ONCCI
ON dbo.Table1
(
Column1, Column2, Column3
)
ORDER (Column1, Column2)
WITH (DROP_EXISTING = ON);

Yığın tablosunda tam sıralama ile çevrimiçi olarak sıralı kümelenmiş columnstore dizini oluşturun

CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER (Column1)
WITH (ONLINE = ON, MAXDOP = 1);

Çevrimiçi olarak sıralı kümelenmiş sütun deposu dizinini tam sıralamayla yeniden oluşturma

CREATE CLUSTERED COLUMNSTORE INDEX OCCI
ON dbo.Table1
ORDER (Column1)
WITH (DROP_EXISTING = ON, ONLINE = ON, MAXDOP = 1);