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
Microsoft Fabric'te SQL veritabanı
Yığın, kümelenmiş dizinin olmadığı bir veritabanı tablosudur. Yığın olarak depolanan tablolarda bir veya daha fazla kümelenmemiş dizin oluşturulabilir. Veriler, bir sipariş belirtilmeden yığında depolanır. Genellikle veriler başlangıçta satırların eklendiği sırada depolanır. 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ı tahmin edilemez. 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ı depolamak için kalıcı bir mantıksal düzen belirtmek için tabloda kümelenmiş bir dizin oluşturun; böylece tablo yığın değildir.
Note
Kümelenmiş dizin oluşturmak yerine bir tabloyu yığın olarak bırakmak için bazen iyi nedenler vardır, ancak yığınları etkili bir şekilde kullanmak gelişmiş 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 kısaltılan ve tekrar yüklenen tablolar için idealdir. Veritabanı motoru, ilk kullanılabilir alanı doldurarak bir yığındaki alanı iyileştirir.
Aşağıdakileri göz önünde bulundurun:
- Özellikle çok sayıda silme veya güncelleştirme yapılmışsa yığında boş alan bulmak maliyetli olabilir.
- Kümelenmiş dizinler, sık sık kesilmeyen tablolar için sabit performans sunar.
Geçici veya hazırlama tabloları gibi düzenli olarak kesilmiş veya yeniden oluşturulmuş 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.
Tablo yığın olarak depolandığında, tek tek satırlar dosya numarası, veri sayfası numarası ve sayfadaki yuvadan (FileID:PageID:SlotID) oluşan 8 baytlık satır tanımlayıcısına (RID) başvuruyla tanımlanır. Satır kimliği küçük ve verimli bir yapıdır.
Yığınlar, büyük, sıralanmamış ekleme işlemleri için hazırlama tabloları olarak kullanılabilir. Veriler katı bir sıra zorlamadan eklendiğinden, ekleme işlemi genellikle kümelenmiş dizine eşdeğer ekleme işleminden daha hızlıdır. Yığının verileri okunacak ve son hedefe işlenecekse, sorgu tarafından kullanılan arama koşulunu kapsayan dar bir kümelenmemiş dizin oluşturmak faydalı olabilir.
Note
Veriler, veri sayfaları sırasına göre bir yığından alınır, ancak verilerin eklenme sırasına göre alınmaz.
Bazen veri uzmanları, verilere her zaman kümelenmemiş dizinler aracılığıyla erişildiğinde ve RID'nin kümelenmiş dizin anahtarından daha küçük olması durumunda yığınları da kullanır.
Tablo bir yığınsa ve kümelenmemiş dizinleri yoksa, herhangi bir satırı bulmak için tablonun tamamı okunmalıdır (tablo taraması). SQL Server yığın üzerinde doğrudan 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ış düzende döndürülürken yığın kullanmayın. Sıralama sütunundaki kümelenmiş dizin, sıralama işleminden kaçınabilir.
Veriler sık sık birlikte gruplandırıldığında yığın kullanmayın. Verilerin gruplandırılmadan önce sıralanması gerekir ve sıralama sütunundaki kümelenmiş dizin sıralama işleminden kaçınabilir.
Veri aralıkları tablodan sık sorgulandığında yığın kullanmayın. Aralık sütunundaki kümelenmiş dizin, yığının tamamını sıralamaktan kaçınıyor.
Kümelenmemiş dizinler olmadığında ve tablo büyükse yığın kullanmayın. Bu tasarım için tek uygulama, tablo içeriğinin tamamını belirtilen bir sıra olmadan döndürmektir. Bir yığında, Veritabanı Altyapısı herhangi bir satırı bulmak için tüm satırları okur.
Veriler sık sık güncelleştiriliyorsa yığın kullanmayın. Bir kaydı güncelleştirirseniz ve güncelleştirme veri sayfalarında şu anda kullandıklarından daha fazla alan kullanırsa, kaydın yeterli boş alana sahip bir veri sayfasına taşınması gerekir. Bu, verilerin yeni konumuna işaret eden bir iletilen kayıt oluşturur ve yeni fiziksel konumu belirtmek için , iletme işaretçisinin daha önce bu verileri tutan sayfaya yazılması gerekir. Bu, yığında parçalanmaya neden olur. Veritabanı Altyapısı bir yığını taradığında, bu işaretçileri izler. Bu eylem, okuma performansını sınırlar ve tarama performansını azaltan ek G/Ç'ye neden olabilir.
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 ... REBUILDkomutunu 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ümelenmemiş dizinler varsa kümelenmiş dizin her değiştirildiğinde tüm kümelenmemiş dizinlerin yeniden oluşturulması gerekir. Bu nedenle, yığından kümelenmiş dizin yapısına veya geri dönüşe geçmek çok zaman alabilir ve tempdb'de verileri yeniden sıralamak için disk alanı 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 t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
INNER JOIN sys.partitions p
ON i.object_id = p.object_id
AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a
ON p.partition_id = a.container_id
LEFT JOIN sys.schemas 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 türlerine bağlı olarak, her yığın yapısı belirli bir bölüme ilişkin verileri depolamak ve yönetmek için bir veya daha fazla ayırma birimine sahip olur. En azından, her yığın bölüm başına bir IN_ROW_DATA ayırma birimine sahip olur. Yığın, eğer büyük nesne (LOB) sütunları içeriyorsa, her bölüm için bir LOB_DATA ayırma birimine de sahip olacaktır. Ayrıca, 8.060 bayt satır boyutu sınırını aşan değişken uzunlukta sütunlar içeriyorsa, bölüm başına bir ROW_OVERFLOW_DATA ayırma birimine de sahip olur.
Sistem görünümündeki first_iam_page sütun sys.system_internals_allocation_units, belirli bir bölümde yığına ayrılan alanı yöneten IAM sayfaları dizisindeki ilk IAM sayfasını gösterir. SQL Server yığında ilerlemek için IAM sayfalarını kullanır. Veri sayfaları ve içindeki satırlar belirli bir sırada değildir ve bağlantılı değildir. 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 SQL Server iç kullanımı için ayrılmıştır. Gelecekteki uyumluluk garanti edilmemektedir.
IAM sayfalarını tarayarak bir yığın için tablo taramaları veya seri okumalar, yığın sayfalarını tutan kapsamları bulmak amacıyla gerçekleştirilebilir. IAM, kapsamları veri dosyalarında bulundukları sırayla temsil ettiğinden, seri yığın taramaları her dosyada sırasıyla ilerler. Tarama sırasını ayarlamak için IAM sayfalarının kullanılması, yığındaki satırların genellikle eklendikleri sırayla döndürülmediği anlamına da 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.
İlgili İçerik
İNDEKS OLUŞTUR (Transact-SQL)
DROP INDEX (Transact-SQL)
Kümelenmiş ve Kümelenmemiş Dizinler Açıklandı