Seyrek sütunlar kullanma

Seyrek sütunları null değerler için optimize edilmiş bir depolama sıradan sütunları vardır. Seyrek sütunları nonnull değerleri almak için null değerleri, daha fazla yük alan gereksinimlerini azaltır. Kaydedilen alanı en az yüzde 20 40 yüzde olduğunda seyrek sütun kullanmayı düşünün. Seyrek sütunlar ve sütun kümelerini tanımlanan kullanarak create table veya alter table deyimleri.

Seyrek sütunlar, sütun kümeleri kullanılabilir ve filtre uygulanmış dizinler:

  • Sütun kümelerini

    INSERT, update ve delete deyimlerini adıyla seyrek sütunları başvuru. Ancak, aynı zamanda görüntüleyebilir ve tek bir xml sütuna birleştirilmiş tüm seyrek sütunları bir tablo çalışmak. Bu sütun, sütun kümesi olarak adlandırılır. Sütun kümeleri hakkında daha fazla bilgi için bkz: Sütun kümelerini kullanma.

  • Filtre uygulanmış dizinler

    Seyrek sütunlar null değerli birçok satır olduğundan, bunlar için filtre uygulanmış dizinler özellikle uygundur. Seyrek sütun filtre uygulanmış bir dizin değerleri doldurulan satırların dizin oluşturabilirsiniz. Bu, daha küçük ve daha verimli bir dizin oluşturur. Daha fazla bilgi için, bkz. Filtre uygulanmış dizinler oluşturma.

Seyrek sütunlar ve filtre uygulanmış dizinler etkinleştirme uygulamaları gibi Windows SharePoint Services, verimli bir şekilde saklamalarını ve çok sayıda kullanıcı tanımlı özellikler kullanarak SQL Server 2012.

Seyrek sütun özellikleri

Seyrek sütunlar aşağıdaki özelliklere sahiptir:

  • SQL Server Veritabanı AltyapısıBu sütundaki değerlere depolama optimize etmek için bir sütun tanımında SEYREK anahtar kelime kullanır. Bu nedenle, sütun değeri tablodaki her satır için null olduğunda, hiçbir depolama değerleri gerektirir.

  • Katalog görünümleri seyrek sütunları olan tablo için tipik bir tablo ile aynıdır. sys.columnsKatalog görünümünde tablodaki her sütun için bir satır içerir ve bir tanımlanmışsa, belirlenen bir sütuna içerir.

  • Seyrek sütunlar mantıksal tablonun yerine depolama katmanı mülkiyetindedir. Bu nedenle bir select…INTO deyimi içinde seyrek sütun özelliği yeni bir tabloya kopyalamaz.

  • columns_updated işlevi bir varbinarydml işlemi sırasında güncelleştirilmiş tüm sütunları belirtmek için değer. columns_updated işlevi tarafından döndürülen bit aşağıdaki gibidir:

    • Seyrek sütun açıkça güncelleştirildiğinde, seyrek sütunu 1 olarak ayarlayın ve sütun kümesi bit 1 olarak ayarlanmış için karşılık gelen bit.

    • Sütun kümesi açıkça güncelleştirildiğinde sütun kümesi bit 1 olarak ayarlayın ve bu tablodaki tüm seyrek sütunları bit 1 olarak ayarlayın.

    • Ekleme işlemleri için tüm bit 1 olarak ayarlayın.

    Sütun kümeleri hakkında daha fazla bilgi için bkz: Sütun kümelerini kullanma.

Aşağıdaki veri türleri sparse belirtilemez:

geography

text

geometry

timestamp

image

user-defined data types

ntext

Alan tasarruf veri türüne göre tahmini

Seyrek sütun sparse işaretlenmemiş özdeş veriler için gerekli alanı daha nonnull değerleri daha fazla depolama alanı gerektirir. Aşağıdaki tablolarda, her bir veri türü alanı kullanımını gösterir. null yüzdesi sütunu gösterir veri yüzde yüzde 40'a net alanı tasarrufu için null olmalıdır.

Sabit uzunluklu veri türleri

Veri türü

Nonsparse bayt

Seyrek bayt

null yüzdesi

bit

0.125

5

98%

tinyint

1

5

86%

smallint

2

6

76%

int

4

8

64%

bigint

8

12

52%

real

4

8

64%

float

8

12

52%

smallmoney

4

8

64%

money

8

12

52%

smalldatetime

4

8

64%

datetime

8

12

52%

uniqueidentifier

16

20

43%

date

3

7

69%

Duyarlık Dependent–Length veri türleri

Veri türü

Nonsparse bayt

Seyrek bayt

null yüzdesi

datetime2(0)

6

10

57%

datetime2(7)

8

