Seyrek sütunları kullanma
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri
Microsoft Fabric'te Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
SQL veritabanı
Seyrek sütunlar, null değerler için iyileştirilmiş depolama alanına sahip sıradan sütunlardır. Seyrek sütunlar, NULL değerler için alan gereksinimlerini azaltırken NULL olmayan değerleri geri almak için daha fazla ek yük gerektirir. Kaydedilen alanın en az yüzde 20 ile yüzde 40 arasında olduğu durumlarda seyrek sütunlar kullanmayı düşünün. CREATE TABLE veya ALTER TABLE deyimleri kullanılarak seyrek sütunlar ve sütun kümeleri tanımlanır.
Seyrek sütunlar sütun kümeleri ve filtrelenmiş dizinlerle kullanılabilir:
Sütun kümeleri
INSERT, UPDATE ve DELETE ifadeleri, seyrek sütunlara isimleriyle referans verilebilir. Bununla birlikte, bir tablonun tek bir XML sütununda birleştirilen tüm seyrek sütunlarını görüntüleyebilir ve bunlarla çalışabilirsiniz. Bu sütuna sütun kümesi adı verilir. Sütun kümeleri hakkında daha fazla bilgi için bkz. Sütun Kümelerini Kullanma.
Filtrelenmiş dizinler
Seyrek sütunlarda çok sayıda null değerli satır olduğundan, bunlar özellikle filtrelenmiş dizinler için uygundur. Seyrek sütundaki filtrelenmiş dizin yalnızca değerleri doldurulmuş satırları dizine alabilir. Bu, daha küçük ve daha verimli bir dizin oluşturur. Daha fazla bilgi için bkz. Filtrelenmiş Dizinler Oluşturma.
Seyrek sütunlar ve filtrelenmiş dizinler, Windows SharePoint Services gibi uygulamaların SQL Server kullanarak çok sayıda kullanıcı tanımlı özelliği verimli bir şekilde depolamasına ve erişmesine olanak tanır.
Seyrek Sütunların Özellikleri
Seyrek sütunlar aşağıdaki özelliklere sahiptir:
SQL Server Veritabanı Altyapısı, bir sütun tanımında SPARSE anahtar sözcüğünü kullanarak bu sütundaki değerlerin depolanmasını iyileştirir. Bu nedenle, tablodaki herhangi bir satır için sütun değeri NULL olduğunda, değerler depolama gerektirmez.
Seyrek sütun içeren bir tablonun katalog görünümleri, tipik bir tabloyla aynıdır.
sys.columns
katalog görünümü, tablodaki her sütun için bir satır ve tanımlanmışsa bir sütun kümesi içerir.Seyrek sütunlar, mantıksal tablo yerine depolama katmanının bir özelliğidir. Bu nedenle
SELECT ... INTO
deyimi seyrek sütun özelliği üzerinden yeni bir tabloya kopyalamaz.COLUMNS_UPDATED işlevi, DML eylemi sırasında güncellenen tüm sütunları belirtmek için bir varbinary değeri döndürür. COLUMNS_UPDATED işlevi tarafından döndürülen bitler aşağıdaki gibidir:
Seyrek sütun açıkça güncelleştirildiğinde, bu seyrek sütunun karşılık gelen biti 1, sütun kümesinin biti ise 1 olarak ayarlanır.
Bir sütun kümesi açıkça güncelleştirildiğinde, sütun kümesinin biti 1 olarak ayarlanır ve bu tablodaki tüm seyrek sütunların bitleri 1 olarak ayarlanır.
Ekleme işlemleri için tüm bitler 1 olarak ayarlanır.
Sütun kümeleri hakkında daha fazla bilgi için bkz. Sütun Kümelerini Kullanma.
Aşağıdaki veri türleri SPARSE olarak belirtilemez:
coğrafya
geometri
resim
ntext
Metin
zaman damgası
kullanıcı tanımlı veri türleri
Veri türüne göre tahmini alan tasarrufu
NULL olmayan değerler için, SPARSE olarak işaretlenmemiş aynı verilere kıyasla seyrek sütunlar daha fazla depolama alanı gerektirir. Aşağıdaki tablolarda her veri türü için alan kullanımı gösterilmektedir. NULL Yüzdesi sütunu, yüzde 40 net alan tasarrufu için verilerin yüzde kaçının NULL olması gerektiğini gösterir.
Fixed-Length Veri Türleri
Veri tipi | Seyrek olmayan baytlar | Seyrek baytlar | NULL yüzdesi |
---|---|---|---|
bit | 0.125 | 5 | 98% |
tinyint | 1 | 5 | 86% |
smallint | 2 | 6 | 76% |
int | 4 | 8 | 64% |
bigint | 8 | 12 | 52% |
Gerçek | 4 | 8 | 64% |
float | 8 | 12 | 52% |
küçük para | 4 | 8 | 64% |
para | 8 | 12 | 52% |
smalldatetime | 4 | 8 | 64% |
tarih ve saat | 8 | 12 | 52% |
benzersiz tanımlayıcı | 16 | 20 | 43% |
tarih | 3 | 7 | 69% |
Hassasiyet-Dependent-Length Veri Türleri
Veri tipi | Seyrek olmayan baytlar | Seyrek baytlar | NULL yüzdesi |
---|---|---|---|
datetime2(0) | 6 | 10 | 57% |
datetime2(7) | 8 | 12 | 52% |
zaman(0) | 3 | 7 | 69% |
time(7) | 5 | 9 | 60% |
datetimetoffset(0) | 8 | 12 | 52% |
datetimetoffset (7) | 10 | 14 | 49% |
ondalıklı/sayısal(1,s) | 5 | 9 | 60% |
ondalık/sayısal(38,s) | 17 | 21 | 42% |
vardecimal(p,s) | ondalık türünü muhafazakar bir tahmin olarak kullanın. |
Veri Bağımlı Uzunlukta Veri Türleri
Veri tipi | Seyrek olmayan baytlar | Seyrek baytlar | NULL yüzdesi |
---|---|---|---|
sql_variant | Temel alınan veri türüne göre değişir | ||
varchar veya char | 2* | 4* | 60% |
nvarchar veya nchar | 2* | 4*+ | 60% |
varbinary veya binary | 2* | 4* | 60% |
xml | 2* | 4* | 60% |
hierarchyid | 2* | 4* | 60% |
*Uzunluk, türdeki verilerin ortalamasına eşittir, artı 2 veya 4 bayttır.
In-Memory seyrek sütun güncellemeleri için gereken ek yük
Seyrek sütunlu tablolar tasarlarken, bir satır güncellendiğinde, tablodaki her bir boş olmayan seyrek sütun için ek 2 bayt ek yük gerektiğini unutmayın. Bu ek bellek gereksiniminin bir sonucu olarak, bu bellek yükü de dahil olmak üzere toplam satır boyutu 8019'u aştığında ve satırdan hiçbir sütun gönderilemiyorsa güncelleştirmeler beklenmedik bir şekilde 576 hatasıyla başarısız olabilir.
bigint türünde 600 seyrek sütun içeren bir tablo örneğini düşünün. Boş olmayan 571 sütun varsa diskin toplam boyutu 571 * 12 = 6852 bayttır. Ek satır yükü ve seyrek sütun başlığı eklendikten sonra, bu yaklaşık 6895 bayta kadar artar. Sayfada hala diskte yaklaşık 1124 bayt kullanılabilir alan var. Bu, ek sütunların başarıyla güncelleştirilebileceği izlenimini verebilir. Ancak güncelleştirme sırasında bellekte 2*(null olmayan seyrek sütun sayısı) ek yük vardır. Bu örnekte ek yük de dahil olmak üzere - 2 * 571 = 1142 bayt - diskteki satır boyutunu yaklaşık 8037 bayta yükseltir. Bu boyut, izin verilen en büyük 8019 bayt boyutu aşıyor. Tüm sütunlar sabit uzunlukta veri türleri olduğundan, satırdan ayrılamazlar. Sonuç olarak güncelleştirme 576 hatasıyla başarısız olur.
Seyrek sütunları kullanma kısıtlamaları
Seyrek sütunlar herhangi bir SQL Server veri türünde olabilir ve aşağıdaki kısıtlamalara sahip diğer tüm sütunlar gibi davranabilir:
Seyrek sütun null değeri alabilir olmalı ve ROWGUIDCOL veya IDENTITY özelliklerine sahip olmamalıdır. Seyrek sütun şu veri türlerinden olamaz: metin, ntext, resim, zaman damgası, kullanıcı tanımlı veri türü, geometriveya coğrafya; veya FILESTREAM özniteliğine sahip olabilir.
Seyrek sütun varsayılan değere sahip olamaz.
Seyrek sütun bir kurala bağlanamaz.
Hesaplanan sütun seyrek sütun içerse de, hesaplanan sütun SEYREK olarak işaretlenemez.
Veri maskesi seyrek sütunda tanımlanabilir, ancak sütun kümesinin parçası olan seyrek bir sütunda tanımlanamaz.
Seyrek sütun, kümelenmiş dizinin veya benzersiz bir birincil anahtar dizininin parçası olamaz. Ancak, seyrek sütunlarda tanımlanan hem kalıcı hem de kalıcı olmayan hesaplanan sütunlar kümelenmiş anahtarın parçası olabilir.
Seyrek sütun, kümelenmiş dizinin veya yığının bölüm anahtarı olarak kullanılamaz. Ancak, seyrek sütun, kümelenmemiş dizinin bölüm anahtarı olarak kullanılabilir.
Seyrek sütun, tablo değişkenlerinde ve tablo değerli parametrelerde kullanılan kullanıcı tanımlı bir tablo türünün parçası olamaz.
Seyrek sütunlar veri sıkıştırma ile uyumsuz. Bu nedenle seyrek sütunlar sıkıştırılmış tablolara eklenemez ve seyrek sütun içeren tablolar sıkıştırılamaz.
Bir sütunu seyrekten yoğuna veya yoğundan seyrek hale değiştirmek, sütunun depolama formatının değiştirilmesini gerektirir. SQL Server Veritabanı Altyapısı bu değişikliği gerçekleştirmek için aşağıdaki yordamı kullanır:
Tabloya yeni depolama boyutu ve biçiminde yeni bir sütun ekler.
Tablodaki her satır için, eski sütunda depolanan değeri güncelleştirir ve yeni sütuna kopyalar.
Tablo şemasından eski sütunu kaldırır.
Tabloyu yeniden oluşturur (kümelenmiş dizin yoksa) veya eski sütun tarafından kullanılan alanı geri kazanmak için kümelenmiş dizini yeniden oluşturur.
Not
Satırdaki verilerin boyutu izin verilen en büyük satır boyutunu aştığında 2. adım başarısız olabilir. Bu boyut, eski sütunda depolanan verilerin boyutunu ve yeni sütunda depolanan güncelleştirilmiş verileri içerir. Bu sınır, seyrek sütun içermeyen tablolar için 8060 bayt veya seyrek sütun içeren tablolar için 8018 bayttır. Tüm uygun sütunlar satır dışına gönderilmiş olsa bile bu hata oluşabilir.
Seyrek olmayan bir sütunu seyrek sütun olarak değiştirdiğinizde seyrek sütun null olmayan değerler için daha fazla alan kullanır. Bir satır en yüksek satır boyutu sınırına yakın olduğunda işlem başarısız olabilir.
Seyrek sütunları destekleyen SQL Server teknolojileri
Bu bölümde, seyrek sütunların aşağıdaki SQL Server teknolojilerinde nasıl desteklendiği açıklanmaktadır:
İşlem replikasyonu
İşlem çoğaltması seyrek sütunları destekler, ancak seyrek sütunlarla kullanılabilen sütun kümelerini desteklemez. Sütun kümeleri hakkında daha fazla bilgi için bkz. Sütun Kümelerini Kullanma.
SPARSE özniteliğinin çoğaltması, sp_addarticle kullanılarak veya SQL Server Management Studio'daki Makale Özellikleri iletişim kutusu kullanılarak belirtilen bir şema seçeneği tarafından belirlenir. SQL Server'ın önceki sürümleri seyrek sütunları desteklemez. Verileri önceki bir sürüme çoğaltmanız gerekiyorsa SPARSE özniteliğinin çoğaltılmaması gerektiğini belirtin.
Yayımlanan tablolar için, tabloya yeni seyrek sütun ekleyemez veya var olan bir sütunun seyrek özelliğini değiştiremezsiniz. Böyle bir işlem gerekiyorsa yayını bırakın ve yeniden oluşturun.
Çoğaltmayı birleştirme
Birleştirme çoğaltımı seyrek sütunları veya sütun kümelerini desteklemez.
Değişiklik izleme
Değişiklik izleme seyrek sütunları ve sütun kümelerini destekler. Tablodaki bir sütun kümesi güncelleştirildiğinde, değişiklik izleme bunu satırın tamamına yönelik bir güncelleştirme olarak değerlendirir. Sütun kümesinin güncellenmesi sırasında güncellenen seyrek sütunların tam kümesini elde etmek için ayrıntılı bir değişiklik takibi sağlanmamaktadır. Seyrek sütunlar bir DML deyimi aracılığıyla açıkça güncelleştirilirse, bunlar üzerinde değişiklik izleme normalde çalışır ve değiştirilen sütunların tam kümesini tanımlayabilir.
Veri yakalamayı değiştirme
Değişiklik veri yakalaması seyrek sütunları destekler, ancak sütun kümelerini desteklemez.
Tablo kopyalandığında sütunun seyrek özelliği korunmaz.
Örnekler
Bu örnekte, belge tablosu DocID
ve Title
sütunlarını içeren ortak bir küme içerir. Üretim grubu, tüm üretim belgeleri için bir ProductionSpecification
ve ProductionLocation
sütunu ister. Pazarlama grubu, pazarlama belgeleri için bir MarketingSurveyGroup
sütunu istiyor. Bu örnekteki kod seyrek sütunlar kullanan, tabloya iki satır ekleyen ve ardından tablodan verileri seçen bir tablo oluşturur.
Not
Bu tablonun görüntülenmesini ve okunmasını kolaylaştırmak için yalnızca beş sütunu vardır. ANSI_NULL_DFLT_ON seçeneği ayarlandıysa seyrek sütunların null olabilir olarak ilan edilmesi isteğe bağlıdır. SET ANSI_DEFAULTS ON olduğunda SET ANSI_NULL_DFLT_ON etkinleştirilir. ANSI_DEFAULTS çoğu bağlantı sağlayıcısı için varsayılan olarak ON'dır. Daha fazla bilgi için bkz. SET ANSI_DEFAULTS.
USE AdventureWorks2022;
GO
CREATE TABLE DocumentStore
(DocID int PRIMARY KEY,
Title varchar(200) NOT NULL,
ProductionSpecification varchar(20) SPARSE NULL,
ProductionLocation smallint SPARSE NULL,
MarketingSurveyGroup varchar(20) SPARSE NULL ) ;
GO
INSERT DocumentStore(DocID, Title, ProductionSpecification, ProductionLocation)
VALUES (1, 'Tire Spec 1', 'AXZZ217', 27);
GO
INSERT DocumentStore(DocID, Title, MarketingSurveyGroup)
VALUES (2, 'Survey 2142', 'Men 25 - 35');
GO
Tablodan tüm sütunları seçmek için normal bir sonuç kümesi döndürür.
SELECT * FROM DocumentStore ;
Sonuç kümesi aşağıdadır.
DocID Title ProductionSpecification ProductionLocation MarketingSurveyGroup
1 Tire Spec 1 AXZZ217 27 NULL
2 Survey 2142 NULL NULL Men 25-35
Üretim departmanı pazarlama verileriyle ilgilenmediğinden, aşağıdaki sorguda gösterildiği gibi yalnızca ilgilendiğiniz sütunları döndüren bir sütun listesi kullanmak ister.
SELECT DocID, Title, ProductionSpecification, ProductionLocation
FROM DocumentStore
WHERE ProductionSpecification IS NOT NULL ;
Sonuç kümesi aşağıdadır.
DocID Title ProductionSpecification ProductionLocation
1 Tire Spec 1 AXZZ217 27