Makale numarası: 924947 - Son Gözden Geçirme: 20 Kasım 2007 Salı - Gözden geçirme: 2.5

SQL Server için bazı tabloların kullanılmayan alanı önemli ölçüde artırır.

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu makalede, Microsoft SQL Server için bazı tabloların kullanılmayan alanı önemli ölçüde artırır bir senaryo açıklanır. Sonra makaleyi, bu soruna geçici bir çözüm bulmak için kullanabileceğiniz aşağıdaki iki yöntemden anlatılmaktadır:
  • Öbek tabloları, kümelenmiş dizinler kullanan tablolara dönüşür.
  • Açık nesneleri yapılandırma seçeneği, yüksek bir değere ayarlayın.

Belirtiler

SQL Server'da aşağıdaki senaryoyu düşünün:
  • Bir SQL Server örneği bir ya da daha fazla kullanıcı veritabanı vardır.
  • Bu veritabanlarındaki tablolara toplam sayısı, bu bölümün sonundaki tabloda listelenen özel eşik değerinden büyük. Bu tablolar sistem tablosu, kullanıcı tablo ve geçici tablo içerir.
  • SQL örneğine bağlı olan uygulamaları Server bu tabloların çoğu başvuru.
Bu senaryoda, aşağıdaki belirtilerden görebilirsiniz:
  • Normal hızından daha hızlı bir hızda bu kullanıcı veritabanlarını kullanan alan büyüyor. Bu kullanıcı veritabanlarını Autogrowth ayarlarına bağlı veritabanı dosyaları, normal durumda ulaşması daha sık ulaşması.
  • Bu kullanıcı veritabanlarını kullanan alanının kullanılmayan bölümü, normal kullanılmayan bölümü daha büyük olacaktır.
  • Kümelenmiş dizin, yığın depolama yapısını ve metin görüntü ağaç gibi bu kullanıcının veritabanları için depolama yapıları özelliklerini görüntülediğinizde, çok sayıda kullanılmayan alanı görürsünüz.
  • Ayrılmış alan sysindexes tablosunda dizin girdileri için 8'in katları artar. Bununla birlikte, kullanılan alanı sysindexes tablosunda dizin girdileri için 1 veya 2 gibi yalnızca küçük bir sayı olarak artırır. Diğer bir deyişle, yeni bir kapsam içinde ayrılan her sekiz sayfa için yalnızca birkaç sayfa şimdiye kadar bu uzantı kullanılır.
Bu makalenin önceki bölümlerinde açıklanan eşik, aşağıdaki koşullara bağlı olarak değişir:
  • Kullanmakta olduğunuz SQL Server'ın belirli bir sürüm
  • SQL için yapılandırdığınız bellek Server
Aşağıdaki tabloda, bu eşikleri için SQL Server'ın farklı sürümleri listelenmektedir.
Bu tabloyu kapaBu tabloyu aç
Sürüm<a1>Bellek</a1> (bayt)Eşiği
Kuruluş/standart/DeveloperBirden fazla 671,088,6408192
Kuruluş/standart/Developer' Den küçük 671,088,6402048
Kuruluş/standart/Developer' Den küçük 67,108,864512
Kuruluş/standart/Developer' Den küçük 8,388,608128
Kişisel/MSDEUygulanamaz128
Bellek, kullanmakta olduğunuz SQL Server örneği için <a1>en fazla sunucu belleği</a1> ayarına karşılık gelir. En fazla sunucu belleği ayarını yapılandırmak için sp_configure Sistem saklı yordamını kullanabilirsiniz.

Not SQL Server 2005'te kullanılan alan bilgileri ile rezerve edilmiş bilgi edinmek için sys.dm_db_partition_stats Katalog görünümü sorgulayabilirsiniz. SQL Server 2000'de, bu bilgileri edinmesi için sysindexes tablo sorgulayabilirsiniz.

Neden

SQL Server'ı iki tür önbelleğe alınmış bilgi için alan ayırma bellekte saklar: tahsisat önbellek ve boş alan önbellek. Tahsisat önbellek, belirli bir dizinin en son ayrılmış kapsamları için kapsam kimliği içerir. Boş alan önbellek bu uzantılardan tahsis son ayrılmış sayfa için sayfa numaralarını içerir. Ayrıca, sayfaları durumunu içerir. Bu önbelleklerinin boş duruma gelirse, "Belirtiler" bölümünde açıklanan sorunlar oluşur.

Aşağıdaki nedenler yüzünden bu önbelleklerinin boş olur:
  • Eşitlemeler arasındaki bellek içi meta veri bilgi ve bu bilgileri, disk üzerinde gerçekleştirmelisiniz farklı komutları çalıştırabilirsiniz. Örneğin, aşağıdaki komutlardan birini çalıştırın:
    • dbcc updateusage
    • İSTATİSTİKLERİ GÜNCELLEŞTİRME
  • Açık nesneleri seçeneği kullanılarak yapılandırılmış olan tüm nesne tanımlayıcıları kullanılır. Bu nedenle, yok bir boş tanımlayıcıları vardır.

