Aracılığıyla paylaş


Sorgu Deposu'nu In-Memory OLTP ile kullanma

Şunlar için geçerlidir:SQL ServerAzure SQL Veritabanı

SQL Server Sorgu Deposu, bellek içi OLTP çalıştıran iş yükleri için yerel olarak derlenmiş kodun performansını izlemenizi sağlar.

Derleme ve çalışma zamanı istatistikleri, disk tabanlı iş yükleriyle aynı şekilde toplanır ve kullanıma sunulur. Bellek içi OLTP'ye geçiş yaptığınızda, SQL Server Management Studio'daki Sorgu Deposu görünümlerini ve geçiş öncesinde disk tabanlı iş yükleri için geliştirdiğiniz özel betikleri kullanmaya devam edebilirsiniz. Bu, Sorgu Deposu teknolojisini öğrenmeye yatırımınızı kaydeder ve tüm iş yüklerinde sorun gidermek için kullanılabilir hale getirir.
Sorgu Deposunu kullanma hakkında genel bilgi için bkz. Sorgu Deposunu Kullanarak Performansı İzleme.

Bellek içi OLTP ile Sorgu Deposu kullanmak için ek özellik yapılandırması gerekmez. Veritabanınızda etkinleştirdiğinizde, her tür iş yükü için çalışır.
Ancak, kullanıcıların bellek içi OLTP ile Sorgu Deposu kullanırken dikkat etmesi gereken bazı belirli yönler vardır:

  • Sorgu Deposu etkinleştirildiğinde sorgular, planlar ve derleme zamanı istatistikleri varsayılan olarak toplanır. Ancak, çalışma zamanı istatistikleri koleksiyonu yalnızca sys.sp_xtp_control_query_exec_stats (Transact-SQL) ile açıkça etkinleştirdiğinizde etkinleştirilir.

  • @new_collection_value 0 olarak ayarladığınızda, Sorgu Deposu etkilenen yordam veya SQL Server örneğinin tamamı için çalışma zamanı istatistikleri toplamayı durdurur.

  • sys.sp_xtp_control_query_exec_stats (Transact-SQL) ile yapılandırılan değer kalıcı değildir. SQL Server'ı yeniden başlattıktan sonra istatistik koleksiyonunu denetlediğinizden ve yapılandırdığınızdan emin olun.

  • Normal sorgu istatistikleri koleksiyonunda olduğu gibi, iş yükü yürütmeyi izlemek için Sorgu Deposu'nu kullandığınızda performans düşebilir. İstatistik koleksiyonunu yalnızca yerel olarak derlenmiş saklı yordamların önemli bir alt kümesi için etkinleştirmeyi göz önünde bulundurun.

  • Sorgular ve planlar yakalanır ve ilk yerel derlemede depolanır ve her yeniden derlemede güncelleştirilir.

  • Sorgu Deposunu etkinleştirdiyseniz veya tüm yerel saklı yordamlar derlendikten sonra içeriğini temizlediyseniz, Sorgu Deposu tarafından kaydedilmelerini sağlamak için bunları manuel olarak yeniden derlemeniz gerekir. Aynı durum, sp_query_store_remove_query (Transact-SQL) veya sp_query_store_remove_plan (Transact-SQL) kullanarak sorguları el ile kaldırdığınızda da geçerlidir. Prosedür yeniden derlemeyi zorlamak için sp_recompile (Transact-SQL) kullanın.

  • Sorgu Deposu, derleme sırasında sorgu yürütme planını yakalamak için bellek içi OLTP'den plan oluşturma mekanizmalarından yararlanıyor. Depolanan plan, SET SHOWPLAN_XML ON kullanılarak elde edilen planla semantik olarak eşdeğerdir, ancak bir farkla; Sorgu Deposu'ndaki planlar, her bir ifade için ayrı ayrı bölünür ve depolanır.

  • Karma iş yüküne sahip bir veritabanında Sorgu Deposu'nu çalıştırdığınızda, yerel kod derlemesi tarafından oluşturulan sorgu planlarını hızla bulmak için sys.query_store_plan (Transact-SQL)is_natively_compiled alanını kullanabilirsiniz.

  • Sorgu Deposu yakalama modu (ALTER TABLE deyimindeki QUERY_CAPTURE_MODE parametresi), yapılandırılmış değerden bağımsız olarak her zaman yakalandıkları için yerel olarak derlenmiş modüllerdeki sorguları etkilemez. Bu, QUERY_CAPTURE_MODE = NONE ayarını içerir.

  • Sorgu Deposu tarafından yakalanan sorgu derleme süresi, yerel kod oluşturulmadan önce yalnızca sorgu iyileştirme için harcanan zamanı içerir. Daha kesin olarak, C kodu derlemesi için zaman ve C kodu oluşturma için gerekli iç yapıların oluşturulmasını içermez.

  • sys.query_store_runtime_stats (Transact-SQL) içindeki bellek verme ölçümleri yerel olarak derlenmiş sorgular için doldurulamaz; değerleri her zaman 0'dır. Bellek verme sütunları şunlardır: avg_query_max_used_memory, last_query_max_used_memory, min_query_max_used_memory, max_query_max_used_memory ve stdev_query_max_used_memory.

