sys.dm_db_index_physical_stats (Transact-sql)

Belirtilen tablo veya Görünüm veri ve boyutu ve parçalanma bilgilerini döndürür. Bir dizin, her bölüm b-ağaç her düzeyi için bir satır döndürdü. Yığın, her bölümünün IN_ROW_DATA ayırma birimi için bir satır döndürdü. Büyük nesne (lob) veri için her bölüm lob_data ayırma birimi için bir satır döndürdü. Satır taşma veri tablosunda yer alıyorsa, her bir bölüme row_overflow_data ayırma birimi için bir satır döndürdü. Columnstore dizinler hakkında bilgi vermez.

Konu bağlantısı simgesi Transact-SQL Sözdizim 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şkenler

  • database_id | NULL | 0 | VARSAYILAN
    Veritabanı kimliğidir. database_idis smallint. Geçerli girişleri olan bir veritabanı, boş, kimlik numarası 0 ya da varsayılan. Varsayılan değer 0'dır. null, 0 ve varsayılan eşdeğer bu bağlamda değerlerdir.

    Tüm veritabanları için bilgileri örneğinde dönmek için null belirtmek SQL Server. Eğer null belirtmek database_id, null da belirtmeniz gerekir object_id, index_id, ve partition_number.

    Yerleşik işlev DB_ID belirtilebilir. DB_ID veritabanı adı belirtmeden kullanırken, geçerli veritabanı uyumluluk düzeyi 90 veya daha büyük olmalıdır.

  • object_id | NULL | 0 | VARSAYILAN
    Tablo nesne Kımlığı veya Görünüm dizin üzerinde. object_idis int.

    Geçerli girişleri olan bir tablo ve görünüm, null kimlik numarası 0 ya da varsayılan. Varsayılan değer 0'dır. null, 0 ve varsayılan eşdeğer bu bağlamda değerlerdir.

    Belirtilen veritabanında tüm tablolar ve görünümler için bilgi dönmek için null belirtin. Eğer null belirtmek object_id, null da belirtmeniz gerekir index_idve partition_number.

  • index_id| 0 | NULL | -1 | VARSAYILAN
    Dizin kimliğidir. index_idis int. Geçerli girişleri olan kimlik numarasını dizin, 0, object_idbir yığın null ise -1 veya default. -1 Öntanımlıdır. null -1 ve varsayılan eşdeğer bu bağlamda değerlerdir.

    Temel tablo veya görünüm için tüm dizinler için bilgi dönmek için null belirtin. Eğer null belirtmek index_id, null da belirtmeniz gerekir partition_number.

  • partition_number | NULL | 0 | VARSAYILAN
    Nesne bölüm sayısıdır. partition_numberis int. Geçerli girişleri olan partion_numberbir dizin veya yığın, null, 0 ya da varsayılan. Varsayılan değer 0'dır. null, 0 ve varsayılan eşdeğer bu bağlamda değerlerdir.

    Tüm bölümler için bilgi sahibi olan nesne dönmek için null belirtin.

    partition_number1 tabanlıdır. Nonpartitioned dizin veya yığın sahip partition_number1'e ayarlayın.

  • mode| NULL | VARSAYILAN
    Mod adıdır. modeİstatistikler elde etmek için kullanılan tarama düzeyini belirtir. modeis sysname. Geçerli girişleri, varsayılan, null, sınırlı, sampled veya ayrıntılı vardır. Varsayılan (boş) sınırlıdır.

Dönen Tablo

Sütun adı

Veri türü

Açıklama

database_id

smallint

Tablo veya görünüm veritabanı Kımlığı.

object_id

int

Tablo veya Görünüm dizin nesne Kımlığı.

index_id

int

Bir dizin dizin Kımlığı.

0 = Yığın.

partition_number

int

1 tabanlı bölüm numarası sahibi olan nesne içinde; bir tablo, görünüm veya dizin.

1 = Nonpartitioned dizin veya yığın.

index_type_desc

nvarchar(60)

Dizin türü açıklaması:

YIĞIN

KÜMELENMİŞ DİZİN

KÜMELENDİRİLMEMİŞ DİZİN

BİRİNCİL XML DİZİN

KAYMA DİZİNİ

XML INDEX

