Dalam beberapa kasus, Query Store dapat menyebabkan penulisan terjadi sebagai efek dari pernyataan pilih, dan dalam sesi yang sama.
Ini dapat direproduksi sebagai berikut:
USE master;
GO
CREATE DATABASE [Foo];
ALTER DATABASE [Foo] SET QUERY_STORE (OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),
DATA_FLUSH_INTERVAL_SECONDS = 900,
INTERVAL_LENGTH_MINUTES = 60,
MAX_STORAGE_SIZE_MB = 100,
QUERY_CAPTURE_MODE = ALL,
SIZE_BASED_CLEANUP_MODE = AUTO);
USE Foo;
CREATE TABLE Test (a int, b nvarchar(max));
INSERT INTO Test SELECT 1, 'string';
Buat sesi Acara yang Diperpanjang untuk pemantauan:
CREATE EVENT SESSION [Foo] ON SERVER
ADD EVENT sqlserver.rpc_completed(SET collect_data_stream=(1)
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_name,sqlserver.is_system,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.session_server_principal_name,sqlserver.sql_text)
WHERE ([writes]>(0))),
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_name,sqlserver.is_system,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.session_server_principal_name,sqlserver.sql_text)
WHERE ([writes]>(0)))
ADD TARGET package0.event_file(SET filename=N'C:\temp\FooActivity2016.xel',max_file_size=(11),max_rollover_files=(999999))
WITH (MAX_MEMORY=32768 KB,EVENT_RETENTION_MODE=ALLOW_MULTIPLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF);
Selanjutnya jalankan yang berikut:
WHILE @@TRANCOUNT > 0 COMMIT
SET IMPLICIT_TRANSACTIONS ON;
SET NOCOUNT ON;
GO
DECLARE @b nvarchar(max);
SELECT @b = b FROM dbo.Test WHERE a = 1;
WAITFOR DELAY '00:00:01.000';
GO 86400
Transaksi implisit mungkin atau mungkin tidak perlu untuk mereproduksi ini.
Secara default, di bagian atas jam berikutnya pekerjaan pengumpulan statistik Query Store akan menulis data. Ini tampaknya (kadang-kadang?) Terjadi sebagai bagian dari kueri pengguna pertama yang dieksekusi selama satu jam. Sesi Acara Diperpanjang akan menampilkan sesuatu yang mirip dengan yang berikut:
Log transaksi menunjukkan penulisan yang telah terjadi:
USE Foo;
SELECT [Transaction ID], [Begin Time], SPID, Operation,
[Description], [Page ID], [Slot ID], [Parent Transaction ID]
FROM sys.fn_dblog(null,null)
/* Adjust based on contents of your transaction log */
WHERE [Transaction ID] IN ('0000:0000042c', '0000:0000042d', '0000:0000042e')
OR [Parent Transaction ID] IN ('0000:0000042c', '0000:0000042d', '0000:0000042e')
ORDER BY [Current LSN];
Memeriksa halaman dengan DBCC PAGE
menunjukkan bahwa menulis adalah untuk sys.plan_persist_runtime_stats_interval
.
USE Foo;
DBCC TRACEON(3604);
DBCC PAGE(5,1,344,1); SELECT
OBJECT_NAME(229575856);
Perhatikan bahwa entri log menunjukkan tiga transaksi bersarang tetapi hanya dua catatan komit. Dalam situasi yang sama dalam produksi, ini menyebabkan perpustakaan klien yang bisa dibilang salah yang menggunakan transaksi implisit secara tak terduga memulai transaksi tulis, mencegah log transaksi dari kliring. Perpustakaan ditulis untuk hanya mengeluarkan komit setelah menjalankan pembaruan, menyisipkan, atau menghapus pernyataan, sehingga tidak pernah mengeluarkan perintah komit dan membiarkan transaksi tulis terbuka.