Pratik Çözüm

Bu soruna geçici bir çözüm için aşağıdaki yöntemlerden birini kullanın:
  • Öbek tabloları, kümelenmiş dizinler kullanan tablolara dönüşür.
  • Açık nesneleri yapılandırma seçeneği, yüksek bir değere ayarlayın.
Bu yöntem, kullanılmayan bir tablo için ayrılan alan için büyüme oranı azaltabilirsiniz. Aşağıdaki bölümlerde, bu iki yöntem açıklanmaktadır. Bölümler, neden bu yöntemlerden bu makalede açıklanan sorunu gidermek de açıklanmaktadır.

Öbek tabloları kümelenmiş dizinler kullanan tablolara dönüşür...

Not Kümelenmiş dizinler kullanan tablolara öbek tabloları dönüştürdükten sonra düzenli olarak gereksiz yere kullanılmayan herhangi bir alana geri kazanmak için dizin bakım işlemleri gerçekleştirebilirsiniz. Örneğin, aşağıdaki komutları çalıştırabilirsiniz:
DBCC DBREINDEX
DBCC INDEXDEFRAG 
aşağıdaki normal öbek tablodaki bir kayıt eklediğinizde, işlemler kümesidir:
  • Tabloya bir satır eklemek 1. deneyin.
  • 2. Bu tablo, dizin kimliği 0 için boş alan önbelleği bakın.
  • 3. Geçerli sayfalar boş alan önbelleğinde var olup olmadığını belirleyin.
  • 4. Evet ise:
    • 4. 1 '. Sayfa yeterli alan yoksa, sayfanın veri ekleyin.
  • 5. Yüklenmemişse:
    • 5.1. SQL Server yeni bir sayfa için bu satırı tahsisatı gerekir.
    • Bu tablo, dizin kimliği 0 tahsisat önbellek 5,2. bakın.
    • 5.3. Geçerli kapsamlarını tahsisat önbelleğinde var olup olmadığını belirleyin.
    • 5.4. Evet ise:
      • 5.4.1. Kapsamı sekiz sayfaların hiçbirini bu yeni sayfa ayırma isteği için kullanılıp kullanılamayacağını belirler.
      • 5.4.2. Evet ise:
        • 5.4.2.1. Tahsis edilecek bir sayfadan bu uzantı zaten ayrılmış.
        • 5.4.2.2. 5.5.5. Adıma gidin.
      • 5.4.3. Yüklenmemişse:
        • 5.4.3.1. 5.5.1. Adıma gidin.
    • 5.5. Yüklenmemişse:
      • 5.5.1. Veriyle genel tahsisat Haritası'nı (GAM) ve ikincil genel tahsisat Haritası (SGAM), tahsis edilecek yeni bir kapsam bulmak için kullanın.
      • 5.5.2. Yeni bir kapsam ayrılamadı.
      • 5.5.3. 5. 1. Adımdaki yeni sayfa ayırma isteğini yerine getirmek için bu yeni uzantı bir sayfa kullanın.
      • 5.5.4. Tahsisat önbelleğinde, yeni ayrılan bu uzanım ile ilgili bilgileri doldurun.
      • 5.5.5. <a1>Doldur</a1> Bu konuda bilgi yeni sayfa önbelleğinde boş alan ayırır.
Önbellekteki Ayırma ve boş alan önbelleği sonraki ekleme operasyonlar arasında boşsa, ekleme işlemlerinin başarılı olması, SQL Server yeni sayfalar yeni bir kapsam tahsis. Tablonun meta verileri bellekten kaldırıldığında, önbellekteki ayırma ve boş alan önbelleğini de kaldırılır. Bu nedenle tabloya başvuran bir ekleme işlemini gerçekleştirdiğiniz bir sonraki açışınızda bu önbelleklerinin boştur. Bu durumda, SQL Server gerekir adım 5 gerçekleştirin ve sonra da 5.5 adım. Bu davranış, yalnızca bir sayfa olarak kullanıldığında, sekiz sayfa tahsis göstermek son ayrılmış kapsamlarını neden olur. Tablo üzerinde gerçekleştirdiğiniz her ekleme işlemi için bir en kötü Durum senaryosunda, 56 kilobayt (KB) boş alan harcanan.

