Aracılığıyla paylaş


tempdb veritabanı

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

Bu makalede, SQL Server, Azure SQL Veritabanı veya Azure SQL Yönetilen Örneği'ndeki veritabanı altyapısı örneğine bağlı tüm kullanıcıların kullanabileceği genel bir kaynak olan sistem veritabanı açıklanmaktadır tempdb .

Overview

Sistem tempdb veritabanı, aşağıdakileri içeren genel bir kaynaktır:

  • Açıkça oluşturulan kullanıcı nesneleri. Bunlar arasında şunlar vardır:

    • Bu tablolardaki genel veya yerel geçici tablolar ve dizinler
    • Geçici saklı yordamlar
    • Tablo değişkenleri dahil olmak üzere büyük değişkenler
    • Tablo değerli işlevlerde döndürülen tablolar
    • Cursors

    Bir kullanıcı veritabanında oluşturulabilen kullanıcı nesneleri de içinde tempdboluşturulabilir, ancak dayanıklılık garantisi olmadan oluşturulur ve Veritabanı Altyapısı örneği yeniden başlatıldığında bırakılır.

  • Veritabanı altyapısının oluşturduğu iç nesneler. Bunlar arasında şunlar vardır:

    • Havuzlar, imleçler, sıralamalar ve geçici büyük nesne (LOB) depolaması için ara sonuçları depolamak için çalışma tabloları.
    • Karma eşleştirme veya karma toplama işlemleri için iş dosyaları.
    • Dizin oluşturma veya yeniden oluşturma (belirtilirse SORT_IN_TEMPDB ) ya da belirli GROUP BY, ORDER BYveya UNION sorgular gibi işlemler için ara sıralama sonuçları.

    Her iç nesne en az dokuz sayfa kullanır: IAM sayfası ve sekiz sayfalık kapsam. Sayfalar ve kapsamlar hakkında daha fazla bilgi için bkz. Sayfalar ve kapsamlar.

  • Sürüm depoları, satır sürümü oluşturmayı destekleyen veri satırlarını barındıran veri sayfaları koleksiyonlarıdır. Sürüm depoları aşağıdakileri içerir:

    • Satır sürüm oluşturma veya READ COMMITTEDSNAPSHOT yalıtım işlemleri kullanan bir veritabanındaki veri değiştirme işlemleri tarafından oluşturulan satır sürümleri.
    • Çevrimiçi dizin işlemleri, Birden Çok Etkin Sonuç Kümesi (MARS) ve AFTER tetikleyiciler gibi özellikler için veri değiştirme işlemleri tarafından oluşturulan satır sürümleri.

    SQL Server 2025(17.x) ile başlayarak, içinde hızlandırılmış veritabanı kurtarma (ADR) etkinleştirildiğinde tempdbtempdb iki farklı ve bağımsız sürüm deposu içerir:

    • ADR etkinleştirilmemiş kullanıcı veritabanlarındaki işlemler tarafından oluşturulan satır sürümleri için kullanılan geleneksel sürüm deposu.
    • içindeki işlemler tempdbtarafından oluşturulan satır sürümleri için kullanılan kalıcı sürüm deposu (PVS).

    içinde ADR tempdb etkinse veri dosyalarının her iki sürüm depolarını da içermesi için tempdb yeterli disk alanı ayırdığından emin olun. İş yükünüze bağlı olarak, veri dosyalarının boyutunun tempdb PVS verilerini içerecek şekilde artırılması gerekebilir.

    Geleneksel sürüm deposunun alan kullanımı hakkında tempdb daha fazla bilgi için bkz. Tempdb'de kullanılan alan. PVS tarafından kullanılan alan hakkında daha fazla bilgi için bkz. Kalıcı sürüm deposu (PVS) tarafından kullanılan alan.

içindeki tempdb işlemler en az günlüğe kaydedilir. tempdb , Veritabanı Altyapısı her başlatıldığında yeniden oluşturulur, böylece sistem her zaman boş tempdb bir veritabanıyla başlar. Geçici saklı yordamlar ve yerel geçici tablolar, bunları oluşturan oturum bağlantısı kesildiğinde otomatik olarak bırakılır.

tempdb Veritabanı Altyapısı'nın bir çalışma süresinden diğerine hiçbir zaman kaydedilecek bir şey olmaz. üzerinde yedekleme ve geri yükleme işlemlerine tempdbizin verilmez.

SQL Server'da tempdb'nin fiziksel özellikleri

Aşağıdaki tabloda SQL Server'daki verilerin ve günlük dosyalarının tempdb ilk yapılandırma değerleri listelenmiştir. Değerler, veritabanı için model varsayılan değerleri temel alır. Bu dosyaların boyutları, SQL Server'ın farklı sürümleri için biraz farklılık gösterebilir.

File Mantıksal ad Fiziksel ad Başlangıç boyutu Dosya büyümesi
Birincil veriler tempdev tempdb.mdf 8 megabayt Disk dolana kadar 64 MB otomatik büyütme
İkincil veri dosyaları temp# tempdb_mssql_#.ndf 8 megabayt Disk dolana kadar 64 MB otomatik büyütme
Log templog templog.ldf 8 megabayt 64 megabayt ile en fazla 2 terabayt arasında otomatik büyütme

