Yığınlar (kümelenmiş dizinleri olmayan tablolar)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Yığın, kümelenmiş dizinin olmadığı bir veritabanı tablosudur. Bir yığın olarak depolanan tablolarda bir veya daha fazla kümelenmiş olmayan indeks oluşturabilirsiniz. Yığın, bir sipariş belirtmeden veri saklar. Genellikle, yığın önce satırları eklediğiniz sırayla verileri saklar. Ancak Veritabanı Altyapısı, satırları verimli bir şekilde depolamak için verileri yığın içinde taşıyabilir. Sorgu sonuçlarında, veri sırasını tahmin edemezsiniz. Yığından döndürülen satırların sırasını garanti etmek için ORDER BY söz dizimini kullanın. Satırların depolanması için kalıcı bir mantıksal sırayı belirtmek için, tabloda kümelenmiş bir indeks oluşturun, böylece tablo bir yığın olmaz.

Note

Bazen, kümelenmiş bir indeks oluşturmak yerine bir tabloyu bir yığın olarak bırakmanın iyi nedenleri vardır. Ancak, heaps'i etkili kullanmak ileri düzey bir beceridir. Tabloyu yığın olarak bırakmak için iyi bir neden olmadığı sürece çoğu tablo dikkatle seçilmiş kümelenmiş dizine sahip olmalıdır.

Yığın ne zaman kullanılmalı?

Yığın, sık sık kramp ve yeniden yüklediğiniz tablolar için idealdir. Database Engine, en erken mevcut alanı doldurarak bir yığın içindeki alanı optimize eder.

Aşağıdakileri göz önünde bulundurun:

  • Boş alanı bir yığın halinde bulmak, özellikle birçok silme veya güncelleme gerçekleştiğinde maliyetli olabilir.
  • Kümelenmiş indeksler, sık kesmediğiniz tablolar için istikrarlı performans sunar.

Düzenli olarak kısalttığınız veya yeniden oluşturduğunuz tablolar için, örneğin geçici veya aşamalı tablolar için, yığın kullanmak genellikle daha verimlidir.

Heap ve kümelenmiş dizin kullanımındaki seçim, veritabanınızın performansını ve verimliliğini önemli ölçüde etkileyebilir.

Bir tabloyu yığın olarak sakladığınızda, satırları dosya numarası, veri sayfası numarası ve sayfadaki yuvadan oluşan 8 baytlık satır tanımlayıcısına (RID) referans olarak tanımlarsınız (FileID:PageID:SlotID). Satır kimliği küçük ve verimli bir yapıdır.

Büyük, sırasız ekleme işlemleri için yığınları aşama tablosu olarak kullanın. Yığınlar katı bir ekleme sırasını zorunlu kılmadığından, ekleme işlemi genellikle kümelenmiş bir indekse eşdeğer bir eklemeden daha hızlıdır. Yığının verilerini okuup nihai bir hedefe dönüştürürseniz, sorgunun kullandığı arama öncülünü kapsayan dar bir kümelenmemiş bir indeks oluşturmayı düşünün.

Note

Bir yığından veri sayfaları sırasına göre veri alırsınız, ancak veri eklediğiniz sırayla mutlaka değil.

Ayrıca, veriye her zaman kümelenmiş olmayan indeksler üzerinden eriştiğinizde ve RID'in kümelenmiş bir indeks anahtarından daha küçük olması durumunda heaps kullanabilirsiniz.

Bir tablo bir yığın ise ve kümelenmiş olmayan indeksleri yoksa, satır bulmak için tüm tabloyu (bir tablo taraması) okumanız gerekir. SQL Server, doğrudan yığın üzerinde bir RID arayamaz. Tablo küçük olduğunda bu davranış kabul edilebilir.

Yığın kullanılmaması gereken durumlarda

Veriler sık sık sıralanmış şekilde dönerken yığın kullanmayın. Sıralama sütununda kümelenmiş bir indeks, sıralama işlemini önleyebilir.

Veriler sık sık bir arada gruplanırken bir yığın kullanmayın. Veri gruplanmadan önce sıralanmalıdır ve sıralama sütununda kümelenmiş bir indeks sıralama işlemini önleyebilir.

Tablodan sık sık veri aralıkları sorgulandığında yığın kullanmayın. Aralık sütunundaki kümelenmiş dizin, yığının tamamını sıralamaktan kaçınıyor.

Kümelenmiş olmayan indeksler yokken ve tablo büyük olduğunda yığın kullanmayın. Bu tasarımın tek uygulaması, tüm tablo içeriğini belirli bir sırayla geri göndermektir. Bir yığında, Veritabanı Altyapısı herhangi bir satırı bulmak için tüm satırları okur.

Verileri sık sık güncelliyorsanız yığın kullanmayın. Bir kaydı güncellerseniz ve güncelleme veri sayfalarında mevcut alanından daha fazla alan kullanırsa, kayıt yeterince boş alan olan bir veri sayfasına taşınır. Bu hareket, verinin yeni konumuna işaret eden iletilen bir kayıt oluşturur. Yönlendirme işaretçisi, daha önce veriyi barındıran sayfada yazılır ve yeni fiziksel konumu belirtir. Bu hamle yığında parçalanma yaratıyor. Veritabanı Altyapısı bir yığını taradığında, bu işaretçileri izler. Bu işlem önden okuma performansını sınırlar ve ekstra G/Ç gerektirebilir, bu da tarama performansını azaltır.