In-Memory OLTP ile Sorgu Deposu'yu etkinleştirme ve kullanma

Aşağıdaki basit örnek, uçtan uca bir kullanıcı senaryosunda bellek içi OLTP ile Sorgu Deposu kullanmayı gösterir. Bu örnekte, bellek içi OLTP için bir veritabanının (MemoryOLTP) etkinleştirildiğini varsayıyoruz.
Bellek ile optimize edilmiş tabloların gereksinimleri hakkında daha fazla bilgi için bkz. Memory-Optimized Tablosu ve Yerel Olarak Derlenmiş Saklı Yordam Oluşturma.

USE MemoryOLTP;
GO

-- Create a simple memory-optimized table
CREATE TABLE dbo.Ord
   (OrdNo INTEGER not null PRIMARY KEY NONCLUSTERED,
    OrdDate DATETIME not null,
    CustCode NVARCHAR(5) not null)
WITH (MEMORY_OPTIMIZED=ON);
GO

-- Enable Query Store before native module compilation
ALTER DATABASE MemoryOLTP SET QUERY_STORE = ON;
GO

-- Create natively compiled stored procedure
CREATE PROCEDURE dbo.OrderInsert(@OrdNo integer, @CustCode nvarchar(5))
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
    BEGIN ATOMIC WITH
    (TRANSACTION ISOLATION LEVEL = SNAPSHOT,
    LANGUAGE = N'English')

    DECLARE @OrdDate DATETIME = GETDATE();
    INSERT INTO dbo.Ord (OrdNo, CustCode, OrdDate)
        VALUES (@OrdNo, @CustCode, @OrdDate);
END;
GO

-- Enable runtime stats collection for queries from dbo.OrderInsert stored procedure
DECLARE @db_id INT = DB_ID()
DECLARE @proc_id INT = OBJECT_ID('dbo.OrderInsert');
DECLARE @collection_enabled BIT;

EXEC [sys].[sp_xtp_control_query_exec_stats] @new_collection_value = 1,
    @database_id = @db_id, @xtp_object_id = @proc_id;

-- Check the state of the collection flag
EXEC sp_xtp_control_query_exec_stats @database_id = @db_id,
    @xtp_object_id = @proc_id,
    @old_collection_value= @collection_enabled output;
SELECT @collection_enabled AS 'collection status';

-- Execute natively compiled workload
EXEC dbo.OrderInsert 1, 'A';
EXEC dbo.OrderInsert 2, 'B';
EXEC dbo.OrderInsert 3, 'C';
EXEC dbo.OrderInsert 4, 'D';
EXEC dbo.OrderInsert 5, 'E';

-- Check Query Store Data
-- Compile time data
SELECT q.query_id, plan_id, object_id, query_hash, p.query_plan,
    p.initial_compile_start_time, p.last_compile_start_time,
    p.last_execution_time, p.avg_compile_duration,
    p.last_force_failure_reason, p.force_failure_count
FROM sys.query_store_query AS q
JOIN sys.query_store_plan AS p
    ON q.query_id = p.plan_id
WHERE q.object_id = OBJECT_ID('dbo.OrderInsert');

-- Get runtime stats
-- Check count_executions field to verify that runtime statistics
-- have been collected by the Query Store
SELECT q.query_id, p.plan_id, object_id, rsi.start_time, rsi.end_time,
    p.last_force_failure_reason, p.force_failure_count, rs.*
FROM sys.query_store_query AS q
JOIN sys.query_store_plan AS p
    ON q.query_id = p.plan_id
JOIN sys.query_store_runtime_stats AS rs
    ON rs.plan_id = p.plan_id
JOIN sys.query_store_runtime_stats_interval AS rsi
    ON rs.runtime_stats_interval_id = rsi.runtime_stats_interval_id
WHERE q.object_id = OBJECT_ID('dbo.OrderInsert');

Ayrıca bakınız