alloc_unit_type_desc

nvarchar(60)

Ayırma birimi türü açıklaması:

IN_ROW_DATA

LOB_DATA

ROW_OVERFLOW_DATA

lob_data ayırma birimi türü sütunlarda depolanan verileri içeren text, ntext, image, varchar(max), nvarchar(max), varbinary(max), ve xml. Daha fazla bilgi için, bkz. Veri Türleri (Transact-SQL).

row_overflow_data ayırma birimi türü sütunlarda depolanan verileri içeren varchar(n), nvarchar(n), varbinary(n), ve sql_variant, itti satır kapalı.

index_depth

tinyint

Dizin düzeylerin sayısı.

1 = Yığın, veya lob_data veya row_overflow_data ayırma birimi.

index_level

tinyint

Geçerli düzeyi dizin.

0 dizin yaprak düzeyde, yığınları ve lob_data veya row_overflow_data ayırma birimi.

Nonleaf dizin düzeyleri için 0'dan büyük. index_levelen üst dizin kök düzeyinde olacak.

Yalnızca dizinler nonleaf düzeyleri şunlardır ne zaman işleme modeayrıntılı =.

avg_fragmentation_in_percent

float

Mantıksal parçalanma dizinler veya ölçüde parçalanması için yığın IN_ROW_DATA ayırma biriminde.

Değer yüzdesi olarak ölçülür ve birden çok dosya dikkate alır. Ölçüde parçalanma ve mantıksal tanımları için bkz: açıklamalar.

lob_data ve row_overflow_data ayırma birimi 0.

null yığınları ne zaman modesampled =.

fragment_count

bigint

Parça yaprak düzeyinde IN_ROW_DATA ayırma birimi sayısı. Parçaları hakkında daha fazla bilgi için bkz: açıklamalar.

Nonleaf düzeyde dizin ve lob_data veya row_overflow_data ayırma birimi null.

null yığınları ne zaman modesampled =.

avg_fragment_size_in_pages

float

IN_ROW_DATA ayırma birimi yaprak düzeyinde bir parçası sayfa ortalama sayısı.

Nonleaf düzeyde dizin ve lob_data veya row_overflow_data ayırma birimi null.

null yığınları ne zaman modesampled =.

page_count

bigint

Dizin veya veri sayfaları toplam sayısı.

Bir dizin için dizin sayfaları içinde b-ağaç IN_ROW_DATA ayırma biriminde geçerli düzeyi sayısı.

Bir yığın veri sayfalarında IN_ROW_DATA ayırma birimi sayısı.

lob_data veya row_overflow_data ayırma birimi için toplam sayfa ayırma birimi sayısı.

avg_page_space_used_in_percent

float

Mevcut veri depolama alanı tüm sayfalarında kullanılan ortalama yüzdesi.

İçin bir dizin, ortalaması IN_ROW_DATA ayırma birimi b ağacında geçerli düzeyi uygulanır.

Bir yığın ortalaması IN_ROW_DATA ayırma biriminde tüm veri sayfaları.

lob_data veya row_overflow veri ayırma birimleri için ayırma birimi tüm sayfaların ortalama.

Ne zaman null mode= sınırlı.

record_count

bigint

Toplam kayıt sayısı.

Bir dizin için kayıtların toplam sayısını IN_ROW_DATA ayırma birimi b ağacında geçerli düzeyi uygulanır.

Bir yığın, kayıt IN_ROW_DATA ayırma birimi sayısı.

NotNot
Yığın, bu işlevden dönen kayıt sayısını karşı yığını seçin count(*) çalışan tarafından döndürülen satır sayısı aynı olmayabilir.Bunun nedeni, bir satırda birden çok kayıt içerebilir.Örneğin, bazı altında durumlarda güncelleştirme, tek yığın satır ön kayıt ve güncelleştirme işlemi sonucu iletilen kayıt olabilir.Ayrıca, en büyük lob satırlar, birden fazla kayıtlara lob_data depolama olarak bölünür.

lob_data veya row_overflow_data ayırma birimi için kayıtları tam ayırma birimi sayısı.

Ne zaman null mode= sınırlı.

ghost_record_count

bigint