Yığınları yönet

Yığın oluşturmak için kümelenmiş dizin içermeyen bir tablo oluşturun. Bir tabloda zaten kümelenmiş dizin varsa, kümelenmiş dizini bırakarak tabloyu yığına döndürün.

Bir yığını kaldırmak için yığında kümelenmiş bir dizin oluşturun.

Boşa harcanmış alanı geri kazanmak için bir yığını yeniden oluşturmak:

  • Yığın üzerinde kümelenmiş bir dizin oluşturun ve ardından o kümelenmiş dizini kaldırın.
  • ALTER TABLE ... REBUILD komutunu yığını yeniden derlemek için kullanın.

Warning

Kümelenmiş dizinlerin oluşturulması veya bırakılması için tablonun tamamının yeniden yazılması gerekir. Tabloda kümelenmiş olmayan indeksler varsa, kümelenmiş indeksleri değiştirdiğinizde tüm kümelenmemiş indeksleri yeniden oluşturmalısınız. Bu nedenle, bir yığından kümelenmiş bir indeks yapısına veya geri dönüşü çok zaman alabilir ve verileri yeniden sıralamak için disk tempdbalanı gerektirebilir.

Yığınları Tanımla

Aşağıdaki sorgu geçerli veritabanındaki yığınların listesini döndürür. Liste aşağıdakileri içerir:

  • Tablo adları
  • Şema adları
  • Satır sayısı
  • KB cinsinden tablo boyutu
  • KB cinsinden dizin boyutu
  • Kullanılmayan alan
  • Yığını tanımlamak için bir sütun
SELECT t.name AS 'Your TableName',
       s.name AS 'Your SchemaName',
       p.rows AS 'Number of Rows in Your Table',
       SUM(a.total_pages) * 8 AS 'Total Space of Your Table (KB)',
       SUM(a.used_pages) * 8 AS 'Used Space of Your Table (KB)',
       (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS 'Unused Space of Your Table (KB)',
       CASE
           WHEN i.index_id = 0 THEN 'Yes'
           ELSE 'No'
       END AS 'Is Your Table a Heap?'
FROM sys.tables AS t
     INNER JOIN sys.indexes AS i
         ON t.object_id = i.object_id
     INNER JOIN sys.partitions AS p
         ON i.object_id = p.object_id
        AND i.index_id = p.index_id
     INNER JOIN sys.allocation_units AS a
         ON p.partition_id = a.container_id
     LEFT OUTER JOIN sys.schemas AS s
         ON t.schema_id = s.schema_id
WHERE i.index_id <= 1 -- 0 for Heap, 1 for Clustered Index
GROUP BY t.name, s.name, i.index_id, p.rows
ORDER BY 'Your TableName';

Yığın yapıları

Yığın, kümelenmiş dizinin olmadığı bir veritabanı tablosudur. Yığınlar, yığın tarafından kullanılan her bölüm için sys.partitions içinde bir satıra sahiptirindex_id = 0. Varsayılan olarak, yığın tek bir bölüme sahiptir. Bir yığında birden çok bölüm olduğunda, her bölümün ilgili bölüme ilişkin verileri içeren bir yığın yapısı vardır. Örneğin, bir yığının dört bölümü varsa, dört yığın yapısı vardır; her bölümde bir tane.

Yığındaki veri tiplerine bağlı olarak, her yığın yapısı, belirli bir bölüm için veriyi depolayıp yöneten bir veya daha fazla tahsis birimine sahiptir. En azından, her yığın her bölüm için bir IN_ROW_DATA tahsis birimi vardır. Yığın yapısı, büyük nesne (LOB) sütunları içeriyorsa her bölüm için bir LOB_DATA tahsis birimine sahiptir. Ayrıca, 8.060 bayt satır boyutu sınırını aşan değişken uzunluklu sütunlar içeriyorsa, her bölüm için bir ROW_OVERFLOW_DATA tahsis birimi vardır.

Sistem görünümündeki sys.system_internals_allocation_units sütunfirst_iam_page, belirli bir bölümde yığına tahsis edilen alanı yöneten IAM sayfaları zincirindeki ilk Indeks Tahsis Haritası (IAM) sayfasına işaret eder. SQL Server yığında ilerlemek için IAM sayfalarını kullanır. Veri sayfaları ve içindeki satırlar belirli bir sırada değil ve birbirine bağlı değil. Veri sayfaları arasındaki tek mantıksal bağlantı, IAM sayfalarına kaydedilen bilgilerdir.

Important

Sistem sys.system_internals_allocation_units görünümü yalnızca dahili kullanım için ayrılmıştır. Gelecekteki uyumluluk garanti değildir.

IAM sayfalarını taramak için yığının sayfalarını tutan boyutları bularak bir yığının tablo taramalarını veya seri okumalarını gerçekleştirebilirsiniz. IAM, kapsamları veri dosyalarındaki sırayla temsil ettiğinden, bu yapı seri yığın taramalarının her dosyada ardışık ilerlemesi anlamına gelir. IAM sayfalarını tarama dizisini ayarlamak için kullanmak, yığından gelen satırların genellikle eklendikleri sırayla geri dönmemesi anlamına gelir.

Aşağıdaki çizimde, SQL Server Veritabanı Altyapısı'nın tek bir bölüm yığınındaki veri satırlarını almak için IAM sayfalarını nasıl kullandığı gösterilmektedir.

IAM yığının diyagramı.