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ı

Sıralı columnstore dizinleri, sorgu koşuluyla eşleşmeyen büyük miktarlardaki sıralı verileri atlayarak daha hızlı performans sağlayabilir. Verileri sıralı bir columnstore dizinine yüklemek ve dizin yeniden oluşturma yoluyla düzeni korumak sıralı olmayan bir dizinden daha uzun sürerken, dizine alınan sorgular sıralı columnstore ile daha hızlı çalışabilir.

Sorgu bir columnstore dizinini okuduğunda, Veritabanı Altyapısı her sütun kesiminde depolanan en düşük ve en yüksek değerleri denetler. İşlem, sorgu koşulunun sınırlarının dışında kalan kesimleri ortadan kaldırır. Başka bir deyişle, diskten veya bellekten veri okurken bu kesimleri atlar. Okunacak kesim sayısı ve toplam boyutları önemli ölçüde daha küçükse sorgu daha hızlı tamamlanır.

Belirli veri yükü örüntülerinde, columnstore dizinindeki veriler ORDER tümcesi belirtilmeden örtük olarak sıralanabilir. Örneğin, veri yüklemeleri her gün gerçekleşirse veriler bir load_date sütuna göre sıralanabilir. Bu durumda, sorgu performansı zaten bu örtük sıralamadan faydalanabilir. columnstore dizinini load_date yan tümcesinde aynı ORDER sütuna açıkça göre sıralamak büyük olasılıkla ek bir performans avantajı sağlamaz.

Çeşitli SQL platformlarında ve SQL Server sürümlerinde sıralı columnstore dizini kullanılabilirliği için bkz. Sıralı columnstore 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 yürütme işlemi sorgu koşulunun sınırlarının dışında kalan segmentleri atlayabilir.

Columnstore indeksi sıralı olmadığında, indeks yapıcı 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 gerekli verileri elde etmek için daha fazla segment okumasına neden olabileceği anlamına gelir. Sonuç olarak sorguların tamamlanması daha uzun sürebilir.

ORDER deyiminde yan tümcesini belirttiğinizde, Veritabanı Altyapısı, dizin oluşturma işlemi verileri segmentlere sıkıştırmadan önce her bir sıralama sütununun her segmentindeki verileri sıralar. Sıralanmış verilerle, segment çakışmaları azaltılır veya ortadan kaldırılır, bu da sorguların daha verimli bir segment eleme işlemi yapmasına olanak sağlar, böylece daha az veri segmenti bulunur ve okunacak veri daha az olur, bu nedenle performans daha hızlı olur.

Segment çakışmalarını azaltma ve sorgu performansını geliştirme

Sıralı bir columnstore dizini oluşturduğunuzda, Veritabanı Altyapısı verileri en iyi çaba temelinde sıralar. 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, columnstore dizinindeki bir sütundaki sıra, segment çakışması olmadan dolu veya bazı segment çakışmalarıyla kısmi olabilir. Daha az çakışan kesim olduğunda, sütun sırası avantajından yararlanabilen bir sorgu daha hızlı çalışır.

Tavsiye

Columnstore dizininin bir sütunundaki sıra kısmi olsa bile, segmentler yine de ortadan kaldırılabilir (atlanabilir). Birçok segmentin çakışmasını önleyen kısmi bir düzen, performans avantajları elde etmek için tam bir dizi gerektirmez.

Aşağıdaki tabloda, dizin derleme seçeneklerine bağlı olarak sıralı bir columnstore dizini oluştururken veya yeniden oluştururken elde edilen sıra türü açıklanır.

Önkoşullar Sipariş türü
ONLINE = ON ve MAXDOP = 1 Full
ONLINE = OFF, MAXDOP = 1ve sıralanacak veriler sorgu çalışma alanı belleğine tam olarak sığar Full
Diğer tüm durumlar Kısmi

İlk durumda hem ONLINE = ON hem de MAXDOP = 1 olduğunda, sıralama sorgu çalışma alanı belleğiyle sınırlı değildir çünkü sıralı bir columnstore dizininin çevrimiçi oluşturulması, belleğe sığmayan verileri dökmek için tempdb veritabanını kullanır. Bu yaklaşım, ek tempdb G/Ç nedeniyle dizin derleme işlemini yavaşlatabilir ve tempdb içinde de yeterli boş alan gerektirir. Ancak, dizin derlemesi çevrimiçi gerçekleştirildiğinden, sorgular yeni sıralı dizin oluşturulurken mevcut dizini kullanmaya devam edebilir.

Benzer şekilde, bölümlenmiş bir columnstore dizini çevrimdışı yeniden oluşturulduğunda, yeniden oluşturma işlemi her seferinde bir bölüm üzerinde gerçekleştirilir. Diğer bölümler sorgular için kullanılabilir durumda kalır.

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 kesimle sonuçlanabilir.

Sıralı columnstore dizinlerini yalnızca bazı SQL platformlarında ve SQL Server sürümlerinde çevrimiçi olarak oluşturabilir veya yeniden oluşturabilirsiniz. Daha fazla bilgi için bkz. Ürün sürümleri için özellik özeti.

SQL Server'da, çevrimiçi dizin işlemleri tüm sürümlerde kullanılamaz. Daha fazla bilgi için bkz. SQL Server 2025'in sürümleri ve desteklenen özellikleri ve Dizin işlemlerini çevrimiçi gerçekleştirme.

Belirli veri türleri ve kodlamalar için sys.column_store_segments sistem görünümü, segment çakışmalarının sayısını bulmanıza yardımcı olabilir. Bu görünümü temel alan örnek betik, mevcut veritabanındaki tüm columnstore dizinlerinin uygun sütunlarının sıra kalitesini belirler.

Sorgu performansı

Sıralı bir columnstore dizininden elde edilen performans kazancı sorgu desenlerine, verilerin boyutuna, çakışan kesim sayısına ve sorgu yürütme için kullanılabilir 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.

Aşağıdaki örnekte, tabloda T1 , Col_Cve Col_B sıralı sütunlar olarak kümelenmiş bir columnstore dizini Col_Avardır.

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

Sorgu 1, sıralı columnstore dizininden 2 ve 3'ten daha fazla sorgudan yararlanır, çünkü sorgu 1 koşulundaki tüm sıralı sütunlara başvurur.

-- 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_A = 'a';

-- query 3
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.

Yeni veri ekleme veya mevcut verileri güncelleştirme

Sıralı bir columnstore dizinine sahip tablodaki DML işlemi veya toplu yükleme işleminden elde edilen yeni veriler, yalnızca o parti içinde sıralanır. Bir columnstore dizinindeki sıkıştırılmış satır grupları sabit olduğundan tablodaki mevcut verileri içeren genel sıralama yoktur.

Yeni veri ekledikten veya mevcut verileri güncelleştirdikten sonra segment çakışmasını azaltmak için columnstore dizinini yeniden oluşturun.

Examples

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);

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

SELECT OBJECT_SCHEMA_NAME(c.object_id) AS schema_name,
       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;

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);

Çevrimiçi tam sıralı bir kümelenmiş columnstore dizinini bir yığın tablosunda oluşturma

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

Tam sıralamayla çevrimiçi olarak sıralı bir kümelenmiş columnstore dizinini yeniden oluşturma

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