Tüm tempdb veri dosyaları her zaman aynı başlangıç boyutuna ve büyüme parametrelerine sahip olmalıdır.

Tempdb veri dosyalarının sayısı

Veritabanı Altyapısı'nın sürümüne, yapılandırmasına ve iş yüküne bağlı olarak, tempdb ayırma çekişmelerini azaltmak için birden çok veri dosyası gerekebilir.

Önerilen toplam veri dosyası sayısı, makinedeki mantıksal işlemci sayısına bağlıdır. Genel rehberlik olarak:

  • Mantıksal işlemci sayısı sekizden küçük veya sekize eşitse, aynı sayıda veri dosyası kullanın.

  • Mantıksal işlemci sayısı sekizden büyükse, sekiz veri dosyası kullanın.

  • Ayırma çekişmesi yine de gözlemleniyorsa tempdb , çekişme kabul edilebilir düzeylere gelene kadar veri dosyası sayısını dört katına çıkarın veya iş yükünde değişiklik yapın.

Daha fazla bilgi için bkz. SQL Server tempdb veritabanında ayırma çekişmesini azaltma önerileri.

için geçerli boyut ve büyüme parametrelerini denetlemek için tempdbiçindeki sys.database_files katalog görünümünü tempdbkullanın.

SQL Server'da tempdb verilerini ve günlük dosyalarını taşıma

Verileri ve günlük dosyalarını taşımak tempdb için bkz. Sistem veritabanlarını taşıma.

SQL Server'da tempdb için veritabanı seçenekleri

Aşağıdaki tabloda, veritabanındaki her veritabanı seçeneği tempdb için varsayılan değer ve seçeneğin değiştirilip değiştirilemeyeceği listelenmiştir. Bu seçeneklerin geçerli ayarlarını görüntülemek için sys.databases katalog görünümünü kullanın.

Veritabanı seçeneği Varsayılan değer Değiştirilebilir
ACCELERATED_DATABASE_RECOVERY OFF Yes1
ALLOW_SNAPSHOT_ISOLATION OFF Yes
ANSI_NULL_DEFAULT OFF Yes
ANSI_NULLS OFF Yes
ANSI_PADDING OFF Yes
ANSI_WARNINGS OFF Yes
ARITHABORT OFF Yes
AUTO_CLOSE OFF No
AUTO_CREATE_STATISTICS ON Yes
AUTO_SHRINK OFF No
AUTO_UPDATE_STATISTICS ON Yes
AUTO_UPDATE_STATISTICS_ASYNC OFF Yes
AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN) OFF No
CHANGE_TRACKING OFF No
COMPATIBILITY_LEVEL Veritabanı Altyapısı sürümüne bağlıdır.

Daha fazla bilgi için bkz. ALTER DATABASE (Transact-SQL) uyumluluk düzeyi.
Yes
CONCAT_NULL_YIELDS_NULL OFF Yes
CONTAINMENT NONE No
CURSOR_CLOSE_ON_COMMIT OFF Yes
CURSOR_DEFAULT GLOBAL Yes
Veritabanı durumu ONLINE No
Veritabanı güncelleştirmesi READ_WRITE No
Veritabanı kullanıcı erişimi MULTI_USER No
DATE_CORRELATION_OPTIMIZATION OFF Yes
DB_CHAINING ON No
DELAYED_DURABILITY DISABLED

Bu seçenek ne olursa olsun, gecikmeli dayanıklılık her zaman üzerinde tempdb.
Yes
ENCRYPTION OFF No
MIXED_PAGE_ALLOCATION OFF No
NUMERIC_ROUNDABORT OFF Yes
PAGE_VERIFY CHECKSUM SQL Server'ın yeni yüklemeleri için

Bir SQL Server örneği yerinde yükseltildiğinde mevcut PAGE_VERIFY değer korunabilir.
Yes
PARAMETERIZATION SIMPLE Yes
QUOTED_IDENTIFIER OFF Yes
READ_COMMITTED_SNAPSHOT OFF No
RECOVERY SIMPLE No
RECURSIVE_TRIGGERS OFF Yes
Hizmet Aracısı ENABLE_BROKER Yes
TARGET_RECOVERY_TIME 60 Yes
TEMPORAL_HISTORY_RETENTION ON Yes
TRUSTWORTHY OFF No

SQL Server 2025 (17.x) sürümünden itibaren 1ACCELERATED_DATABASE_RECOVERY'nin ON olarak ayarlanması tempdb desteklenmektedir. SQL Server'ın önceki sürümlerinde veritabanı seçeneğinin değiştirilmesine ACCELERATED_DATABASE_RECOVERYtempdb izin verilmiyor.

Bu veritabanı seçeneklerinin açıklaması için bkz. ALTER DATABASE SET options.

Azure SQL Veritabanı'nda tempdb