Ayırma birimi hayalet temizleme görevi tarafından kaldırılmak hazır hayalet kayıt sayısı.

0 dizin IN_ROW_DATA ayırma biriminde nonleaf düzeyleri için.

Ne zaman null mode= sınırlı.

version_ghost_record_count

bigint

Bir olağanüstü anlık yalıtım hareket bir ayırma birimi tarafından korunur hayalet kayıt sayısı.

0 dizin IN_ROW_DATA ayırma biriminde nonleaf düzeyleri için.

Ne zaman null mode= sınırlı.

min_record_size_in_bytes

int

En küçük kayıt bayt olarak boyutu.

Dizini için b-ağaç IN_ROW_DATA ayırma biriminde geçerli düzeyi en az kayıt boyutu uygular.

Bir yığın küçük IN_ROW_DATA ayırma birimi boyutu kayıt.

lob_data veya row_overflow_data ayırma birimi için en az tam ayırma birimi boyutu kayıt.

Ne zaman null mode= sınırlı.

max_record_size_in_bytes

int

En fazla bayt cinsinden boyutu kayıt.

Bir dizin için kayıt boyutu b-ağaç IN_ROW_DATA ayırma biriminde geçerli düzeyi uygulanır.

Yığın, maksimum IN_ROW_DATA ayırma birimi boyutu kayıt.

lob_data veya row_overflow_data ayırma birimi için maksimum tam ayırma birimi boyutu kayıt.

Ne zaman null mode= sınırlı.

avg_record_size_in_bytes

float

Ortalama kayıt bayt olarak boyutu.

Dizin için b-ağaç IN_ROW_DATA ayırma biriminde geçerli düzeyi ortalama kayıt boyutu uygular.

Yığın, ortalama IN_ROW_DATA ayırma birimi boyutu kayıt.

lob_data veya row_overflow_data ayırma birimi için ortalama tam ayırma birimi boyutu kayıt.

Ne zaman null mode= sınırlı.

forwarded_record_count

bigint

İleriye doğru işaretçiler verileri başka bir konuma sahip bir yığın kayıt sayısı. (Yeni satır özgün konumda depolamak için yeterli yer olmadığında bu durumu bir güncelleştirme sırasında oluşur.)

null IN_ROW_DATA ayırma birimleri için bir yığın dışında herhangi bir ayırma birimi.

null yığınları ne zaman mode= sınırlı.

compressed_page_count

bigint

Sıkıştırılmış sayfa sayısı.

  • Kümeler için yeni ayrılan sayfaların sayfa değildir sıkıştırılmış. Bir yığın sayfa sıkıştırılmış iki özel koşullar ise: veri alınan toplu olduğunda veya ne zaman bir yığın yeniden oluşturulur. Sayfa ayırmalarını neden tipik dml işlemleri sayfa sıkıştırılmış olmayacak. Bir yığın yeniden ne zaman compressed_page_countdeğeri büyüdükçe istediğiniz eşik değerinden daha büyük.

  • Kümelenmiş bir dizin olan tablolar için compressed_page_countdeğeri gösterir Sayfa sıkıştırma etkinliğini.

Açıklamalar

sys.dm_db_index_physical_statsDinamik yönetimi işlevi yerine dbcc SHOWCONTIG deyim. Bu dinamik yönetimi işlevi cross apply ve outer apply ilişkili parametreleri kabul etmez.

Tarama modları

İşlev yürütüldüğü mod işlevi tarafından kullanılan istatistiksel veriler elde etmek için gerçekleştirilen tarama düzeyini belirler. modeLIMITED, sampled veya ayrıntılı belirtilir. İşlev için belirtilen bölümleri tablo veya dizin ayırma birim sayfa zincirleri erişir. sys.dm_db_index_physical_statssadece bir Intent-Shared (IS) tablo kilidi, ne olursa olsun o ishal modu gerektirir.

SINIRLI modda hızlı modu ve sayfa sayısı tarar. Bir dizin için yalnızca üst düzey sayfalar b-ağaç (yani yukarıda yaprak düzeyi sayfaları) taranır. Bir yığın için ilişkili pfs ve IAM sayfaları incelenir ve bir yığın veri sayfalarını sınırlı modda taranır.