Tipik bir kümelenmiş dizini olan bir tabloya veri eklediğinizde, operasyon dizisi aşağıdadır.
  • Tablodaki bir satır eklemek 1. deneyin.
  • SQL Server kümeleme anahtarının depolamalısınız veri sayfası'nı bulmak için B-ağaç 2. çapraz geçiş yapma.
  • 3. Yeterli alan sayfasında yeni bir satır için olup olmadığını.
  • 4. Evet ise:
    • 4.1. Verileri bu sayfaya yerleştirin.
  • 5. Yüklenmemişse:
    • 5.1. SQL Server yeni bir sayfa için bu satırı tahsisatı gerekir.
    • Bu tablo, dizin kimliği 1'için tahsisat önbellek 5,2. bakın.
    • 5.3. Geçerli kapsamlarını tahsisat önbelleğinde var olup olmadığını belirleyin.
    • 5.4. Evet ise:
      • 5.4.1., Sekiz sayfalardan herhangi birindeki sürece bu yeni sayfa ayırma isteği için kullanıp kullanamayacağını belirler.
      • 5.4.2. Evet ise:
        • 5.4.2.1. Tahsis edilecek bir sayfadan bu uzantı zaten ayrılmış.
      • 5.4.3. Yüklenmemişse:
        • 5.4.3.1. 5.5.1. Adıma gidin.
    • 5.5. Yüklenmemişse:
      • Veriyle GAM ve SGAM 5.5.1., tahsis edilecek yeni bir kapsam bulmak için kullanın.
      • 5.5.2. Yeni bir kapsam ayrılamadı.
      • 5.5.3. 5. 1. Adımdaki yeni sayfa ayırma isteğini yerine getirmek için bu uzanım bir sayfa kullanın.
      • 5.5.4. Tahsisat önbelleğinde, yeni ayrılan bu uzanım ile ilgili bilgileri doldurun.
"Neden" bölümünde açıklanan nedeniyle önbellekteki ayırma ve boş alan önbellek temizlenir, bu tablonun sonraki ekleme işlemleri arasında yeni bir sayfa ayırmaya hemen gerek yoktur. Eklenen veriler, varolan sayfanın belirli bir küme tuşa fiziksel bulunmalı sığabilecek sürece, bu geçerlidir. Veri sayfası dolduğunda, önbelleklerinin boş ise, SQL Server gerekir 5. adımı gerçekleştirin ve sonra 5.5 adım. Kümelenmiş bir dizin'i kullanıyorsanız, bu makalede, gösteren, yeni sayfalar için tahsis edilen senaryosu öbek tablodaki bir kayıt burada eklenen senaryoya göre çok daha az sıklıkta oluşur.

Sorun oluşur ve Tahsisat önbellek ve boş alan önbellek boş olan iki durumlar şunlardır: Tablonun şema veri sayfasına sığacak şekilde 100 satır verdiğini varsayılır.
  • Tablonun yalnızca bir yığın depolama yapısını varsa, SQL Server her ekleme işlemi için yeni bir kapsam ayırma ve tek bir sayfa bu kapsamı kullanın.
  • Tablo, kümelenmiş bir dizin varsa, SQL Server her 100 ekleme işlemi için yeni bir kapsam ayırma ve tek bir sayfa bu kapsamı kullanın.

Açık nesneleri yapılandırma seçeneği yüksek bir değere ayarlayın.

Bu sorun, öncelikle belirtilen bellek alanındaki nesneleri açma seçeneği dayalı tüm yuvası SQL Server kullanması nedeniyle oluşur. Bu makalede açıklanan sorunla karşılaştığınızda, belirli SQL Server örneğinde başvurulan tablolar neredeyse tüm yerleştirmek için bu seçeneği değerini ayarlayabilirsiniz.

Bu sorunu engelleyen bir nesne açık seçenek değerini belirlemek için <a0></a0>, aşağıdaki adımları izleyin:
  1. Belirli SQL Server örneğinde varolan tablolara toplam sayısını belirler.

    Not Tablolar, kullanıcı tablo ve sistem tabloları içerir. Sistem veritabanlarından alınan tabloları dahil etmeniz gerekir.
  2. Geçici tablolara ve farklı sorgular ve bu uygulamaları kullanan worktables yer sağlayan bir arabellek boyutu tahmin.
  3. Arabellek sayısı SQL Server'ın bu örneğinin erişilen tablo belirlemek için kullanıcı tablosu ve sistem tabloları ekleyin. Açık nesneleri yapılandırma seçeneği ayarlamanız gerekir (değer) bu toplam sayısıdır.
Bellek tüketimi, SQL sırasında ön tahsis olduğundan sunucu başlamasından bu değeri temel alan, açık nesneleri yapılandırma seçeneği çok yüksek bir değere ayarlanmadı gerekir. Açık nesneleri seçeneği, çok yüksek bir değere ayarlarsanız, özgün olarak başka amaçlarla gibi ve veri arabellekleri, Sorgu yürütmesi için kullanılan bellek yerine seçeneği nesneleri açmak için <a1>bellek</a1> alanında Tablo meta verileri korumak için kullanılır.

