Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft 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 = ONhem deMAXDOP = 1seçeneklerini kullanın. Bu, tam olarak sıralanmış bir dizin oluşturur. - Çevrimiçi dizin derlemesi kullanılamıyorsa
MAXDOP = 1seç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);
İlgili içerik
- Columnstore dizin tasarım yönergeleri
- Columnstore dizinleri - veri yükleme rehberi
- Gerçek zamanlı operasyonel analiz için columnstore dizinlerini kullanmaya başlama
- Veri ambarında sütun deposu dizinleri
- Sorgu performansını geliştirmek ve kaynak tüketimini azaltmak için dizin bakımını iyileştirme
- Columnstore dizin mimarisi
- İNDEKS OLUŞTUR (Transact-SQL)
- alter index (Transact-SQL)