Sınırlı mod, compressed_page_countnull olduğundan Veritabanı Altyapısıyalnızca b-ağaç ve yığın IAM ve pfs sayfalarında yaprak olmayan taramalar. sampled modunu kullanmak için tahmini bir değer almak için compressed_page_countve ayrıntılı modda gerçek değerini almak için compressed_page_count. sampled modu dizin veya yığın tüm sayfaların yüzde 1 örnek temel istatistiklerini verir. sampled modunda sonuçları yaklaşık olarak kabul edilmelidir. Dizin veya yığın az 10.000 sayfa varsa, ayrıntılı modda sampled yerine kullanılır.

Ayrıntılı modu tüm sayfaları tarar ve tüm istatistikleri döndürür.

Daha fazla iş her modunda gerçekleştirildiğinden modları için ayrıntılı, LIMITED kademeli yavaştır. Hızlı bir tablo ya da dizin boyutu veya parçalanma düzeyini ölçmek için sınırlı modunu kullanın. Bu hızlı ve her nonleaf düzeyi için bir satır dizini IN_ROW_DATA ayırma biriminde döndürmez.

Parametre değerleri belirtmek için sistem işlevleri kullanma

Sen-ebilmek kullanma Transact-SQLişlevleri DB_ID ve OBJECT_ID için bir değer belirtmek için database_idve object_idparametreleri. Ancak, bu işlevler için geçerli olmayan değerlerin geçen, istenmeyen sonuçlara neden olabilir. Örneğin, çünkü onlar yok veya yanlış yazıldığından veritabanı veya nesne adı bulunamazsa, iki işlev null döndürür. sys.dm_db_index_physical_statsİşlevi null belirtme tüm veritabanları veya tüm nesneleri bir joker karakter değeri yorumlayan.

Ayrıca, OBJECT_ID işlevi önce işlenen sys.dm_db_index_physical_statsfonksiyonu denir ve bu nedenle geçerli veritabanı bağlamında değerlendirilir değildir veritabanı belirtilen database_id. Bu davranış, bir null değer döndürür için OBJECT_ID işlevi neden olabilir; ya da, nesne adı, geçerli veritabanı içeriği ve belirtilen veritabanı varsa, hata iletisi döndürülebilir. Aşağıdaki örnekler, bu istenmeyen sonuçlar göstermektedir.

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'AdventureWorks'), 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 AdventureWorks2012;
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

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'AdventureWorks'), 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 AdventureWorks2012;
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 uygulama

Her zaman DB_ID veya OBJECT_ID kullandığınızda, geçerli bir kimlik verdiğini emin olun. OBJECT_ID kullandığınızda, örneğin gibi bir üç bölümlü adı belirtmeniz OBJECT_ID(N'AdventureWorks2012.Person.Address'), ya da onları kullanmadan önce işlevleri tarafından döndürülen değeri sınamak sys.dm_db_index_physical_statsişlevi. a ve b izleyen örnekler, veritabanı ve nesne kimliklerini belirtmek için güvenli bir şekilde göstermektedir.

Parçalanma algılama

Tablo karşı ve bu nedenle, tablo üzerinde tanımlı dizinler yaptığınız veri değişiklikleri (INSERT, update ve delete deyimlerini) sürecinde parçalanma oluşur. Bu değişiklikler genellikle eşit dizinler ve tablo satırları arasında dağıtılır değil çünkü her sayfa dolgunluk zamanla değişebilir. Kısmını veya tamamını tablo dizinleri Tara sorguları için bu tür bir parçalanma ek sayfa okuma neden olabilir. Bu paralel veri tarama engel.

Bir dizin veya yığın parçalanma düzeyini gösterilir avg_fragmentation_in_percentsütun. Kümeler için yığın ölçüde parçalanma temsil eder. Dizinler için dizinin mantıksal parçalanma temsil eder. Aksine dbcc SHOWCONTIG, her iki durumda parçalanma hesaplama algoritmaları kapsayan birden çok dosya depolama düşünün ve bu nedenle doğru.

Mantıksal parçalanma

Bu dizin yaprak sayfaları sırası sayfaları yüzdesidir. Bir out-of-sipariş sayfası, hangi dizine ayrılan sonraki fiziksel sayfa değil ileri pag tarafından işaret sayfa sayfadıre geçerli yaprak sayfaya işaretçi.