12

52%

time(0)

3

7

69%

time(7)

5

9

60%

datetimetoffset(0)

8

12

52%

datetimetoffset (7)

10

14

49%

decimal/numeric(1,s)

5

9

60%

decimal/numeric(38,s)

17

21

42%

vardecimal(p,s)

Kullanım decimaltürü olarak muhafazakar bir tahmin.

Veri Dependent–Length veri türleri

Veri türü

Nonsparse bayt

Seyrek bayt

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%

* Uzunluğu bulunan veri ortalamasını türü, artı 2 ya da 4 byte eşittir.

Tepegöz güncellemeleri seyrek sütunlar için gereken bellek

Seyrek sütunları içeren tabloları tasarlarken, bir satır güncelleştirildiğinde bir ek 2 baytlık yük her boş olmayan seyrek sütun tablosu için gerekli olduğunu unutmayın. Bu ek bellek gereksinimi sonucu, güncelleştirmeleri beklenmedik hata 576 8019 bu bellek yükünü de dahil olmak üzere toplam satır boyutunu aşıyor ve hiçbir sütun satır itti olabilir başarısız olabilir.

Örnek türü bigint 600 seyrek sütunları olan tablo düşünün. 571 Boş olmayan sütunları varsa, sonra toplam disk 571 * 12 = 6852 bayt boyutudur. Ek satır yükü ve seyrek sütun başlığı dahil sonra bu yaklaşık 6895 bayt olarak artırır. Sayfa hala disk üzerinde yaklaşık 1124 baytı vardır. Bu ek sütunlar başarıyla güncelleştirilebilir izlenimi verebilir. Ancak güncelleştirme sırasında orada ek yükü 2 bellekte * (null olmayan seyrek sütun sayısı). Örneğin, satır boyutu yaklaşık 8037 bayt diskteki ek yükü-2 * 571 = 1142 bayt – artışları dahil. Bu boyut, 8019 bayt boyutu izin verilen sınırı aşıyor. Çünkü tüm sütunları sabit uzunluklu veri türleri, onlar satır itildiği olamaz. Sonuç olarak, güncelleştirme 576 hatası ile başarısız olur.

Seyrek sütunlar kullanma sınırlamaları

Seyrek sütunları herhangi biri olabilir SQL Serververileri yazın ve aşağıdaki kısıtlamalar ile başka bir sütun gibi davranır:

  • Seyrek sütun NULL olabilecek olmalıdır ve ROWGUIDCOL veya kimlik özellikleri sahip olamaz. Seyrek sütun aşağıdaki veri türleri olamaz: text, ntext, image, timestamp, kullanıcı tanımlı veri türü, geometry, ya geography; veya FILESTREAM özniteliğine sahip.

  • Seyrek sütun varsayılan değeri olamaz.

  • Bir kural seyrek sütun bağlanamaz.

  • Hesaplanmış bir sütun seyrek sütun içerebilir, ancak hesaplanmış bir sütun sparse işaretlenemez.

  • Seyrek sütun kümelenmiş bir dizin veya birincil benzersiz anahtar dizini parçası olamaz. Ancak seyrek sütunları tanımlanır hem nonpersisted hem de kalıcı hesaplanmış sütunları Kümelenmiş anahtar bir parçası olabilir.

  • Seyrek sütun kümelenmiş bir dizin veya yığın bölüm anahtar olarak kullanılamaz. Ancak seyrek sütun kümelendirilmemiş dizin bölümleme anahtarı olarak kullanılır.

  • Seyrek sütun tablo değişkenlerini ve tablo valued parametreler kullanılan bir kullanıcı tanımlı tablo türü bir parçası olamaz.

  • Seyrek sütunlar veri sıkıştırma ile uyumsuzdur. Bu nedenle Sıkıştırılmış tablolar için seyrek sütunlar eklenemez, ne de seyrek sütunları içeren tabloları sıkıştırılmış olabilir.

  • Nonsparse ya da seyrek için nonsparse bir sütun seyrek değiştirme sütun depolama biçimini değiştirme gerektirir. SQL Server veritabanı altyapısı aşağıdaki yordamı bu değişikliği gerçekleştirmek için kullanır:

    1. Yeni depolama boyutunu ve biçimini tablosunda yeni bir sütun ekler.

    2. Her satır için tablo, güncelleştirmeleri ve yeni bir sütun için eski sütunundaki değeri depolanmış kopyaları.

    3. Eski sütununda, tablo şemadan kaldırır.

    4. Eski bir sütun tarafından kullanılan alanı yeniden kullanabilmek için tabloyu yeniden oluşturur.

    [!NOT]

    Verileri satır boyutunu izin verilen en büyük satır boyutunu aşarsa adım 2 başarısız olabilir. Bu boyut boyutunu eski sütunda depolanan veriler ve yeni bir sütunda depolanan güncelleştirilmiş verileri içerir. Bu, seyrek sütunları içeren tablolar için 8060 baytı ya da seyrek sütunları içeren tablolar için 8018 bayt sınırıdır. Tüm uygun sütunları satır kapalı itti sahip olsanız bile bu hata oluşabilir.

  • Sigara seyrek sütun seyrek sütun için değiştirdiğinizde, seyrek sütun boş olmayan değerler için daha fazla alan tüketecektir. Bir satırın en büyük satır boyutunu yakın olduğunda, işlem başarısız olabilir.