Normal koşullarda açık nesneleri yapılandırmasını değiştirmeniz önerilmez. Bu makalede anlatılan sorunla karşılaştığınızdan emin değilseniz, yalnızca bu değeri değiştirin.

Durum

Microsoft, "Geçerli Olduğu Ürünler" bölümünde listelenen Microsoft ürünlerinde bu sorunun olduğunu onaylamıştır.

Daha fazla bilgi

Açık nesneleri seçenek ayarları, bu soruna neden müşteri adayı

SQL Server nesnesine ilişkin bilgiler, belirli bir nesnenin (tablo) sorguya başvuruyor her belleğe yükler. Tüm dizini meta verileri SQL Server, belleğe yüklenmiş nesne bilgilere başvurular var. Bu makalede açıklanan tahsisat önbellekler, belirli bir dizin ile ilişkilendirilir. Açık nesneleri seçeneği belleğe yükleyebilir ve SQL Server örneği tanımlayıcılarının sayısını denetler.

SQL Server başladığında, bellek içi sürümünü nesne meta verilerini tutmak için belirli bir yuva veya tanımlayıcıları, SQL Server atar. Ayrılmış bir yuva numarasını SQL Server sürümü ve SQL Server için yapılandırılmış bellek “ Belirtiler ” bölümünde anlatıldığı şekilde bağlıdır. Bu yuvalar, başlangıçta boş bir liste bir parçası olur. Belirli bir algoritma nesnesi meta verileri için boş listesinden yuvası atamak için kullanılır. Algoritma aşağıdaki iki çalışma modu vardır.

Mod 1

SQL Server'ı başlattıktan sonra yeni bir nesne başvuruda bulunulan her bellek tanımlayıcıları boş listeden birini kullanır. SQL Server, meta verileri, sorguda başvurulan bir nesne hakkında yüklendiğinde tüm varolan Yuvalar kullanmaya devam eder. Yine de yuva girişi olduğundan boş listesinde, SQL Server bu yuva kullanmaya devam eder. Varolan bir yuva için SQL Server başka bir nesne tarafından kullanılan bellek yeniden değil.

Mod 2

SQL Server, nesneyi yeni bir sorguda başvurulan ve boş liste boş duruma, varolan nesne, meta verilerini bellekten kaldırılan bir yuva olup olmadığını belirlemek için tüm nesnelerin listesini tarar. Sorguda, tablonun yalnızca başvuru olarak SQL Server yuvasına nesne meta verileri tutmalıdır. Sorgu bittiğinde, yeni bir sorgu farklı bir tabloya başvuruyorsa SQL Server yuvayı yeniden kullanabilirsiniz.

Nesne meta verilerini bellekten kaldırıldığında, tüm ilişkili dizin meta verilerini de kaldırılır. Bu davranış oluştuğunda, SQL Server da önbellekteki ayırma ve boş alan önbelleği kaybeder. Sonra farklı bir sorgu, bu tabloyu yeniden başvurduğunda, bu tahsisat önbelleklerinin boştur. Bu nedenle, SQL Server bir sayfa ayırmaya çalıştığında bir sonraki başlatılışında, SQL Server yeni bir kapsam ayırmaya çalışır.

SQL Server, SQL Server, herhangi bir yuva geri edemiyor kadar nesne meta verilerini içeren bir yuva geri kazanmak SQL Server devam ederse, boş listesinin boyutunu artırır.

Referanslar

Yapılandırma seçeneklerini değiştirmek için sp_configure depolanan yordamı kullanma hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:
http://msdn2.microsoft.com/en-us/library/ms188787.aspx (http://msdn2.microsoft.com/en-us/library/ms188787.aspx)
Açık nesneleri seçeneği hakkında daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin:
http://msdn2.microsoft.com/en-us/library/aa196701(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa196701(SQL.80).aspx)
En fazla sunucu belleği yapılandırma seçeneği hakkında daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin:
http://msdn2.microsoft.com/en-us/library/ms180797.aspx (http://msdn2.microsoft.com/en-us/library/ms180797.aspx)
SQL tablosu ve dizin mimarisi hakkında daha fazla bilgi için sunucu aşağıdaki MSDN Web sitesini ziyaret edin:
http://msdn2.microsoft.com/en-us/library/ms208356.aspx (http://msdn2.microsoft.com/en-us/library/ms208356.aspx)

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Workgroup Edition
Anahtar Kelimeler: 
kbmt kbexpertiseadvanced kbtshoot kbsql2005engine kbprb KB924947 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:924947  (http://support.microsoft.com/kb/924947/en-us/ )