Ölçüde parçalanması

Sipariş out uzantıların bir yığın yaprak sayfalarında yüzdesidir. Bir sipariş out ölçüde geçerli sayfa için bir yığın bulunduğu ölçüde fiziksel olarak ileri ölçüde önceki sayfayı içeren ölçüde sonra olduğu değil biridir.

Değeri avg_fragmentation_in_percentsıfıra yakın olarak maksimum performans için olabildiğince olmalı. Ancak, yüzde 10 ile yüzde 0 değerleri kabul edilebilir. Tüm yöntemleri yeniden, yeniden düzenleme ya da yeniden oluşturmayı, parçalanma azaltmak, bu değerleri azaltmak için kullanılabilir. Bir dizindeki parçalanma derecesini analiz hakkında daha fazla bilgi için bkz: Yeniden düzenleme ve dizinler yeniden oluşturma.

Dizin Parçalanmanın azaltılması

Dizin parçalanma sorgu performansını etkileyen bir şekilde parçalanır parçalanma azaltmak için üç seçeneğiniz vardır:

  • Bırakın ve kümelenmiş bir dizin oluşturun.

    Kümelenmiş dizin yeniden oluşturma, verileri yeniden dağıtır ve tam veri sayfalarında sonuçlanır. Tamlık düzeyini, create INDEX FILLFACTOR seçeneği kullanılarak yapılandırılabilir. Bu yöntemde sakıncaları dizin bırakma sırasında çevrimdışı ve döngü yeniden ve işlem atom vardır. Dizin oluşturma kesilirse, dizin yeniden değil. Daha fazla bilgi için, bkz. Index (Transact-sql) oluştur.

  • alter dizin yeniden düzenlemek, dbcc INDEXDEFRAG, yerini yaprak düzey sayfalar dizinin mantıksal sırada yeniden düzenlemek için kullanın. Bu online bir işlem olduğundan, INDEX deyimi çalışırken kullanılabilir. İşlem ayrıca önceden tamamlanan kaybetmeden kesintiye. Bu yöntemde çekince, o kadar iyi bir dizin yeniden oluşturma işlemi ve istatistik güncelleştirmez verileri yeniden düzenleyerek bir iş yapmaz ki olduğunu.

  • alter DIZINI YENIDEN, dbcc DBREINDEX, yerini, çevrimiçi ya da çevrimdışı dizini yeniden oluşturmak için kullanın. Daha fazla bilgi için, bkz. ALTER INDEX (Transact-SQL).

Parçalanma tek başına yeniden düzenlemeniz veya bir dizin yeniden oluşturma için yeterli bir neden değil. Ana parçalanma o Dizin taramalar sırasında sayfa ileri okuma performansı yavaş etkisidir. Bu yavaş tepki süreleri neden olur. Çünkü iş yükünü öncelikle tek aramaları parçalanmış tablo veya dizin sorgusu yüküne taramalar, içermeyen, parçalanma kaldırmayı etkisi olabilir. Daha fazla bilgi için bkz: Bu Microsoft Web sitesini.

[!NOT]

dbcc SHRINKDATABASE veya dbcc SHRINKFILE çalışan dizin küçültme işlemi sırasında kısmen veya tamamen taşınırsa parçalanma doğurabilir. Küçültme işlemi yapılması gerekiyor ise, parçalanma kaldırılmadan önce bu nedenle bunu yapmalısınız.

Bir yığın Parçalanmanın azaltılması

Bir yığın ölçüde parçalanma azaltmak için tablo kümelenmiş bir dizin oluşturun ve sonra dizin bırakın. Kümelenmiş dizin oluşturulurken bu verileri yeniden dağıtır. Bu da mümkün olan en iyi dağıtım veritabanında kullanılabilir boş disk alanı dikkate alınarak yapar. Kümelenmiş dizin sonra yığın yeniden bırakılan veri değil taşınır ve uygun konumda kalır. Bu işlemleri gerçekleştirme hakkında daha fazla bilgi için bkz: create INDEX ve drop INDEX.

Dikkat notuDikkat

