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ı
SQL Server Veritabanı Altyapısı'nda belirtilen tablonun veya görünümün verileri ve dizinleri için boyut ve parçalanma bilgilerini döndürür. Dizin için, her bölümdeki B ağacının her düzeyi için bir satır döndürülür. Bir yığın için, her bölümün IN_ROW_DATA ayırma birimi için bir satır döndürülür. Büyük nesne (LOB) verileri için, her bölümün LOB_DATA ayırma birimi için bir satır döndürülür. Tabloda satır taşması verileri varsa, her bölümdeki ROW_OVERFLOW_DATA ayırma birimi için bir satır döndürülür.
Not
Belgelerde genellikle dizinlere başvuruda B ağacı terimi kullanılır. Rowstore dizinlerinde Veritabanı Altyapısı bir B+ ağacı uygular. Bu, bellek için iyileştirilmiş tablolardaki columnstore dizinleri veya dizinleri için geçerli değildir. Daha fazla bilgi için
sys.dm_db_index_physical_stats bellek için iyileştirilmiş dizinler hakkında bilgi döndürmez. Bellek için iyileştirilmiş dizin kullanımı hakkında bilgi için bkz. sys.dm_db_xtp_index_stats.
kullanılabilirlik grubu sys.dm_db_index_physical_statsbarındıran bir sunucu örneğinde sorgularsanız, REDO engelleme sorunuyla karşılaşabilirsiniz. Bunun nedeni, bu dinamik yönetim görünümünün belirtilen kullanıcı tablosunda veya görünümünde özel kullanım (X) kilidi için bir REDO iş parçacığı tarafından istekleri engelleyebilecek bir Intent-Shared (IS) kilidi almasıdır.
Transact-SQL söz dizimi kuralları
Sözdizimi
sys.dm_db_index_physical_stats (
{ database_id | NULL | 0 | DEFAULT }
, { object_id | NULL | 0 | DEFAULT }
, { index_id | NULL | 0 | -1 | DEFAULT }
, { partition_number | NULL | 0 | DEFAULT }
, { mode | NULL | DEFAULT }
)
Bağımsız değişken
database_id | NULL | 0 | TEMERRÜT
Veritabanının kimliği.
database_idsmallint. Geçerli girişler bir veritabanının kimliğidir, NULL, 0veya DEFAULT. Varsayılan değer 0.
NULL, 0ve DEFAULT bu bağlamdaki eşdeğer değerlerdir.
SQL Server örneğindeki tüm veritabanları için bilgi döndürmek için NULL belirtin.
NULLiçin belirtirseniz, NULL, index_idve partition_numberiçin de belirtmeniz gerekir.
Yerleşik işlev DB_ID belirtilebilir. veritabanı adı belirtmeden DB_ID kullandığınızda, geçerli veritabanının uyumluluk düzeyi 90 veya daha yüksek olmalıdır.
object_id | NULL | 0 | TEMERRÜT
Tablonun nesne kimliği veya dizinin açık olduğu görünümü. 0.
NULL, 0ve DEFAULT bu bağlamdaki eşdeğer değerlerdir.
SQL Server 2016 (13.x) ve sonraki sürümlerinde geçerli girişler hizmet aracısı kuyruk adını veya kuyruk iç tablo adını da içerir. Varsayılan parametreler uygulandığında (tüm nesneler, tüm dizinler vb.), tüm kuyruklar için parçalanma bilgileri sonuç kümesine eklenir.
Belirtilen veritabanındaki tüm tablo ve görünümler için bilgi döndürmek için NULL belirtin.
NULLiçin belirtirseniz, NULL ve partition_numberiçin de belirtmeniz gerekir.
index_id | 0 | NULL | -1 | TEMERRÜT
Dizinin kimliği. -1.
NULL, -1ve DEFAULT bu bağlamdaki eşdeğer değerlerdir.
Temel tablo veya görünüm için tüm dizinler için bilgi döndürmek için NULL belirtin.
NULLiçin belirtirseniz, NULLiçin de belirtmeniz gerekir.
partition_number | NULL | 0 | TEMERRÜT
Nesnedeki bölüm numarası. 0.
NULL, 0ve DEFAULT bu bağlamdaki eşdeğer değerlerdir.
Sahip olan nesnenin tüm bölümleri için bilgi döndürmek için NULL belirtin.
partition_number 1 tabanlıdır. Bölümlenmemiş dizin veya yığın partition_number1olarak ayarlanmıştır.
modu | NULL | TEMERRÜT
Modun adı.
modu istatistikleri almak için kullanılan tarama düzeyini belirtir. DEFAULT, NULL, LIMITED, SAMPLEDveya DETAILED. Varsayılan (NULL) LIMITED.
Tablo döndürüldü
| Sütun adı | Veri tipi | Açıklama |
|---|---|---|
database_id |
smallint | Tablo veya görünümün veritabanı kimliği. Azure SQL Veritabanı'nda değerler tek bir veritabanı veya elastik havuz içinde benzersizdir, ancak mantıksal sunucu içinde değildir. |
object_id |
int | Dizinin açık olduğu tablonun veya görünümün nesne kimliği. |
index_id |
int | Dizinin dizin kimliği.0 = Yığın. |
partition_number |
int | Sahip olan nesne içindeki 1 tabanlı bölüm numarası; bir tablo, görünüm veya dizin.1 = Bölümlenmemiş dizin veya yığın. |
index_type_desc |
nvarchar(60) | Dizin türünün açıklaması: - HEAP- CLUSTERED INDEX- NONCLUSTERED INDEX- PRIMARY XML INDEX- EXTENDED INDEX- XML INDEX- COLUMNSTORE MAPPING INDEX (iç)- COLUMNSTORE DELETEBUFFER INDEX (iç)- COLUMNSTORE DELETEBITMAP INDEX (iç) |
alloc_unit_type_desc |
nvarchar(60) | Ayırma birimi türünün açıklaması: - IN_ROW_DATA- LOB_DATA- ROW_OVERFLOW_DATALOB_DATA ayırma birimi, metin, ntext, resim, varchar(max), nvarchar(max), varbinary(max)ve xmltüründe depolanan verileri içerir. Daha fazla bilgi için bkz. Veri türleri. |
index_depth |
tinyint | Dizin düzeylerinin sayısı.1 = Yığın veya LOB_DATA ya da ROW_OVERFLOW_DATA ayırma birimi. |
index_level |
tinyint | Dizinin geçerli düzeyi. Dizin yaprak düzeyleri, yığınlar ve 0 veya LOB_DATA ayırma birimleri için ROW_OVERFLOW_DATA.Af olmayan dizin düzeyleri için 0 büyüktür.
index_level, bir dizinin kök düzeyindeki en yüksek değerdir.Dizinlerinaf olmayan düzeyleri yalnızca modu DETAILEDolduğunda işlenir. |
avg_fragmentation_in_percent |
float | Dizinler için mantıksal parçalanma veya IN_ROW_DATA ayırma birimindeki yığınlar için kapsam parçalanması.Değer yüzde olarak ölçülür ve birden çok dosyayı dikkate alır. Mantıksal ve kapsam parçalanma tanımları için bkz. Açıklamalar. 0 ve LOB_DATA ayırma birimleri için ROW_OVERFLOW_DATA.
NULL
olduğunda yığınlar için SAMPLED. |
fragment_count |
bigint |
IN_ROW_DATA ayırma biriminin yaprak düzeyindeki parça sayısı. Parçalar hakkında daha fazla bilgi için bkz. Açıklamalar.Bir dizinin uygun olmayan düzeyleri ve NULL veya LOB_DATA ayırma birimleri için ROW_OVERFLOW_DATA.
NULL
olduğunda yığınlar için SAMPLED. |
avg_fragment_size_in_pages |
float | bir IN_ROW_DATA ayırma biriminin yaprak düzeyindeki bir parçadaki ortalama sayfa sayısı.Bir dizinin uygun olmayan düzeyleri ve NULL veya LOB_DATA ayırma birimleri için ROW_OVERFLOW_DATA.
NULL
olduğunda yığınlar için SAMPLED. |
page_count |
bigint | Toplam dizin veya veri sayfası sayısı. Dizin için, IN_ROW_DATA ayırma birimindeki B ağacının geçerli düzeyindeki dizin sayfalarının toplam sayısı.Bir yığın için, IN_ROW_DATA ayırma birimindeki toplam veri sayfası sayısı.LOB_DATA veya ROW_OVERFLOW_DATA ayırma birimleri için, ayırma birimindeki toplam sayfa sayısı. |
avg_page_space_used_in_percent |
float | Tüm sayfalarda kullanılan kullanılabilir veri depolama alanının ortalama yüzdesi. Dizin için ortalama, IN_ROW_DATA ayırma birimindeki B ağacının geçerli düzeyine uygulanır.Bir yığın için, IN_ROW_DATA ayırma birimindeki tüm veri sayfalarının ortalaması.LOB_DATA veya ROW_OVERFLOW_DATA ayırma birimleri için ayırma birimindeki tüm sayfaların ortalaması.
NULL
olduğunda LIMITED. |
record_count |
bigint | Toplam kayıt sayısı. Dizin için toplam kayıt sayısı, IN_ROW_DATA ayırma birimindeki B ağacının geçerli düzeyine uygulanır.Bir yığın için, IN_ROW_DATA ayırma birimindeki toplam kayıt sayısı.Not: Bir yığın için, bu işlevden döndürülen kayıt sayısı, yığında bir SELECT COUNT(*) çalıştırılarak döndürülen satır sayısıyla eşleşmeyebilir. Bunun nedeni, bir satırın birden çok kayıt içerebileceğidir. Örneğin, bazı güncelleştirme durumlarında, güncelleştirme işleminin sonucu olarak tek bir yığın satırının bir iletme kaydı ve iletilen bir kaydı olabilir. Ayrıca, çoğu büyük LOB satırı LOB_DATA depolama alanında birden çok kayda bölünür.LOB_DATA veya ROW_OVERFLOW_DATA ayırma birimleri için, tam ayırma birimindeki kayıtların toplam sayısı.
NULL
olduğunda LIMITED. |
ghost_record_count |
bigint | Ayırma birimindeki hayalet temizleme görevi tarafından kaldırılma için hazır hayalet kayıtlarının sayısı.0 ayırma birimindeki bir dizininaf olmayan düzeyleri için IN_ROW_DATA.
NULL
olduğunda LIMITED. |
version_ghost_record_count |
bigint | Ayırma birimindeki bekleyen anlık görüntü yalıtım işlemi tarafından tutulan hayalet kayıtların sayısı.0 ayırma birimindeki bir dizininaf olmayan düzeyleri için IN_ROW_DATA.
NULL
olduğunda LIMITED. |
min_record_size_in_bytes |
int | Bayt cinsinden en düşük kayıt boyutu. Dizin için en düşük kayıt boyutu, IN_ROW_DATA ayırma birimindeki B ağacının geçerli düzeyine uygulanır.Bir yığın için, IN_ROW_DATA ayırma birimindeki en düşük kayıt boyutu.LOB_DATA veya ROW_OVERFLOW_DATA ayırma birimleri için, tam ayırma birimindeki en düşük kayıt boyutu.
NULL
olduğunda LIMITED. |
max_record_size_in_bytes |
int | Bayt cinsinden en büyük kayıt boyutu. Dizin için en büyük kayıt boyutu, IN_ROW_DATA ayırma birimindeki B ağacının geçerli düzeyine uygulanır.Bir yığın için, IN_ROW_DATA ayırma birimindeki en büyük kayıt boyutu.LOB_DATA veya ROW_OVERFLOW_DATA ayırma birimleri için, tam ayırma birimindeki en büyük kayıt boyutu.
NULL
olduğunda LIMITED. |
avg_record_size_in_bytes |
float | Bayt cinsinden ortalama kayıt boyutu. Dizin için ortalama kayıt boyutu, IN_ROW_DATA ayırma birimindeki B ağacının geçerli düzeyine uygulanır.Bir yığın için, IN_ROW_DATA ayırma birimindeki ortalama kayıt boyutu.LOB_DATA veya ROW_OVERFLOW_DATA ayırma birimleri için, tam ayırma birimindeki ortalama kayıt boyutu.
NULL
olduğunda LIMITED. |
forwarded_record_count |
bigint | Bir yığındaki başka bir veri konumuna ileri işaretçileri olan kayıtların sayısı. (Bu durum, yeni satırı özgün konumda depolamak için yeterli alan olmadığında güncelleştirme sırasında oluşur.) Bir yığın için NULL ayırma birimleri dışında herhangi bir ayırma birimi için IN_ROW_DATA.
NULL
olduğunda yığınlar için LIMITED. |
compressed_page_count |
bigint | Sıkıştırılmış sayfa sayısı. Yığınlar için yeni ayrılan sayfalar PAGE sıkıştırılamaz. Bir yığın PAGE iki özel koşul altında sıkıştırılır: veriler toplu içeri aktarıldığında veya bir yığın yeniden oluşturulduğunda. Sayfa ayırmalarına neden olan tipik DML işlemleri PAGE sıkıştırılamaz.
compressed_page_count değeri istediğiniz eşikten daha büyük olduğunda bir yığını yeniden oluşturun.Kümelenmiş dizine sahip tablolar için compressed_page_count değeri, PAGE sıkıştırmanın etkinliğini gösterir. |
hobt_id |
bigint | Dizinin veya bölümün yığın veya B ağacı kimliği. Columnstore dizinleri için bu, bölüm için iç columnstore verilerini izleyen satır kümesinin kimliğidir. Satır kümeleri veri yığınları veya B ağaçları olarak depolanır. Üst columnstore diziniyle aynı dizin kimliğine sahiptirler. Daha fazla bilgi için bkz. sys.internal_partitions. |
columnstore_delete_buffer_state |
tinyint | 0 = NOT_APPLICABLE1 = OPEN2 = DRAINING3 = FLUSHING4 = RETIRING5 = READYŞunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği |
columnstore_delete_buffer_state_desc |
nvarchar(60) |
NOT VALID : Üst dizin bir columnstore dizini değildir.OPEN - Siliciler ve tarayıcılar bunu kullanır.DRAINING - siliciler tükeniyor ancak tarayıcılar hala kullanıyor.FLUSHING - arabellek kapatılır ve arabellekteki satırlar silme bit eşlemine yazılır.RETIRING - kapalı silme arabelleğindeki satırlar silme bit eşlemine yazıldı, ancak tarayıcılar hala kullandığından arabellek kesilmedi. Açık arabellek yeterli olduğundan yeni tarayıcıların kullanımdan kaldıran arabelleği kullanması gerekmez.READY - Bu silme arabelleği kullanıma hazır.Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği |
version_record_count |
bigint | Bu, bu dizinde tutulan satır sürümü kayıtlarının sayısıdır. Bu satır sürümleri Hızlandırılmış veritabanı kurtarma özelliği tarafından korunur. Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği |
inrow_version_record_count |
bigint | Hızlı alma için veri satırında tutulan ADR sürüm kayıtlarının sayısı. Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği |
inrow_diff_version_record_count |
bigint | Temel sürümden farklı olarak tutulan ADR sürüm kayıtlarının sayısı. Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği |
total_inrow_version_payload_size_in_bytes |
bigint | Bu dizin için satır içi sürüm kayıtlarının bayt cinsinden toplam boyutu. Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği |
offrow_regular_version_record_count |
bigint | Özgün veri satırının dışında tutulan sürüm kayıtlarının sayısı. Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği |
offrow_long_term_version_record_count |
bigint | Çevrimiçi dizin sürüm deposundaki sürüm kayıtlarının sayısı. Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri, Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği |
Not
Belgelerde genellikle dizinlere başvuruda B ağacı terimi kullanılır. Rowstore dizinlerinde Veritabanı Altyapısı bir B+ ağacı uygular. Bu, bellek için iyileştirilmiş tablolardaki columnstore dizinleri veya dizinleri için geçerli değildir. Daha fazla bilgi için
Açıklamalar
sys.dm_db_index_physical_stats dinamik yönetim işlevi DBCC SHOWCONTIG deyiminin yerini alır.
Tarama modları
İşlevin yürütüleceği mod, işlev tarafından kullanılan istatistiksel verileri elde etmek için gerçekleştirilen tarama düzeyini belirler.
moduLIMITED, SAMPLEDveya DETAILEDolarak belirtilir. İşlev, tablo veya dizinin belirtilen bölümlerini oluşturan ayırma birimleri için sayfa zincirlerini çapraz geçiş yapar.
sys.dm_db_index_physical_stats, çalıştığı moddan bağımsız olarak yalnızca Intent-Shared (IS) tablo kilidi gerektirir.
LIMITED modu en hızlı moddur ve en az sayıda sayfayı tarar. Dizin için yalnızca B ağacının üst düzey sayfaları (yani yaprak düzeyinin üzerindeki sayfalar) taranır. Yığın için ilişkili PFS ve IAM sayfaları incelenir ve bir yığının veri sayfaları LIMITED modunda taranır.
veritabanı altyapısı yalnızca B ağacının ve yığının IAM ve PFS sayfalarının nonleaf sayfalarını taradığından LIMITED moduyla compressed_page_countNULL.
SAMPLEDtahmini değerini almak için compressed_page_count modunu kullanın ve DETAILEDiçin gerçek değeri almak için compressed_page_count modunu kullanın.
SAMPLED modu, dizindeki veya yığındaki tüm sayfaların yüzde 1'lik örneğini temel alan istatistikleri döndürür.
SAMPLED modundaki sonuçlar yaklaşık olarak kabul edilmelidir. Dizin veya yığında 10.000'den az sayfa varsa, DETAILEDyerine SAMPLED modu kullanılır.
DETAILED modu tüm sayfaları tarar ve tüm istatistikleri döndürür.
Modlar, LIMITED'den DETAILED'a giderek yavaşlar çünkü her modda daha fazla çalışma gerçekleştirilir. Tablo veya dizinin boyutunu veya parçalanma düzeyini hızla ölçmek için LIMITED modunu kullanın. En hızlıdır ve dizinin IN_ROW_DATA ayırma birimindeki her bir işlevsiz düzey için bir satır döndürmez.
Parametre değerlerini belirtmek için sistem işlevlerini kullanma
database_id ve object_id parametreleri için bir değer belirtmek üzere DB_ID ve OBJECT_ID Transact-SQL işlevlerini kullanabilirsiniz. Ancak, bu işlevler için geçerli olmayan değerlerin geçirilmesi istenmeyen sonuçlara neden olabilir. Örneğin, veritabanı veya nesne adı mevcut olmadıkları veya yanlış yazıldıkları için bulunamıyorsa, her iki işlev de NULLdöndürür.
sys.dm_db_index_physical_stats işlevi, NULL tüm veritabanlarını veya tüm nesneleri belirten bir joker karakter değeri olarak yorumlar.
Ayrıca, OBJECT_ID işlevi, sys.dm_db_index_physical_stats işlevi çağrılmadan önce işlenir ve bu nedenle database_idiçinde belirtilen veritabanı bağlamında değil geçerli veritabanı bağlamında değerlendirilir. Bu davranış, OBJECT_ID işlevinin NULL bir değer döndürmesine neden olabilir; veya nesne adı hem geçerli veritabanı bağlamında hem de belirtilen veritabanında varsa, bir hata iletisi döndürülür. Aşağıdaki örneklerde bu istenmeyen sonuçlar gösterilmiştir.
USE master;
GO
-- In this example, OBJECT_ID is evaluated in the context of the master database.
-- Because Person.Address does not exist in master, the function returns NULL.
-- When NULL is specified as an object_id, all objects in the database are returned.
-- The same results are returned when an object that is not valid is specified.
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'AdventureWorks2022'), OBJECT_ID(N'Person.Address'), NULL, NULL , 'DETAILED');
GO
-- This example demonstrates the results of specifying a valid object name
-- that exists in both the current database context and
-- in the database specified in the database_id parameter of the
-- sys.dm_db_index_physical_stats function.
-- An error is returned because the ID value returned by OBJECT_ID does not
-- match the ID value of the object in the specified database.
CREATE DATABASE Test;
GO
USE Test;
GO
CREATE SCHEMA Person;
GO
CREATE Table Person.Address(c1 int);
GO
USE AdventureWorks2022;
GO
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'Test'), OBJECT_ID(N'Person.Address'), NULL, NULL , 'DETAILED');
GO
-- Clean up temporary database.
DROP DATABASE Test;
GO
En iyi yöntem
DB_ID veya OBJECT_IDkullandığınızda her zaman geçerli bir kimlik döndürdüğünüzden emin olun. Örneğin, OBJECT_IDkullandığınızda, OBJECT_ID(N'AdventureWorks2022.Person.Address')gibi üç parçalı bir ad belirtin veya sys.dm_db_index_physical_stats işlevinde kullanmadan önce işlevler tarafından döndürülen değeri test edin. Aşağıdaki A ve B örnekleri, veritabanı ve nesne kimliklerini belirtmenin güvenli bir yolunu gösterir.
Parçalanmayı algılama
Parçalanma, tabloda ve dolayısıyla tabloda tanımlanan dizinlerde yapılan veri değişiklikleri (INSERT, UPDATEve DELETE deyimleri) aracılığıyla gerçekleşir. Bu değişiklikler normalde tablo ve dizin satırları arasında eşit olarak dağıtılamadığından, her sayfanın doluluğu zaman içinde değişebilir. Bir tablonun dizinlerinin bir bölümünü veya tümünü tarayan sorgular için bu tür bir parçalanma daha fazla sayfa okumasına neden olabilir ve bu da verilerin paralel olarak taranmasını engeller.
Dizin veya yığının parçalanma düzeyi avg_fragmentation_in_percent sütununda gösterilir. Yığınlar için değer, yığının kapsam parçalanmasını temsil eder. Dizinler için değer, dizinin mantıksal parçalanma değerini temsil eder.
DBCC SHOWCONTIGaksine, her iki durumda parçalanma hesaplama algoritmaları birden çok dosyaya yayılan depolamayı dikkate alır ve bu nedenle doğrudur.
Mantıksal parçalanma
Bu, bir dizinin yaprak sayfalarındaki sıra dışı sayfaların yüzdesidir. Sıra dışı bir sayfa, dizine ayrılan sonraki fiziksel sayfanın geçerli yaprak sayfasındaki sonraki sayfa işaretçisi tarafından işaret edilen sayfa olmadığı bir sayfadır.
Kapsam parçalanması
Bu, yığının yaprak sayfalarındaki sıra dışı kapsamların yüzdesidir. Sıra dışı bir kapsam, bir yığın için geçerli sayfayı içeren kapsamın, önceki sayfayı içeren ölçüden sonra fiziksel olarak bir sonraki kapsam olmadığı kapsamdır.
en yüksek performans için avg_fragmentation_in_percent değeri mümkün olduğunca sıfıra yakın olmalıdır. Ancak, yüzde 0 ile yüzde 10 arasında değerler kabul edilebilir. Yeniden oluşturma, yeniden düzenleme veya yeniden oluşturma gibi parçalanmayı azaltmanın tüm yöntemleri, bu değerleri azaltmak için kullanılabilir. Dizindeki parçalanma derecesini analiz etme hakkında daha fazla bilgi için bkz. sorgu performansını geliştirmek ve kaynak tüketimini azaltmak için dizin bakımını iyileştirme
Dizindeki parçalanmayı azaltma
Bir dizin, parçalanmanın sorgu performansını etkileyeceği şekilde parçalandığında, parçalanmayı azaltmak için üç seçenek vardır:
Kümelenmiş dizini bırakın ve yeniden oluşturun.
Kümelenmiş dizini yeniden oluşturmak verileri yeniden dağıtır ve tam veri sayfalarıyla sonuçlanır. Tamlık düzeyi,
FILLFACTORiçindekiCREATE INDEXseçeneği kullanılarak yapılandırılabilir. Bu yöntemdeki dezavantajlar, bırakma ve yeniden oluşturma döngüsü sırasında dizinin çevrimdışı olması ve işlemin atomik olmasıdır. Dizin oluşturma işlemi kesintiye uğrarsa dizin yeniden oluşturulmaz. Daha fazla bilgi için bkz. CREATE INDEX. dizinin yaprak düzeyi sayfalarını mantıksal düzende yeniden sıralamak için
ALTER INDEX REORGANIZEyerineDBCC INDEXDEFRAGkullanın. Bu çevrimiçi bir işlem olduğundan, deyimi çalışırken dizin kullanılabilir. İşlem, tamamlanan iş kaybı olmadan da kesilebilir. Bu yöntemin dezavantajı, verileri dizin yeniden oluşturma işlemi olarak yeniden düzenlemenin iyi bir işi olmaması ve istatistikleri güncelleştirmemesidir.Dizini çevrimiçi veya çevrimdışı olarak yeniden oluşturmak için
ALTER INDEX REBUILDyerineDBCC DBREINDEXkullanın. Daha fazla bilgi için bkz. ALTER INDEX (Transact-SQL).
Parçalanma tek başına bir dizini yeniden düzenlemek veya yeniden oluşturmak için yeterli bir neden değildir. Parçalanmanın ana etkisi, dizin taramaları sırasında sayfa okuma hızını yavaşlatmasıdır. Bu, daha yavaş yanıt sürelerine neden olur. Parçalanmış bir tablo veya dizindeki sorgu iş yükü tarama içermiyorsa, iş yükü öncelikli olarak tekli aramalar olduğundan parçalanmayı kaldırmanın hiçbir etkisi olmaz.
Not
DBCC SHRINKFILE veya DBCC SHRINKDATABASE çalıştırmak, küçültme işlemi sırasında bir dizin kısmen veya tamamen taşındığında parçalanmalara neden olabilir. Bu nedenle, küçültme işleminin gerçekleştirilmesi gerekiyorsa, parçalanma kaldırılmadan önce bunu yapmanız gerekir.
Yığındaki parçalanmayı azaltma
Bir yığının parçalanma kapsamını azaltmak için tabloda kümelenmiş bir dizin oluşturun ve dizini bırakın. Bu, kümelenmiş dizin oluşturulurken verileri yeniden dağıtır. Bu, veritabanında kullanılabilir boş alan dağılımını göz önünde bulundurarak bunu mümkün olduğunca en uygun hale getirir. Kümelenmiş dizin daha sonra yığını yeniden oluşturmak üzere bırakıldığında, veriler taşınmaz ve en uygun konumda kalır. Bu işlemleri gerçekleştirme hakkında bilgi için bkz. CREATE INDEX
Dikkat
Bir tabloda kümelenmiş dizin oluşturma ve bırakma, bu tablodaki tüm kümelenmemiş dizinleri iki kez yeniden oluşturur.
Büyük nesne verilerini sıkıştırma
varsayılan olarak, ALTER INDEX REORGANIZE deyimi büyük nesne (LOB) verileri içeren sayfaları sıkıştırıyor. LoB sayfaları boş olduğunda serbest bırakılmadığından, çok fazla LOB verisi silinirse veya bir LOB sütunu bırakılırsa bu verilerin sıkıştırılması disk alanı kullanımını iyileştirebilir.
Belirtilen kümelenmiş dizini yeniden düzenlemek, kümelenmiş dizinde yer alan tüm LOB sütunlarını sıkıştırıyor. Kümelenmemiş bir dizini yeniden düzenlemek, dizinde anahtar olmayan (dahil) sütunlar olan tüm LOB sütunlarını sıkıştırır. deyiminde ALL belirtildiğinde, belirtilen tablo veya görünümle ilişkili tüm dizinler yeniden düzenlenmiştir. Ayrıca, kümelenmiş dizin, temel tablo veya dahil edilen sütunlar içeren kümelenmemiş dizinle ilişkilendirilmiş tüm LOB sütunları sıkıştırılır.
Disk alanı kullanımını değerlendirme
avg_page_space_used_in_percent sütunu sayfa doluluğunu gösterir. En iyi disk alanı kullanımını elde etmek için, çok fazla rastgele eklemesi olmayan bir dizinde bu değerin yüzde 100'e yakın olması gerekir. Ancak, çok sayıda rastgele eklemesi olan ve çok tam sayfaya sahip bir dizinde sayfa bölme sayısı artar. Bu daha fazla parçalanma neden olur. Bu nedenle sayfa bölmelerini azaltmak için değerin yüzde 100'den az olması gerekir. Belirtilen FILLFACTOR seçeneğiyle dizini yeniden oluşturmak, sayfa dolgunluğunun dizine sorgu düzenine uyacak şekilde değiştirilmesini sağlar. Doldurma faktörü hakkında daha fazla bilgi için bkz. Diziniçin Dolgu Faktörü Belirtme . Ayrıca, ALTER INDEX REORGANIZE sayfaları en son belirtilen FILLFACTOR doldurmaya çalışarak dizini sıkıştıracaktır. Bu, avg_space_used_in_percent değerini artırır.
ALTER INDEX REORGANIZE sayfa doluluğunu azaltamaz. Bunun yerine, dizin yeniden derlemesi gerçekleştirilmelidir.
Dizin parçalarını değerlendirme
Bir parça, ayırma birimi için aynı dosyadaki fiziksel olarak ardışık yaprak sayfalardan oluşur. Dizinde en az bir parça vardır. Bir dizinin sahip olabileceği en fazla parça sayısı, dizinin yaprak düzeyindeki sayfa sayısına eşittir. Daha büyük parçalar, aynı sayıda sayfayı okumak için daha az disk G/Ç'sinin gerekli olduğu anlamına gelir. Bu nedenle, avg_fragment_size_in_pages değeri ne kadar büyük olursa, aralık tarama performansı o kadar iyi olur.
avg_fragment_size_in_pages ve avg_fragmentation_in_percent değerleri birbiriyle ters orantılıdır. Bu nedenle, bir dizini yeniden oluşturmak veya yeniden düzenlemek parçalanma miktarını azaltmalı ve parça boyutunu artırmalıdır.
Sınırlama
Kümelenmiş columnstore dizinleri için veri döndürmez.
İzinler
Aşağıdaki izinleri gerektirir:
veritabanında belirtilen nesne üzerinde izni
CONTROL.VIEW DATABASE STATEveyaVIEW DATABASE PERFORMANCE STATE(SQL Server 2022) iznini @object_id =NULLnesne joker karakteri kullanarak belirtilen veritabanındaki tüm nesneler hakkında bilgi döndürme izni.VIEW SERVER STATEveyaVIEW SERVER PERFORMANCE STATE(SQL Server 2022) iznini @database_id =NULLveritabanı joker karakteri kullanarak tüm veritabanları hakkında bilgi döndürme izni.
VIEW DATABASE STATE verme, belirli nesneler üzerinde reddedilen CONTROL izinlerinden bağımsız olarak veritabanındaki tüm nesnelerin döndürülmesini sağlar.
reddetme VIEW DATABASE STATE, belirli nesneler üzerinde verilen CONTROL izinlerinden bağımsız olarak veritabanındaki tüm nesnelerin döndürülmelerine izin vermemektedir. Ayrıca, veritabanı joker karakteri @database_id = NULL belirtildiğinde, veritabanı atlanır.
Daha fazla bilgi için bkz.sistem dinamik yönetim görünümlerini
Örnekler
Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.
A. Belirtilen tablo hakkında bilgi döndürme
Aşağıdaki örnek, Person.Address tablosunun tüm dizinleri ve bölümleri için boyut ve parçalanma istatistiklerini döndürür. Tarama modu, en iyi performans için LIMITED ve döndürülen istatistikleri sınırlamak için ayarlanır. Bu sorgunun yürütülmesi için en azından CONTROL tablosunda Person.Address izni gerekir.
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;
SET @db_id = DB_ID(N'AdventureWorks2022');
SET @object_id = OBJECT_ID(N'AdventureWorks2022.Person.Address');
IF @db_id IS NULL
BEGIN;
PRINT N'Invalid database';
END;
ELSE IF @object_id IS NULL
BEGIN;
PRINT N'Invalid object';
END;
ELSE
BEGIN;
SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'LIMITED');
END;
GO
B. Yığın hakkında bilgi döndürme
Aşağıdaki örnek, dbo.DatabaseLog veritabanındaki yığın AdventureWorks2025 için tüm istatistikleri döndürür. Tabloda LOB verileri bulunduğundan, yığının veri sayfalarını depolayan LOB_DATA için döndürülen satıra ek olarak IN_ROW_ALLOCATION_UNIT ayırma birimi için bir satır döndürülür. Bu sorgunun yürütülmesi için en azından CONTROL tablosunda dbo.DatabaseLog izni gerekir.
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;
SET @db_id = DB_ID(N'AdventureWorks2022');
SET @object_id = OBJECT_ID(N'AdventureWorks2022.dbo.DatabaseLog');
IF @object_id IS NULL
BEGIN;
PRINT N'Invalid object';
END;
ELSE
BEGIN;
SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, 0, NULL , 'DETAILED');
END;
GO
C. Tüm veritabanları için dönüş bilgileri
Aşağıdaki örnek, tüm parametreler için joker karakter NULL belirterek SQL Server örneğindeki tüm tablo ve dizinlerin tüm istatistiklerini döndürür. Bu sorgunun yürütülmesi için VIEW SERVER STATE izni gerekir.
SELECT * FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL);
GO
D. Dizinleri yeniden oluşturmak veya yeniden düzenlemek için betikte sys.dm_db_index_physical_stats kullanma
Aşağıdaki örnek, veritabanındaki ortalama parçalanma yüzdesi yüzde 10'un üzerinde olan tüm bölümleri otomatik olarak yeniden düzenler veya yeniden oluşturur. Bu sorgunun yürütülmesi için VIEW DATABASE STATE izni gerekir. Bu örnek, veritabanı adı belirtmeden ilk parametre olarak DB_ID belirtir.
-- Ensure a USE <databasename> statement has been executed first.
SET NOCOUNT ON;
DECLARE @objectid INT;
DECLARE @indexid INT;
DECLARE @partitioncount BIGINT;
DECLARE @schemaname NVARCHAR(130);
DECLARE @objectname NVARCHAR(130);
DECLARE @indexname NVARCHAR(130);
DECLARE @partitionnum BIGINT;
DECLARE @partitions BIGINT;
DECLARE @frag FLOAT;
DECLARE @command NVARCHAR(4000);
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function
-- and convert object and index IDs to names.
SELECT object_id AS objectid,
index_id AS indexid,
partition_number AS partitionnum,
avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0
AND index_id > 0;
-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR
FOR
SELECT *
FROM #work_to_do;
-- Open the cursor.
OPEN partitions;
-- Loop through the partitions.
WHILE (1 = 1)
BEGIN;
FETCH NEXT
FROM partitions
INTO @objectid,
@indexid,
@partitionnum,
@frag;
IF @@FETCH_STATUS < 0
BREAK;
SELECT @objectname = QUOTENAME(o.name),
@schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
INNER JOIN sys.schemas AS s
ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;
SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE object_id = @objectid
AND index_id = @indexid;
SELECT @partitioncount = count(*)
FROM sys.partitions
WHERE object_id = @objectid
AND index_id = @indexid;
-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.
IF @frag < 30.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
IF @frag >= 30.0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
IF @partitioncount > 1
SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS NVARCHAR(10));
EXEC (@command);
PRINT N'Executed: ' + @command;
END;
-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;
-- Drop the temporary table.
DROP TABLE #work_to_do;
GO
E. Sayfa sıkıştırılmış sayfa sayısını göstermek için sys.dm_db_index_physical_stats kullanma
Aşağıdaki örnek, toplam sayfa sayısını satır ve sayfa sıkıştırılmış sayfalara göre görüntülemeyi ve karşılaştırmayı gösterir. Bu bilgiler, sıkıştırmanın bir dizin veya tablo için sağladığı avantajı belirlemek için kullanılabilir.
SELECT o.name,
ips.partition_number,
ips.index_type_desc,
ips.record_count,
ips.avg_record_size_in_bytes,
ips.min_record_size_in_bytes,
ips.max_record_size_in_bytes,
ips.page_count,
ips.compressed_page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN sys.objects o
ON o.object_id = ips.object_id
ORDER BY record_count DESC;
F. SAMPLED modunda sys.dm_db_index_physical_stats kullanma
Aşağıdaki örnekte, SAMPLED modunun DETAILED modu sonuçlarından farklı bir yaklaşık değeri nasıl döndürdüğü gösterilmektedir.
CREATE TABLE t3 (
col1 INT PRIMARY KEY,
col2 VARCHAR(500)
)
WITH (DATA_COMPRESSION = PAGE);
GO
BEGIN TRANSACTION
DECLARE @idx INT = 0;
WHILE @idx < 1000000
BEGIN
INSERT INTO t3 (col1, col2)
VALUES (
@idx,
REPLICATE('a', 100) + CAST(@idx AS VARCHAR(10)) + REPLICATE('a', 380)
)
SET @idx = @idx + 1
END
COMMIT;
GO
SELECT page_count,
compressed_page_count,
forwarded_record_count,
*
FROM sys.dm_db_index_physical_stats(db_id(), object_id('t3'), NULL, NULL, 'SAMPLED');
SELECT page_count,
compressed_page_count,
forwarded_record_count,
*
FROM sys.dm_db_index_physical_stats(db_id(), object_id('t3'), NULL, NULL, 'DETAILED');
G. Dizin parçalanması için sorgu hizmeti aracısı kuyrukları
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri
Aşağıdaki örnekte, parçalanma için sunucu aracısı kuyruklarının nasıl sorgulanması gösterilmektedir.
--Using queue internal table name
SELECT *
FROM sys.dm_db_index_physical_stats(db_id(), object_id('sys.queue_messages_549576996'), DEFAULT, DEFAULT, DEFAULT);
--Using queue name directly
SELECT *
FROM sys.dm_db_index_physical_stats(db_id(), object_id('ExpenseQueue'), DEFAULT, DEFAULT, DEFAULT);
İlgili içerik
- sistem dinamik yönetim görünümlerini
- Dizinle İlgili Dinamik Yönetim Görünümleri ve İşlevleri (Transact-SQL)
- sys.dm_db_index_operational_stats (Transact-SQL)
- sys.dm_db_index_usage_stats (Transact-SQL)
- sys.dm_db_partition_stats (Transact-SQL)
- sys.allocation_units (Transact-SQL)
- Transact-SQL başvurusu (Veritabanı Altyapısı)