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
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
SQL Server 2016'dan (13.x) önce bellek için iyileştirilmiş bir tablonun satır içi veri boyutu 8.060 bayttan uzun olamaz. Ancak, SQL Server 2016 (13.x) ile başlayarak ve Azure SQL Veritabanı'nda birden çok büyük sütun (örneğin, birden çok varbinary(8000) sütunu) ve LOB sütunu (varbinary(max), varchar(max)ve nvarchar(max)) ile bellek için iyileştirilmiş bir tablo oluşturabilir ve yerel olarak derlenmiş Transact-SQL (T-SQL) modülleri ve tablo türlerini kullanarak bunlar üzerinde işlemler gerçekleştirebilirsiniz.
8.060 baytlık satır boyutu sınırına sığmayan sütunlar ayrı bir iç tabloya satır dışına yerleştirilir. Her satır dışı sütununun karşılık gelen bir iç tablosu vardır ve bu tablo da tek bir kümelenmemiş dizine sahiptir. Satır dışı sütunlar için kullanılan bu iç tablolar hakkında ayrıntılı bilgi için bkz. sys.memory_optimized_tables_internal_attributes.
Satırın ve tablonun boyutunu hesaplamanın yararlı olduğu bazı senaryolar vardır:
Bir tablonun kullandığı bellek miktarı.
Tablo tarafından kullanılan bellek miktarı tam olarak hesaplanamaz. Kullanılan bellek miktarını birçok faktör etkiler. Sayfa tabanlı bellek ayırma, yerellik, önbelleğe alma ve doldurma gibi faktörler. Ayrıca, ilişkili olan etkin işlemlere sahip veya çöp toplamayı bekleyen satırların birden çok sürümü bulunmaktadır.
Tablodaki veriler ve dizinler için gereken minimum boyut,
<table size>hesaplama ile ve bu makalenin devamında ele alınan şekilde verilir.Bellek kullanımını hesaplamak en uygun yöntemdir ve dağıtım planlarınıza kapasite planlaması eklemeniz tavsiye edilir.
Satırın veri boyutu nedir ve 8.060 baytlık satır boyutu sınırlamasına uygun mu? Bu soruları yanıtlamak için, bu makalenin devamında ele alınan
<row body size>hesaplamasını kullanın.
Bellek için iyileştirilmiş bir tablo, satır işaretçileri içeren bir satır ve dizin koleksiyonundan oluşur. Aşağıdaki şekil, indeksler ve satırlardan oluşan, satır başlıkları ve gövdeleri içeren bir tabloyu göstermektedir.
Tablo boyutunu hesapla
Bir tablonun bellek içi boyutu bayt cinsinden aşağıdaki gibi hesaplanır:
<table size> = <size of index 1> + ... + <size of index n> + (<row size> * <row count>)
Karma dizinin boyutu tablo oluşturma zamanında sabittir ve gerçek demet sayısına bağlıdır. Dizin bucket_count tanımıyla belirtilen değeri, gerçek demet sayısını elde etmek için 2'nin en yakın gücüne yuvarlandı. Örneğin, belirtilen bucket_count 100000 ise, dizin için gerçek demet sayısı 131072.
<hash index size> = 8 * <actual bucket count>
Kümelenmemiş bir dizinin boyutu, yaklaşık <row count> * <index key size> civarındadır.
Satır boyutu, başlık ve gövde eklenerek hesaplanır.
<row size> = <row header size> + <actual row body size>
<row header size> = 24 + 8 * <number of indexes>
Satır gövdesinin boyutunu hesapla
Bellek için iyileştirilmiş tablodaki satırlar aşağıdaki bileşenlere sahiptir:
Satır başlığı, satır sürümleme uygulamak için gereken zaman damgasını içerir. Satır üst bilgisi, daha önce açıklandığı gibi karma kovalarında satır zincirlemesini uygulamak için dizin işaretçisini de içerir.
Satır gövdesi, null değer alabilen sütunlar için null dizisi ve değişken uzunluktaki veri türleri için ofset dizisi gibi bazı yardımcı bilgileri içeren gerçek sütun verilerini barındırır.
Aşağıdaki şekilde, iki dizini olan bir tablonun satır yapısı gösterilmektedir:
Başlangıç ve bitiş zaman damgaları, belirli bir satır sürümünün geçerli olduğu dönemi gösterir. Bu aralıkta başlayan işlemler bu satır sürümünü görebilir. Daha fazla bilgi için bkz. Memory-Optimized Tablolu İşlemler.
Dizin göstergeleri, karma kovasına ait zincirdeki bir sonraki satıra işaret eder. Aşağıdaki şekilde, biri sütun adında, diğeri sütun şehrinde olmak üzere iki sütunlu (ad, şehir) ve iki dizin içeren bir tablonun yapısı gösterilmektedir.
Bu şekilde, John ve Jane adları ilk kovaya hashlenir.
Susan ikinci kovaya hash'lenir. Şehirler Beijing ve Bogota ilk kovaya karıştırılır.
Paris ve Prague ikinci demete karma olarak eklenir.
Bu nedenle, ad üzerindeki karma dizinin zincirleri aşağıdaki gibidir:
- İlk demet:
(John, Beijing); ;(John, Paris)(Jane, Prague) - İkinci demet:
(Susan, Bogota)
Şehir dizinine yönelik zincirler aşağıdaki gibidir:
- İlk demet:
(John, Beijing),(Susan, Bogota) - İkinci kova:
(John, Paris),(Jane, Prague)
Bitiş zaman damgası ∞ (sonsuz), bunun satırın geçerli sürümü olduğunu gösterir. Bu satır sürümü yazıldığından beri satır güncellenmedi veya silinmedi.
değerinden 200büyük bir süre için tablo aşağıdaki satırları içerir:
| İsim | Şehir |
|---|---|
| John | Pekin |
| Jane | Prag |
Ancak başlangıç saati 100olan tüm etkin işlemler tablonun aşağıdaki sürümüne bakın:
| İsim | Şehir |
|---|---|
| John | Paris |
| Jane | Prag |
| Susan | Bogota |
<row body size> hesaplaması aşağıdaki tabloda tartışılmaktadır.
Satır gövdesi boyutu için iki farklı hesaplama vardır: hesaplanan boyut ve gerçek boyut:
Hesaplanan satır gövdesi boyutuyla belirtilen hesaplanan boyut, 8.060 baytlık satır boyutu sınırlamasının aşılıp aşılmadığını belirlemek için kullanılır.
Gerçek satır gövdesi boyutuyla belirtilen gerçek boyut, bellekteki ve denetim noktası dosyalarındaki satır gövdesinin gerçek depolama boyutudur.
Hem hesaplanan satır gövdesi boyutu hem de gerçek satır gövdesi boyutu benzer şekilde hesaplanır. Tek fark, aşağıdaki tablonun en altına yansıtılan (n)varchar(i) ve varbinary(i) sütunlarının boyutunun hesaplanmasıdır. Hesaplanan satır gövdesi boyutu, sütunun boyutu olarak bildirilen i boyutunu, gerçek satır gövdesi boyutu ise verilerin gerçek boyutunu kullanır.
Aşağıdaki tabloda, olarak verilen <actual row body size> = SUM(<size of shallow types>) + 2 + 2 * <number of deep type columns>satır gövdesi boyutunun hesaplanması açıklanmaktadır.
| Bölüm | Boyut | Yorumlar |
|---|---|---|
| Sığ tipi sütunlar |
SUM(<size of shallow types>). Tek tek türlerin bayt cinsinden boyutu aşağıdaki gibidir:bit: 1tinyint: 1smallint: 2int: 4gerçek: 4Smalldatetime: 4smallmoney: 4bigint: 8Tarih saati: 8Datetime2: 8float: 8para: 8sayısal (duyarlık <= 18): 8zaman: 8sayısal(duyarlık > 18): 16uniqueidentifier: 16 |
|
| Sığ sütun doldurma | Olası değerler şunlardır:1 derin tür sütunları varsa ve sığ sütunların toplam veri boyutu tek sayıysa.0 yoksa |
Derin türler , (var)ikili ve (n)(var)char türleridir. |
| Derin tür sütunları için uzaklık dizisi | Olası değerler şunlardır:0 derin tür sütunları yoksa2 + 2 * <number of deep type columns> yoksa |
Derin türler , (var)ikili ve (n)(var)char türleridir. |
| Null dizi |
<number of nullable columns> / 8 yukarı doğru tam bayt olarak yuvarlandı. |
Dizinin null atanabilir sütun başına 1 bit değeri vardır. Bu, tam bayta tamamlanmıştır. |
| Null dizi doldurma | Olası değerler şunlardır:1 derin tür sütunları varsa ve dizinin boyutu NULL tek sayıda baytsa.0 yoksa |
Derin türler , (var)ikili ve (n)(var)char türleridir. |
| Doldurma | Derin tür sütunları yoksa: 0Derin tür sütunları varsa, sığ bir sütunun gerektirdiği en büyük hizalama gereksinimine göre 0 - 7 bayt dolgu eklenir. Daha önce belgelenenler dışında, her sığ sütun boyutuna eşit hizalama gerektirir; ancak GUID sütunlarının hizalaması 1 bayttır (16 değil) ve sayısal sütunlar daima 8 bayt hizalama gerektirir (asla 16 değil). Tüm sığ sütunlar arasındaki en büyük hizalama gereksinimi kullanılır. 0 - 7 bayt dolgu, şu ana kadarki toplam boyutun (derin tür sütunları olmadan) gerekli hizalamayla uyumlu olması için eklenir. |
Derin türler , (var)ikili ve (n)(var)char türleridir. |
| Sabit uzunlukta derin tür sütunları | SUM(<size of fixed length deep type columns>)Her sütunun boyutu aşağıdaki gibidir: i
char(i) ve binary(i) için.2 * i için nchar(i) |
Sabit uzunluklu derin tür sütunları char(i), nchar(i)veya binary(i) türünde sütunlardır. |
| Değişken uzunluklu derin türdeki sütunlar hesaplanan boyut | SUM(<computed size of variable length deep type columns>)Her sütunun hesaplanan boyutu aşağıdaki gibidir: i
varchar(i) ve varbinary(i) için2 * i
nvarchar(i) için |
Bu satır yalnızca hesaplanan satır gövdesi boyutuna uygulanır. Değişken uzunluklu derin tür sütunları varchar(i), nvarchar(i)veya varbinary(i) türünde sütunlardır. Hesaplanan boyut, sütunun maksimum uzunluğuna ( i) göre belirlenir. |
| Değişken uzunluklu derin tip sütunların gerçek boyutu | SUM(<actual size of variable length deep type columns>)Her sütunun gerçek boyutu aşağıdaki gibidir: n, burada n, varchar(i) için sütunda depolanan karakter sayısıdır.2 * n, burada n , nvarchar(i) için sütunda depolanan karakter sayısıdır.n, burada n, varbinary(i) için sütunda depolanan bayt sayısıdır. |
Bu satır yalnızca gerçek satır gövdesi boyutuna uygulanır. Gerçek boyut, satırdaki sütunlarda depolanan veriler tarafından belirlenir. |
Örnek: Tablo ve satır boyutu hesaplaması
Karma dizinler için gerçek demet sayısı 2'nin en yakın gücüne yuvarlanir. Örneğin, belirtilen bucket_count 100000 ise, dizin için gerçek demet sayısı 131072.
Aşağıdaki tanıma sahip bir Orders tablosunu göz önünde bulundurun:
CREATE TABLE dbo.Orders (
OrderID INT NOT NULL PRIMARY KEY NONCLUSTERED,
CustomerID INT NOT NULL INDEX IX_CustomerID HASH WITH (BUCKET_COUNT = 10000),
OrderDate DATETIME NOT NULL,
OrderDescription NVARCHAR(1000)
)
WITH (MEMORY_OPTIMIZED = ON);
GO
Bu tabloda bir karma dizin ve bir kümelenmemiş dizin (birincil anahtar) vardır. Ayrıca üç sabit uzunluklu sütuna ve bir değişken uzunluklu sütuna sahiptir ve sütunlardan biri boş değer alabilir (OrderDescription). Tabloda 8.379 satır olduğunu ve sütundaki Orders değerlerin ortalama uzunluğunun 78 karakter olduğunu varsayalımOrderDescription.
Tablo boyutunu belirlemek için önce dizinlerin boyutunu belirleyin.
bucket_count her iki dizin için de 10000 olarak belirtilir. Bu, 2: 16384'ün en yakın gücüne yuvarlandı. Bu nedenle, tablo için Orders dizinlerin toplam boyutu şöyledir:
8 * 16384 = 131072 bytes
Kalan tablo veri boyutudur ve şu şekildedir:
<row size> * <row count> = <row size> * 8379
(Örnek tabloda 8.379 satır vardır.) Şimdi şunları yaptık:
<row size> = <row header size> + <actual row body size>
<row header size> = 24 + 8 * <number of indices> = 24 + 8 * 1 = 32 bytes
Şimdi hesaplayalım <actual row body size>:
Sığ tip sütunlar
SUM(<size of shallow types>) = 4 <int> + 4 <int> + 8 <datetime> = 16Toplam sığ sütun boyutu eşit olduğundan sığ sütun doldurma 0'dır.
Derin tür sütunları için offset dizisi:
2 + 2 * <number of deep type columns> = 2 + 2 * 1 = 4NULLdizi = 1NULLdizi dolgusu = 1,NULLçünkü dizi boyutu tek ve derin veri türü sütunu var.Doldurma
- 8 en büyük hizalama gereksinimidir
- Boyut şu ana kadar 16 + 0 + 4 + 1 + 1 = 22
- 8'in en yakın katı 24'tür
- Toplam doldurma 24 - 22 = 2 bayttır
Sabit uzunlukta derin tür sütunu yoktur (Sabit uzunlukta derin tür sütunları: 0.).
Derin tür sütunun gerçek boyutu 2 * 78 = 156'dır. Tek bir derin tür sütunu
OrderDescriptiontürünenvarcharsahiptir.
<actual row body size> = 24 + 156 = 180 bytes
Hesaplamayı tamamlamak için:
<row size> = 32 + 180 = 212 bytes
<table size> = 8 * 16384 + 212 * 8379 = 131072 + 1776348 = 1907420
Bu nedenle bellekteki toplam tablo boyutu yaklaşık 2 megabayttır. Bu, bellek ayırmanın neden olduğu olası ek yükü ve bu tabloya erişen işlemler için gereken satır sürümü oluşturma işlemlerini hesaba eklemez.
Bu tablo ve dizinleri için ayrılan ve kullanılan gerçek bellek aşağıdaki sorgu aracılığıyla elde edilebilir:
SELECT * FROM sys.dm_db_xtp_table_memory_stats
WHERE object_id = object_id('dbo.Orders');
Satır dışı sütun sınırlamaları
Bellek için iyileştirilmiş bir tabloda satır dışı sütunları kullanmayla ilgili bazı sınırlamalar ve uyarılar aşağıdaki gibi listelenir:
- Bellek için iyileştirilmiş bir tabloda sütun deposu dizini varsa, tüm sütunların satır içinde yer alması gerekir.
- Tüm dizin anahtarı sütunları satır içinde depolanmalıdır. Bir dizin anahtarı sütunu satır içine sığmazsa, dizini ekleme işlemi başarısız olur.
- Satır dışı sütunlar içeren bellek için iyileştirilmiş bir tabloyu değiştirmeyle ilgili uyarılar.
- LOB'ler için boyut sınırlaması, disk tabanlı tabloların sınırlaması ile aynıdır (LOB değerlerinde 2 GB sınırı).
- En iyi performans için çoğu sütunun 8.060 bayt içine sığması önerilir.
- Satır dışı veriler aşırı bellek ve/veya disk kullanımına neden olabilir.