Oluşturmak ve bir tablo kümelenmiş bir dizin siliniyor, tüm kümelenmemiş dizinler bu tabloyu iki kez yeniden oluşturur.

Büyük nesne veri sıkıştırma

Varsayılan olarak, büyük nesne (lob) veri içeren sayfalar için alter dizin yeniden düzenlemek beyanı düzenler. lob sayfaları boş kaldırıldı değil, bu veri sıkıştırma disk alanı kullanımını lob verileri bir sürü silinmiş veya lob sütun bırakılan artırabilir.

Belirtilen kümelenmiş bir dizini yeniden düzenlemek, kümelenmiş dizinde içerilen tüm LOB sütunlarını sıkıştırır. Kümelenmemiş bir dizini yeniden düzenlemek, dizindeki anahtar olmayan (içerilen) tüm LOB sütunlarını sıkıştırır. Ne zaman all belirtilen açıklamada, belirtilen tabloyu veya görünümü ile ilişkili tüm dizinler reorganized. Ayrıca, kümelenmiş dizin, temel tablo veya dahil sütunlarla kümelendirilmemiş dizin ile ilişkili tüm lob sütunları kurtulmak.

Disk alanı kullanımını değerlendirmek

avg_page_space_used_in_percentSütunu gösterir sayfa dolgunluk. En yüksek disk alanı kullanımını sağlamak için bu değer yakın çok rasgele ekler olmaz bir dizin için yüzde 100 olmalıdır. Ancak, çok rasgele ekler ve çok dolu sayfalar vardır bir dizin sayfa bölünmesi ve artan bir sayı gerekir. Bu, daha fazla parçalanma neden olur. Bu nedenle, sayfa bölünmesi azaltmak için değer yüzde 100'den az olmalıdır. FILLFACTOR ile bir dizin yeniden oluşturma seçeneği belirtilen dizin sorgusu desen uyacak şekilde değiştirilecek sayfa dolgunluk verir. Dolgu etmeni hakkında daha fazla bilgi için bkz: Bir dizin için dolgu etmeni belirleme. Ayrıca, alter dizin yeniden Düzenle dizin FILLFACTOR belirtilen son sayfaları doldurmak çalışarak kompakt. Bu değeri artırır avg_space_used_in_percent. alter dizin yeniden Düzenle sayfasını dolgunluk azaltmak olamaz unutmayın. Bunun yerine, bir dizin yeniden yapılması gerekiyor.

Dizin parçaları değerlendirmek

Bir fiziksel olarak ardışık yaprak sayfaları aynı dosyada bir ayırma birimi için oluşur. Bir dizin en az bir parçası vardır. Bir dizini olabilir en fazla dizin yaprak düzeyini sayfa sayısı eşit oluşuyor. Büyük parçaları I/O aynı sayfa sayısını okumak için gerekli az disk demek. Bu nedenle, büyük avg_fragment_size_in_pagesdeger, iyi aralığı tarama performansı. avg_fragment_size_in_pagesVe avg_fragmentation_in_percentdeğerleri birbirine ters orantılı. Bu nedenle, yeniden veya bir dizin yeniden düzenleme parçalanma miktarını azaltmak ve parça boyutunu artırın.

İzinler

Aşağıdaki izinleri gerektirir:

  • Veritabanı içinde belirtilen nesne üzerinde DENETIM izni.

  • @ Nesne joker kullanarak belirtilen veritabanı içindeki tüm nesneler hakkında bilgi dönmek için VIEW database state izniobject_id= null.

  • @ Veritabanı joker kullanarak tüm veritabanları hakkında bilgi dönmek için VIEW server state izni database_id = null.

VIEW database state izni verme, ne olursa olsun herhangi bir denetimi izinleri belirli nesneler üzerinde engellendi Döndürülecek Veritabanı tüm nesneleri sağlar.

VIEW database state inkar belirli nesneler üzerinde herhangi bir kontrolü izinler alınmaksızın iade edilecek veritabanındaki tüm nesneler izin vermez. Ayrıca, ne zaman veritabanı joker @database\_id= null belirtilirse, veritabanı atlanmıştır.

Daha fazla bilgi için, bkz. Dinamik yönetimi görünümler ve işlevler (Transact-sql).

Örnekler

