Aracılığıyla paylaş


Bellek Optimizasyonu Yapılmış Tablolar için İstatistikler

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Sorgu iyileştiricisi, sorgu performansını geliştiren sorgu planları oluşturmak için sütunlar hakkındaki istatistikleri kullanır. İstatistikler veritabanındaki tablolardan toplanır ve veritabanı meta verilerinde depolanır.

İstatistikler otomatik olarak oluşturulur, ancak el ile de oluşturulabilir. Örneğin, dizin oluşturulduğunda istatistikler dizin anahtarı sütunları için otomatik olarak oluşturulur. İstatistik oluşturma hakkında daha fazla bilgi için bkz. İstatistikler.

Satırlar eklendikçe, güncelleştirildikçe ve silindikçe tablo verileri genellikle zaman içinde değişir. Bu, istatistiklerin düzenli aralıklarla güncelleştirilmiş olması gerektiği anlamına gelir. Varsayılan olarak, sorgu iyileştiricisi bunların güncel olmayabileceğini belirlediğinde tablolardaki istatistikler otomatik olarak güncelleştirilir.

Bellek için iyileştirilmiş tablolarla ilgili istatistikler için dikkat edilmesi gerekenler:

  • SQL Server 2016 ve Azure SQL Veritabanı'ndan başlayarak, veritabanı uyumluluk düzeyi en az 130 kullanılırken, bellek için optimize edilmiş tablolar için istatistiklerin otomatik güncellenmesi desteklenir. Bkz. ALTER DATABASE Uyumluluk Düzeyi (Transact-SQL). Bir veritabanında daha önce daha düşük bir uyumluluk düzeyi kullanılarak oluşturulmuş tablolar varsa, istatistiklerin otomatik olarak güncelleştirilebilmesi için istatistiklerin bir kez el ile güncelleştirilmiş olması gerekir.

  • Yerel olarak derlenmiş saklı yordamlar için, yordam derlendiğinde yordamdaki sorgular için yürütme planları en iyi duruma getirilir ve bu da oluşturma zamanında gerçekleşir. İstatistikler güncelleştirildiğinde otomatik olarak yeniden derlenmez. Bu nedenle, yordamlar oluşturulmadan önce tabloların temsili bir veri kümesi içermesi gerekir.

  • Yerel olarak derlenmiş saklı yordamlar sp_recompile (Transact-SQL) kullanılarak el ile yeniden derlenebilir ve veritabanı çevrimdışına alınıp yeniden çevrimiçi duruma getirildiğinde ya da bir veritabanı yük devretmesi veya sunucu yeniden başlatması olduğunda otomatik olarak yeniden derlenir.

Mevcut Tablolarda İstatistiklerin Otomatik Güncelleştirmesini Etkinleştirme

Uyumluluk düzeyi en az 130 olan bir veritabanında tablolar oluşturulduğunda, bu tablodaki tüm istatistikler için otomatik istatistik güncelleştirmesi etkinleştirilir ve başka bir eylem gerekmez.

Bir veritabanında SQL Server'ın önceki bir sürümünde veya 130'dan daha düşük bir uyumluluk düzeyi altında oluşturulmuş bellek için iyileştirilmiş tablolar varsa, ileriye doğru otomatik güncelleştirmeyi etkinleştirmek için istatistiklerin bir kez el ile güncelleştirilmiş olması gerekir.

Daha eski bir uyumluluk düzeyi altında oluşturulan bellek için iyileştirilmiş tablolara yönelik istatistiklerin otomatik olarak güncelleştirilebilmesini sağlamak için şu adımları izleyin:

  1. Veritabanı uyumluluk düzeyini güncelleştirin: ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130

  2. Bellek için iyileştirilmiş tabloların istatistiklerini el ile güncelleştirin. Aşağıda aynı işlemi gerçekleştiren örnek bir betik verilmiştir.

  3. Güncelleştirilmiş istatistiklerden yararlanmak için yerel olarak derlenmiş saklı yordamları el ile yeniden derleyin.

İstatistikler için tek seferlik betik: Daha düşük bir uyumluluk düzeyi altında oluşturulan bellek için iyileştirilmiş tablolar için, bellek için iyileştirilmiş tüm tabloların istatistiklerini güncelleştirmek için aşağıdaki Transact-SQL betiği bir kez çalıştırabilir ve sonradan istatistiklerin otomatik olarak güncelleştirilebilmesini sağlayabilirsiniz (veritabanı için AUTO_UPDATE_STATISTICS etkinleştirildiği varsayılarak):

-- Assuming AUTO_UPDATE_STATISTICS is already ON for your database:
-- ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS ON;

ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130;
GO
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT
      @sql += N'UPDATE STATISTICS '
         + quotename(schema_name(t.schema_id))
         + N'.'
         + quotename(t.name)
         + ';' + CHAR(13) + CHAR(10)
   FROM sys.tables AS t
   WHERE t.is_memory_optimized = 1 AND 
		t.object_id IN (SELECT object_id FROM sys.stats WHERE no_recompute=1)
;
EXECUTE sp_executesql @sql;
GO
-- Each row appended to @sql looks roughly like:
-- UPDATE STATISTICS [dbo].[MyMemoryOptimizedTable];

Otomatik güncelleştirmenin etkinleştirildiğini doğrulayın: Aşağıdaki betik, bellek için iyileştirilmiş tablolardaki istatistikler için otomatik güncelleştirmenin etkinleştirilip etkinleştirilmediğini doğrular. Önceki skripti çalıştırdıktan sonra, tüm istatistik nesneleri için sütunda 1auto-update enabled döndürülecektir.

SELECT 
	quotename(schema_name(o.schema_id)) + N'.' + quotename(o.name) AS [table],
	s.name AS [statistics object],
	1-s.no_recompute AS [auto-update enabled]
FROM sys.stats s JOIN sys.tables o ON s.object_id=o.object_id
WHERE o.is_memory_optimized=1

Tablo ve Yordam Dağıtma Yönergeleri

Sorgu planlarını oluştururken sorgu iyileştiricisinin güncel istatistiklere sahip olduğundan emin olmak için aşağıdaki dört adımı kullanarak bellek ile iyileştirilmiş tabloları ve bu tablolara erişen doğrudan derlenmiş saklı yordamları dağıtın.

  1. Veritabanının uyumluluk düzeyinin en az 130 olduğundan emin olun. Bkz. ALTER DATABASE Uyumluluk Düzeyi (Transact-SQL).

  2. Tablolar ve dizinler oluşturun. Dizinler CREATE TABLE deyimlerinde satır içinde belirtilmelidir.

  3. Tablolara veri yükleme.

  4. Tablolara erişen saklı yordamlar oluşturun.

Verileri yükledikten sonra doğal şekilde derlenmiş saklı yordamlar oluşturmak, optimizatörün bellek için optimize edilmiş tablolar için kullanılabilir istatistiklere sahip olmasını sağlar. Bu, prosedür derlendiğinde verimli sorgu planlarının sağlanmasını garanti eder.

Ayrıca Bkz.

tablolarıMemory-Optimized