Azure SQL Veritabanı'nda davranış ve yapılandırmanın tempdb bazı yönleri SQL Server'dan farklıdır.

Tek veritabanları için, mantıksal sunucudaki her veritabanının kendi tempdbvardır. Elastik havuzda, tempdb aynı havuzdaki tüm veritabanları için paylaşılan bir kaynaktır, ancak bir veritabanı tarafından oluşturulan geçici nesneler aynı elastik havuzdaki diğer veritabanlarına görünmez.

içindeki tempdbkatalog görünümleri ve dinamik yönetim görünümleri (DMV' ler) gibi nesnelere tempdb veritabanına çapraz veritabanı başvurusu aracılığıyla erişilebilir. Örneğin, sys.database_files görünümünü sorgulayabilirsiniz:

SELECT file_id,
       type_desc,
       name,
       size,
       max_size,
       growth
FROM tempdb.sys.database_files;

Azure SQL Veritabanı'ndaki genel geçici tablolar veritabanı kapsamına alınır. Daha fazla bilgi için bkz . Azure SQL Veritabanı'nda veritabanı kapsamlı genel geçici tablolar.

Azure SQL Veritabanı'ndaki boyutlar hakkında tempdb daha fazla bilgi edinmek için şunları gözden geçirin:

SQL Yönetilen Örneği'nde tempdb

Azure SQL Yönetilen Örneği'nde davranış ve varsayılan yapılandırmanın tempdb bazı yönleri SQL Server'dan farklıdır.

Dosya sayısını tempdb , büyüme artışlarını ve en büyük boyutlarını yapılandırabilirsiniz. Azure SQL Yönetilen Örneği'nde ayarları yapılandırma tempdb hakkında daha fazla bilgi için bkz. Azure SQL Yönetilen Örneği için tempdb ayarlarını yapılandırma.

Azure SQL Yönetilen Örneği, tüm genel geçici tablolara ve genel geçici saklı yordamlara aynı SQL yönetilen örneği içindeki tüm kullanıcı oturumları tarafından erişilebilen SQL Server ile aynı şekilde geçici nesneleri destekler.

Azure SQL Yönetilen Örneği'ndeki boyutlar hakkında tempdb daha fazla bilgi edinmek için kaynak sınırlarını gözden geçirin.

Fabric'te SQL veritabanında tempdb

Microsoft Fabric'teki SQL veritabanındaki boyutlar hakkında tempdb daha fazla bilgi edinmek için Özellik karşılaştırması: Microsoft Fabric'te Azure SQL Veritabanı ve SQL veritabanı makalesindeki kaynak sınırları bölümünü gözden geçirin.

Azure SQL Veritabanı'na benzer şekilde, Microsoft Fabric'teki SQL veritabanındaki genel geçici tablolar da veritabanı kapsamına alınır. Daha fazla bilgi için bkz . Azure SQL Veritabanı'nda veritabanı kapsamlı genel geçici tablolar.

Sınırlamalar

Veritabanında aşağıdaki işlemler gerçekleştirilemez tempdb :

  • Dosya grupları ekleme.
  • Veritabanını yedekleme veya geri yükleme.
  • Sıralama düzeni değiştiriliyor. Varsayılan harmanlama, sunucu harmanlamasıdır.
  • Veritabanı sahibini değiştirme. tempdb sa'ya aittir.
  • Veritabanı anlık görüntüsü oluşturma.
  • Veritabanı bırakılıyor.
  • Konuk kullanıcı veritabanından bırakılıyor.
  • Veri Yakalamayı Değiştir'i etkinleştirme.
  • Veritabanı yansıtmaya katılma.
  • Birincil dosya grubunu, birincil veri dosyasını veya günlük dosyasını kaldırma.
  • Veritabanını veya birincil dosya grubunu yeniden adlandırma.
  • çalıştırılıyor DBCC CHECKALLOC.
  • çalıştırılıyor DBCC CHECKCATALOG.
  • Veritabanını olarak OFFLINEayarlama.
  • Veritabanını veya birincil dosya grubunu olarak READ_ONLYayarlama.

Permissions

Herhangi bir kullanıcı içinde tempdbgeçici nesneler oluşturabilir.

Kullanıcılar, ek izinler almadıkları sürece içinde tempdbyalnızca kendi geçici olmayan nesnelerine erişebilir.

Veritabanı kullanıcısının veya rolünün kullanmasını CONNECTönlemek için üzerindeki tempdb izni tempdb etmek mümkündür. Birçok işlem kullanılmasını tempdbgerektirdiğinden bu önerilmez.

SQL Server'da tempdb performansını iyileştirme

Dosyaların boyutu ve fiziksel yerleşimi tempdb performansı etkileyebilir. Örneğin, başlangıç boyutu tempdb çok küçükse, Veritabanı Altyapısı örneği her yeniden başlatıldığında iş yükünü desteklemek için gereken boyuta kadar zaman ve kaynaklar otomatik olarak büyütülebilir tempdb .

  • Mümkünse, veri dosyaları için büyüme işlemlerinin performansını artırmak için anında dosya başlatmayı kullanın.
  • Ortamdaki tipik iş yükünü karşılamak için dosya boyutunu yeterince büyük bir değere ayarlayarak tüm tempdb dosyalar için önceden yer ayırın. Ön yükleme, otomatik büyümenin çok sık yapılmasını önler tempdb ve bu da performansı olumsuz etkileyebilir.
  • Veritabanındaki tempdb dosyalar planlanmamış büyüme olayları sırasında alan sağlamak için otomatik olarak büyütülecek şekilde ayarlanmalıdır.
  • tempdb Eşit boyutta birden çok veri dosyasını bölmek, kullanan tempdbişlemlerin verimliliğini artırabilir.
    • Veri ayırma dengesizliğini önlemek için, Veritabanı Altyapısı daha fazla boş alana sahip dosyalarda ayırmaları destekleyen orantılı doldurma algoritması kullandığından, veri dosyalarının ilk boyutu ve büyüme parametreleri aynı olmalıdır.
    • Dosya büyüme artışını 64 MB gibi makul bir boyuta ayarlayın ve büyüme dengesizliklerini önlemek için büyüme artışını tüm veri dosyaları için aynı hale getirin.
  • SQL Server 2025 (17.x) ile başlayarak, içindeki işlemler için anlık işlem geri alma ve agresif günlük kesilmesi avantajlarından yararlanmak amacıyla hızlandırılmış veritabanı kurtarmayı etkinleştirmeyi düşünün. Daha fazla bilgi için bkz. tempdb'de ADR.
    • içinde ADR'nin tempdb etkinleştirilmesi veya devre dışı bırakılması için Veritabanı Altyapısı'nın yeniden başlatılması gerekir.

için geçerli boyut ve büyüme parametrelerini denetlemek için tempdbaşağıdaki sorguyu kullanın:

SELECT name AS file_name,
       type_desc AS file_type,
       size * 8.0 / 1024 AS size_mb,
       max_size * 8.0 / 1024 AS max_size_mb,
       CAST (IIF (max_size = 0, 0, 1) AS BIT) AS is_autogrowth_enabled,
       CASE WHEN growth = 0 THEN growth
            WHEN growth > 0 AND is_percent_growth = 0 THEN growth * 8.0 / 1024
            WHEN growth > 0 AND is_percent_growth = 1 THEN growth
       END AS growth_increment_value,
       CASE WHEN growth = 0 THEN 'Autogrowth is disabled.'
            WHEN growth > 0 AND is_percent_growth = 0 THEN 'Megabytes'
            WHEN growth > 0 AND is_percent_growth = 1 THEN 'Percent'
       END AS growth_increment_value_unit
FROM tempdb.sys.database_files;

tempdb Veritabanını hızlı bir G/Ç alt sistemine yerleştirin. Disk düzeyinde G/Ç performans sorunlarıyla karşılaşmadığınız sürece tek tek veri dosyalarının veya veri dosyası gruplarının tempdb farklı disklerde olması gerekmez.

Kullanıcı veritabanları ile tempdb arasında bir G/Ç çekişmesi varsa, tempdb dosyalarını, kullanıcı veritabanlarının kullandığı disklerden farklı olan diskler üzerine yerleştirin.

Note

Performansı artırmak için, veritabanı seçeneği olarak ayarlansa tempdbbile DELAYED_DURABILITY her zaman etkindirDISABLED. tempdb Başlangıçta yeniden oluşturulur, bir kurtarma işleminden geçilmez ve dayanıklılık garantisi sağlamaz.

SQL Server için tempdb geliştirmeleri

SQL Server 2025(17.x) ile kullanıma sunulmuştur

  • Tempdb alan kaynağı idaresi, bir uygulama veya kullanıcı iş yükü tarafından kullanılan toplam alan miktarı tempdb için bir sınır uygular. Bu, güvenilirliği artırır ve kaçak sorguların veya iş yüklerinin içinde tempdbbüyük miktarda alan kullanmasını engelleyerek kesintileri önler. Daha fazla bilgi için bkz . Tempdb alan kaynağı idaresi.
  • Hızlandırılmış veritabanı kurtarma , içinde, içindeki tempdbişlemler tempdbiçin anlık işlem geri alma ve agresif günlük kesilmesi sağlayarak desteklenir.

SQL Server 2022 (16.x) ile kullanıma sunulmuştur

SQL Server 2019(15.x) ile kullanıma sunulmuştur

  • Veritabanı Altyapısı, en yüksek disk aktarım hızına izin vermek için dosyaları açarken FILE_FLAG_WRITE_THROUGH seçeneğini kullanmaztempdb. tempdb Başlangıçta yeniden başlatıldığından, veri dayanıklılığı sağlamak için bu seçenek gerekli değildir. hakkında FILE_FLAG_WRITE_THROUGHdaha fazla bilgi için bkz . SQL Server'da veri güvenilirliğini genişleten günlük ve veri depolama algoritmaları.
  • Bellek için iyileştirilmiş TempDB meta verileri içindeki tempdbgeçici nesne meta veri çekişmelerini kaldırır.
  • Eşzamanlı Sayfa Boş Alanı (PFS) sayfa güncelleştirmeleri, tüm veritabanlarında sayfa mandal çekişmesini azaltır ve en yaygın olarak içinde tempdbgörülen bir sorundur. Bu geliştirme, PFS sayfa güncelleştirmelerinin eşzamanlılık yönetimini değiştirerek özel bir mandal yerine paylaşılan bir mandal altında güncelleştirilebilmelerini sağlar. Bu davranış, SQL Server 2019 (15.x) ile başlayan tüm veritabanlarında (tempdbdahil) varsayılan olarak açıktır. PFS sayfaları hakkında daha fazla bilgi için kapakların altında: GAM, SGAM ve PFS sayfaları makalesini okuyun.
  • Varsayılan olarak, Linux'ta SQL Server'ın yeni bir yüklemesi, mantıksal çekirdek sayısına (sekize kadar veri dosyasıyla) bağlı olarak birden çok tempdb veri dosyası oluşturur. Bu, yerinde ikincil veya ana sürüm yükseltmeleri için geçerli değildir. Her tempdb veri dosyası 8 MB'tır ve otomatik büyüme 64 MB olur. Bu davranış, Windows'ta varsayılan SQL Server yüklemesine benzer.

SQL Server 2017(14.x) ile kullanıma sunulmuştur

  • SQL Kurulumu deneyimi, ilk tempdb dosya ayırma yönergelerini geliştirir. SQL Kurulumu, ilk dosya boyutu 1 GB'tan büyük bir değere ayarlanırsa ve anlık dosya başlatma etkin değilse müşterileri uyarır ve örnek başlatma gecikmelerini önler.
  • sys.dm_tran_version_store_space_usage dinamik yönetim görünümü, veritabanı başına sürüm deposu kullanımını izler. Bu DMV, veritabanı başına sürüm deposu kullanım gereksinimine göre boyutlandırmayı proaktif olarak planlamak tempdb isteyen DMV'ler için kullanışlıdır.
  • Uyarlamalı birleşimler ve bellek verme geri bildirimi gibi akıllı sorgu işleme özellikleri, bir sorgunun ardışık yürütmelerinde bellek taşmalarını azaltarak kullanımı azaltırtempdb.

SQL Server 2016(13.x) ile kullanıma sunulmuştur

  • Geçici tablolar ve tablo değişkenleri önbelleğe alınır. Önbelleğe alma, geçici nesneleri bırakan ve oluşturan işlemlerin çok hızlı bir şekilde çalışmasını sağlar. Önbelleğe alma, sayfa ayırmayı ve meta veri çekişmesini de azaltır.
  • Kullanılan (güncelleştirme) mandal sayısını UP azaltmak için ayırma sayfası mandallama protokolü geliştirildi.
  • günlük dosyasında disk G/Ç bant genişliği tüketimini tempdb azaltmak için tempdb günlük ek yükü azaltılır.
  • SQL Kurulumu, yeni bir örnek yüklemesi sırasında birden çok tempdb veri dosyası ekler. ÖNERILERI gözden geçirin ve SQL Kurulumu'nun tempdb sayfasında öğesini yapılandırın veya komut satırı parametresini /SQLTEMPDBFILECOUNTkullanın. Varsayılan olarak, SQL Kurulumu mantıksal işlemci sayısı kadar veya sekiz (hangisi daha düşükse) kadar veri dosyası ekler tempdb .
  • Birden çok tempdb veri dosyası olduğunda, büyüme ayarlarına bağlı olarak tüm dosyalar aynı anda ve aynı miktarda otomatik olarak büyütür. izleme bayrağı 1117 artık gerekli değildir. Daha fazla bilgi için TEMPDB ve kullanıcı veritabanları için -T1117 ve -T1118 değişikliklerini okuyun.
  • Içindeki tempdb tüm ayırmalar tekdüzen kapsamlar kullanır. izleme işareti 1118 artık gerekli değildir. içindeki tempdb performans geliştirmeleri hakkında daha fazla bilgi için TEMPDB - Dosyalar ve İzleme bayrakları ve Güncelleştirmeler, Aman Tanrım! blog makalesine bakın.
  • AUTOGROW_ALL_FILES özelliği dosya grubu için PRIMARY her zaman açıktır.

Bellek için iyileştirilmiş TempDB meta verileri

Geçici nesne meta veri çekişmesi geçmişte birçok SQL Server iş yükü için ölçeklenebilirlik açısından bir performans sorunu olmuştur. Bu sorunu çözmek için SQL Server 2019 (15.x), bellek içi veritabanı özellik ailesinin parçası olan bellek içi TempDB meta verilerinin bir parçası olan bir özellik kullanıma sunulmuştur.

Bellek için iyileştirilmiş TempDB meta veri özelliğinin etkinleştirilmesi, daha önce içindeki tempdbgeçici nesne meta veri çekişmesiyle sınırlı olan iş yükleri için bu performans sorununu ortadan kaldırır. SQL Server 2019'dan (15.x) başlayarak, geçici nesne meta verilerini yönetmeye dahil olan sistem tabloları mandalsız, dayanıklı olmayan, bellek için iyileştirilmiş tablolara dönüşebilir.

Tip

Geçerli sınırlamalar nedeniyle, bellek için iyileştirilmiş TempDB meta verilerini yalnızca nesne meta veri çekişmesi oluştuğunda ve iş yüklerinizi önemli ölçüde etkilediğinde etkinleştirmenizi öneririz.

Geçici nesne meta veri çekişmesi oluşuyorsa aşağıdaki tanılama sorgusu bir veya daha fazla satır döndürür. Her satır bir sistem tablosunu temsil eder ve bu tanılama sorgusu yürütülürken söz konusu tabloya erişim için bağlanan oturum sayısını döndürür.

SELECT OBJECT_NAME(dpi.object_id, dpi.database_id) AS system_table_name,
       COUNT(DISTINCT (r.session_id)) AS session_count
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.fn_PageResCracker(r.page_resource) AS prc
CROSS APPLY sys.dm_db_page_info(prc.db_id, prc.file_id, prc.page_id, 'LIMITED') AS dpi
WHERE dpi.database_id = 2
      AND dpi.object_id IN (3, 9, 34, 40, 41, 54, 55, 60, 74, 75)
      AND UPPER(r.wait_type) LIKE N'PAGELATCH[_]%'
GROUP BY dpi.object_id, dpi.database_id;

Bellek için iyileştirilmiş TempDB meta veri özelliğinin nasıl ve ne zaman kullanılacağına genel bir bakış için bu yedi dakikalık videoyu izleyin:

Note

Şu anda Bellek için optimize edilmiş TempDB meta veri özelliği Azure SQL Veritabanı, Microsoft Fabric'teki SQL Veritabanı ve Azure SQL Yönetilen Örnek'te kullanılamaz.

Bellek için iyileştirilmiş TempDB meta verilerini yapılandırma ve kullanma

Aşağıdaki bölümler Bellek için iyileştirilmiş TempDB meta veri özelliğini etkinleştirme, yapılandırma, doğrulama ve devre dışı bırakma adımlarını içerir.

Enable

Bu özelliği etkinleştirmek için aşağıdaki betiği kullanın:

ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON;

Daha fazla bilgi için bkz. ALTER SERVER. Bu yapılandırma değişikliği, hizmetin yeniden başlatılmasını gerektirir.

Aşağıdaki T-SQL komutunu kullanarak bellek için iyileştirilmiş olup olmadığını tempdb doğrulayabilirsiniz:

SELECT SERVERPROPERTY('IsTempdbMetadataMemoryOptimized');

Döndürülen değer 1 ise ve özellik etkinleştirildikten sonra yeniden başlatma işlemi gerçekleştiyse özellik etkinleştirilir.

Bellek için iyileştirilmiş TempDB meta verilerini etkinleştirdikten sonra sunucu herhangi bir nedenle başlatılamazsa, başlangıç seçeneğini kullanarak Veritabanı Altyapısı örneğini -f başlatarak özelliği atlayabilirsiniz. Ardından özelliği devre dışı bırakabilir ve Veritabanı Altyapısı'nı -f normal modda yeniden başlatma seçeneğini kaldırabilirsiniz.

Bellek kullanımını sınırlamak için kaynak havuzuna bağlama

Sunucuyu olası yetersiz bellek koşullarından korumak için, Bellek için iyileştirilmiş TempDB meta verileri tarafından tüketilen belleği sınırlayan bir kaynak yöneticisi tempdb bağlamanızı öneririz. Aşağıdaki örnek betik bir kaynak havuzu oluşturur ve en fazla belleğini 20%olarak ayarlar, kaynak yöneticisini etkinleştirir ve kaynak havuzuna bağlanır tempdb .

Bu örnekte gösterim amacıyla bellek sınırı olarak 20% kullanılır. Ortamınızdaki en uygun değer iş yükünüz bağlı olarak daha büyük veya daha küçük olabilir ve iş yükü değişirse zaman içinde değişebilir.

CREATE RESOURCE POOL tempdb_resource_pool
WITH (MAX_MEMORY_PERCENT = 20);

ALTER RESOURCE GOVERNOR RECONFIGURE;

ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON
(RESOURCE_POOL = 'tempdb_resource_pool');

Bu değişiklik, Bellek için iyileştirilmiş TempDB meta verileri zaten etkinleştirilmiş olsa bile hizmetin yeniden başlatılmasını da gerektirir.

Kaynak havuzu bağlamasını doğrulama ve bellek kullanımını izleme

Bunun bir kaynak havuzuna bağlı olduğunu tempdb doğrulamak ve havuzun bellek kullanım istatistiklerini izlemek için aşağıdaki sorguyu kullanın:

; WITH resource_pool
AS (SELECT p.pool_id,
           p.name,
           p.max_memory_percent,
           dp.max_memory_kb,
           dp.target_memory_kb,
           dp.used_memory_kb,
           dp.out_of_memory_count
    FROM sys.resource_governor_resource_pools AS p
         INNER JOIN sys.dm_resource_governor_resource_pools AS dp
             ON p.pool_id = dp.pool_id)
SELECT SERVERPROPERTY('IsTempdbMetadataMemoryOptimized') AS is_tempdb_memory_optimized_metadata_enabled,
       rp.name AS resource_pool_name,
       rp.max_memory_percent,
       rp.max_memory_kb,
       rp.target_memory_kb,
       rp.used_memory_kb,
       rp.out_of_memory_count
FROM sys.databases AS d
     LEFT OUTER JOIN resource_pool AS rp
         ON d.resource_pool_id = rp.pool_id
WHERE d.name = 'tempdb';

Kaynak havuzu bağlamasını kaldırma

Bellek için iyileştirilmiş TempDB meta verilerini etkin tutarken kaynak havuzu bağlamasını kaldırmak için aşağıdaki komutu yürüterek hizmeti yeniden başlatın:

ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON;

Disable

Bellek için iyileştirilmiş TempDB meta verilerini devre dışı bırakmak için aşağıdaki komutu yürüterek hizmeti yeniden başlatın:

ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = OFF;

Bellek için iyileştirilmiş TempDB meta verilerinin sınırlamaları

  • Bellek için iyileştirilmiş TempDB meta veri özelliğinin etkinleştirilmesi veya devre dışı bırakılması için yeniden başlatma gerekir.

  • Bazı durumlarda, iş yükünüzde bellek yetersiz hatalara neden olan bellek katibi tarafından MEMORYCLERK_XTP yüksek bellek kullanımı gözlemleyebilirsiniz.

    Diğer tüm bellek katiplerine göre ve hedef sunucu belleğine göre katip tarafından MEMORYCLERK_XTP bellek kullanımını görmek için aşağıdaki sorguyu yürütür:

    SELECT SUM(IIF (type = 'MEMORYCLERK_XTP', pages_kb, NULL)) / 1024. AS memoryclerk_xtp_pages_mb,
           SUM(IIF (type <> 'MEMORYCLERK_XTP', pages_kb, NULL)) / 1024. AS other_pages_mb,
           SUM(committed_target_kb) / 1024. AS committed_target_memory_mb
    FROM sys.dm_os_memory_clerks
        CROSS JOIN sys.dm_os_sys_info;
    

    Bellek yüksekse MEMORYCLERK_XTP , sorunu aşağıdaki gibi azaltabilirsiniz:

    Daha fazla bilgi için bkz. Bellek yetersiz bellek hataları için bellek için iyileştirilmiş tempdb meta verileri (HkTempDB).

  • In-Memory OLTP kullandığınızda, tek bir işlemin birden fazla veritabanında bellek için iyileştirilmiş tablolara erişmesine izin verilmez. Bu nedenle, kullanıcı veritabanında bellek için iyileştirilmiş bir tablo içeren okuma veya yazma işlemleri aynı işlemdeki sistem görünümlerine de erişemez tempdb . Bu durum oluşursa 41317 hatası alırsınız:

    A user transaction that accesses memory optimized tables or natively compiled modules cannot access more than one user database or databases model and msdb, and it cannot write to master.
    

    Bu sınırlama, tek bir işlemin birden fazla veritabanında bellek için iyileştirilmiş tablolara erişmeye çalıştığı diğer senaryolar için de geçerlidir.

    Örneğin, bellek için iyileştirilmiş tablolar içeren bir kullanıcı veritabanında sys.stats katalog görünümünü sorgularsanız 41317 hatasını alabilirsiniz. Bunun nedeni, sorgunun kullanıcı veritabanında bellek için iyileştirilmiş bir tablodaki istatistik verilerine ve içindeki bellek için iyileştirilmiş meta verilere erişmeye çalışmasıdır tempdb.

    Bellek için iyileştirilmiş TempDB meta verileri etkinleştirildiğinde aşağıdaki örnek betik bu hatayı üretir:

    BEGIN TRAN;
    
    -- Create an In-memory OLTP transaction that accesses a system view in tempdb
    SELECT name
    FROM tempdb.sys.tables;
    
    -- An attempt to create an In-memory OLTP transaction in the user database fails
    INSERT INTO <user database>.<schema>.<memory-optimized table>
    VALUES (1);
    
    COMMIT TRAN;
    

    Note

    Bu sınırlama geçici tablolar için geçerli değildir. Aynı işlemde, kullanıcı veritabanında bellek için iyileştirilmiş bir tabloya erişen geçici bir tablo oluşturabilirsiniz.

  • Sistem kataloğu görünümlerine yönelik sorgular her zaman yalıtım düzeyini kullanır READ COMMITTED . Bellek için iyileştirilmiş TempDB meta verileri etkinleştirildiğinde, sistem kataloğu görünümlerinde tempdb yapılan sorgular yalıtım düzeyini kullanır SNAPSHOT . Her iki durumda da kilitleme ipuçları kabul edilmez.

  • Bellek için iyileştirilmiş TempDB meta verileri etkinleştirildiğinde columnstore dizinleri geçici tablolarda oluşturulamaz.

    • Sonuç olarak, bellek için iyileştirilmiş TempDB meta verileri etkinleştirildiğinde, sp_estimate_data_compression_savings sistem saklı yordamının COLUMNSTORE veya COLUMNSTORE_ARCHIVE veri sıkıştırma parametreleriyle kullanılması desteklenmez.

SQL Server'da tempdb için kapasite planlaması

için tempdb uygun boyutun belirlenmesi birçok faktöre bağlıdır. Bu faktörler, kullanılan iş yükünü ve Veritabanı Altyapısı özelliklerini içerir.

Tipik iş yükünüzü yeniden oluşturabileceğiniz bir test ortamında aşağıdaki görevleri gerçekleştirerek alan tüketimini analiz tempdb etmenizi öneririz:

  • Dosyalar için tempdb etkinleştirin. Tüm tempdb veri dosyalarının ilk boyutu ve otomatik büyütme yapılandırması aynı olmalıdır.
  • İş yükünü yeniden oluşturun ve alan kullanımını izleyin tempdb .
  • Düzenli dizin bakımı kullanıyorsanız, bakım işlerinizi yürütür ve alanı izler tempdb .
  • Toplam iş yükü kullanımınızı tahmin etmek için önceki adımlarda kullanılan maksimum alan değerlerini kullanın. Öngörülen eşzamanlı etkinlik için bu değeri ayarlayın ve boyutunu buna göre ayarlayın tempdb .

Tempdb kullanımını izleme

içinde tempdb disk alanının dolması önemli kesintilere ve uygulama kapalı kalma süresine neden olabilir. Dosyalarda kullanılan alanı izlemek için tempdb dinamik yönetim görünümünü kullanabilirsiniz.

Örneğin, aşağıdaki örnek betik şunları bulur:

  • içinde tempdb boş alan (büyüme için tempdb kullanılabilir olabilecek boş disk alanı dikkate alınmaz).
  • Geleneksel sürüm deposu tarafından kullanılan alan.
  • İç nesneler tarafından kullanılan alan.
  • Kullanıcı nesneleri tarafından kullanılan alan.
SELECT SUM(unallocated_extent_page_count) * 8.0 / 1024 AS tempdb_free_data_space_mb,
       SUM(version_store_reserved_page_count) * 8.0 / 1024 AS tempdb_version_store_space_mb,
       SUM(internal_object_reserved_page_count) * 8.0 / 1024 AS tempdb_internal_object_space_mb,
       SUM(user_object_reserved_page_count) * 8.0 / 1024 AS tempdb_user_object_space_mb
FROM tempdb.sys.dm_db_file_space_usage;

Oturum veya görev düzeyinde sayfa tempdb ayırma veya serbest bırakma etkinliğini izlemek için , sys.dm_db_session_space_usage ve dinamik yönetim görünümlerini sys.dm_db_task_space_usage kullanabilirsiniz. Bu görünümler, büyük miktarda alan kullanan sorguları, geçici tabloları veya tablo değişkenlerini belirlemenize tempdb yardımcı olabilir.

Örneğin, her oturumda çalışmakta olan tüm görevlerde iç nesneler tarafından ayrılan ve serbest bırakılan alanı almak tempdb için aşağıdaki örnek betiği kullanın:

SELECT session_id,
       SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count,
       SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count
FROM sys.dm_db_task_space_usage
GROUP BY session_id;

Hem çalışan hem de tamamlanan görevler için her oturum ve istek için iç ve kullanıcı nesneleri tarafından ayrılan ve şu anda kullanılan alanı bulmak tempdb için aşağıdaki örnek betiği kullanın:

; WITH tempdb_space_usage
AS (SELECT session_id,
           request_id,
           user_objects_alloc_page_count + internal_objects_alloc_page_count AS tempdb_allocations_page_count,
           user_objects_alloc_page_count + internal_objects_alloc_page_count - user_objects_dealloc_page_count - internal_objects_dealloc_page_count AS tempdb_current_page_count
    FROM sys.dm_db_task_space_usage
    UNION ALL
    SELECT session_id,
           NULL AS request_id,
           user_objects_alloc_page_count + internal_objects_alloc_page_count AS tempdb_allocations_page_count,
           user_objects_alloc_page_count + internal_objects_alloc_page_count - user_objects_dealloc_page_count - user_objects_deferred_dealloc_page_count - internal_objects_dealloc_page_count AS tempdb_current_page_count
    FROM sys.dm_db_session_space_usage)
SELECT session_id,
       COALESCE (request_id, 0) AS request_id,
       SUM(tempdb_allocations_page_count * 8) AS tempdb_allocations_kb,
       SUM(IIF (tempdb_current_page_count >= 0, tempdb_current_page_count, 0) * 8) AS tempdb_current_kb
FROM tempdb_space_usage
GROUP BY session_id, COALESCE (request_id, 0)
ORDER BY session_id, request_id;