A.Belirtilen tablo hakkında bilgi döndüren

Aşağıdaki örnek, tüm dizinler ve bölümleri boyutu ve parçalanma istatistikleri verir Person.Addressiçinde masa AdventureWorks2012veritabanı. Tarama modu ayarı 'LIMITED'en iyi performansı ve verilen İstatistikler sınırlamak için. Bu sorguyu yürüttükten gerektirir, en azından DENETIM izni üzerinde Person.Addresstablosu.

DECLARE @db_id SMALLINT;
DECLARE @object_id INT;

SET @db_id = DB_ID(N'AdventureWorks2012');
SET @object_id = OBJECT_ID(N'AdventureWorks2012.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.Bir yığın hakkında bilgi döndüren

Aşağıdaki örnek öbek tüm istatistiklerini verir dbo.DatabaseLogde AdventureWorks2012veritabanı. Tablo lob veri içerdiğinden, bir satır için döndürülen LOB_DATAayırma birimi için döndürülen satır ek olarak IN_ROW_ALLOCATION_UNIT, yığın veri sayfalarını depoladığı. Bu sorguyu yürüttükten gerektirir, en azından DENETIM izni üzerinde dbo.DatabaseLogtablosu.

DECLARE @db_id SMALLINT;
DECLARE @object_id INT;
SET @db_id = DB_ID(N'AdventureWorks2012');
SET @object_id = OBJECT_ID(N'AdventureWorks2012.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 bilgi döndüren

Aşağıdaki örnek, tüm tablolar ve dizinler örneği içinde tüm istatistiklerini verir SQL Serverjoker belirterek NULLtüm parametrelerin. Bu sorguyu yürüttükten VIEW server state izni gerektirir.

SELECT * FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL);
GO

D.Sys.dm_db_index_physical_stats yeniden veya dizinler yeniden düzenlemek için bir komut dosyası kullanma

Aşağıdaki örnek, otomatik olarak reorganizes veya yüzde 10 üzerinde bir ortalama parçalanma olan tüm bölümler bir veritabanında yeniden oluşturur. Bu sorguyu yürüttükten VIEW database state izni gerektirir. Bu örnek DB_IDveritabanı adı belirtmeden ilk parametre olarak. Geçerli veritabanı uyumluluk düzeyi 80 veya daha düşük ise, bir hata oluşturulur. Hatayı gidermek için yerini DB_ID()geçerli bir veritabanı adı ile. Veritabanı uyumluluk düzeyleri hakkında daha fazla bilgi için bkz: alter database uyumluluk düzeyi (Transact-sql).

-- 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
        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.Sys.dm_db_index_physical_stats sayfa sıkıştırılmış sayfa sayısını göstermek için kullanma

Aşağıdaki örnek, görüntüleme ve sayfa satır sayfaları ve sayfa sıkıştırılmış karşı toplam sayısını karşılaştırmak gösterilmiştir. Bu bilgiler, bir dizin veya tablo için sıkıştırma sağlayan parası 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
JOIN sys.objects o on o.object_id = ips.object_id
ORDER BY record_count DESC;

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
JOIN sys.objects o on o.object_id = ips.object_id
ORDER BY record_count DESC;

F.Sys.dm_db_index_physical_stats sampled modunda kullanma

Aşağıdaki örnek, nasıl sampled bir yaklaşık daha ayrıntılı modda sonuçlar farklı döner gösterir.

CREATE TABLE t3 (col1 int PRIMARY KEY, col2 varchar(500)) WITH(DATA_COMPRESSION = PAGE);
GO
BEGIN TRAN
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');

CREATE TABLE t3 (col1 int PRIMARY KEY, col2 varchar(500)) WITH(DATA_COMPRESSION = PAGE);
GO
BEGIN TRAN
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');

Ayrıca bkz.

Başvuru

Dinamik yönetimi görünümler ve işlevler (Transact-sql)

Ilgili dinamik yönetimi görünümler ve işlevler (Transact-sql) dizini

verirsys.dm_db_index_operational_statsTüm (Transact-sql)

sys.dm_db_index_usage_stats (Transact-sql)

sys.dm_db_partition_stats (Transact-sql)

allocation_units (Transact-sql)

Sistem görünümleri (Transact-sql)