Seyrek sütunlar desteği SQL Server teknolojileri

Bu bölüm nasıl seyrek sütunları açıklar aşağıdaki desteklenen SQL Serverteknolojileri:

  • İşlem çoğaltması

    Seyrek sütunları işlem çoğaltma destekler, ancak seyrek sütunları ile kullanılabilir sütun kümelerini desteklemez. Sütun kümeleri hakkında daha fazla bilgi için bkz: Sütun kümelerini kullanma.

    sparse özniteliği çoğaltma kullanarak belirtilen şema seçenek belirlenir sp_addarticle veya kullanarak Makale özelliklerini iletişim kutusunda SQL Server Management Studio. Önceki SQL Serverseyrek sütunlar desteği. Önceki bir sürümüne veri çoğaltması gerekir sparse özniteliği olmayan çoğaltılacak belirtin.

    Yayımlanan tablolar için herhangi bir yeni seyrek sütunları tabloya ekleyemez veya varolan bir sütun seyrek özelliğini değiştirin. Böyle bir operasyon gerekiyorsa, bırakma ve yayını yeniden oluşturun.

  • Birleştirme çoğaltması

    Birleştirme çoğaltması seyrek sütun veya sütun kümelerini desteklemez.

  • Değişiklik izleme

    Değişiklik izlemeyi destekler seyrek sütunlar ve sütun ayarlar. Bir tablodaki bir sütun kümesi güncelleştirildiğinde değişiklik izleme Bu güncelleştirme olarak bütün satır değerlendirir. Ayrıntılı değişiklik izleme, seyrek sütunlar, sütun kümesi güncelleştirme işlemi güncelleştirilen tam kümesini elde etmek için sağlanmıştır. Seyrek sütunları açıkça bir dml deyimi ile güncelleştirilir, değişiklik izleme onlara normal çalışır ve değiştirilen sütunları tam kümesi tanımlayabilirsiniz.

  • Değişiklik verilerini yakalama

    Seyrek sütunları Değiştir veri yakalama destekler, ancak sütun kümelerini desteklemez.

  • Tablo kopyalandığında sütun sparse özelliği korunmaz.

Örnekler

Örneğin, bir belge tablo sütunları olan ortak içerir DocIDve Title. Üretim grubu istediği bir ProductionSpecificationve ProductionLocationsütun için tüm üretim belgeleri. Pazarlama grubu istediği bir MarketingSurveyGroupsütun belgeleri pazarlama. Bu örnek kod, seyrek sütunları kullanır, iki satır tabloya ekler ve sonra veri tablosundan seçer bir tablo oluşturur.

[!NOT]

Bu tablo, görüntüleme ve okuma kolaylaştırmak için yalnızca beş sütun vardır. Seyrek sütunlar NULL olarak ilan ANSI_NULL_DFLT_ON seçeneği ayarlanırsa isteğe bağlıdır.

USE AdventureWorks2012;
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 bir sıradan sonuç kümesi döndürür.

SELECT * FROM DocumentStore ;

Sonuç kümesi buradadır.

DocID  Title        ProductionSpecification  ProductionLocation  MarketingSurveyGroup

1      Tire Spec 1  AXZZ217                  27                  NULL

2      Survey 2142  NULL                     NULL                Men 25-35

Üretim departmanı pazarlama verileri ilgi değildir çünkü onlar ilgi, sadece sütunlar döndürür sütun listesi aşağıdaki sorgu gösterildiği gibi kullanmak istiyorum.

SELECT DocID, Title, ProductionSpecification, ProductionLocation 
FROM DocumentStore 
WHERE ProductionSpecification IS NOT NULL ;

Sonuç kümesi buradadır.

DocID  Title        ProductionSpecification  ProductionLocation

1      Tire Spec 1  AXZZ217                  27

Ayrıca bkz.

Başvuru

Tablo (Transact-sql) oluştur

ALTER TABLE (Transact-SQL)

sys.Columns (Transact-sql)

Kavramlar

Sütun kümelerini kullanma