ในบางกรณี Query Store อาจทำให้การเขียนเกิดขึ้นเนื่องจากลักษณะพิเศษของข้อความสั่ง select และในเซสชันเดียวกัน
สามารถทำซ้ำได้ดังนี้:
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';
สร้างเซสชันเพิ่มเติมสำหรับการตรวจสอบ:
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);
ถัดไปเรียกใช้ต่อไปนี้:
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
ธุรกรรมโดยนัยอาจหรืออาจไม่จำเป็นในการทำซ้ำนี้
ตามค่าเริ่มต้นที่ด้านบนของงานรวบรวมสถิติของ Query Store ในชั่วโมงถัดไปจะเขียนข้อมูลออกมา สิ่งนี้ดูเหมือนจะ (บางครั้ง?) เกิดขึ้นเนื่องจากเป็นส่วนหนึ่งของแบบสอบถามผู้ใช้ครั้งแรกที่ดำเนินการในระหว่างชั่วโมง เซสชันเพิ่มเติมของกิจกรรมจะแสดงสิ่งที่คล้ายกับที่แสดงต่อไปนี้:
บันทึกธุรกรรมแสดงการเขียนที่เกิดขึ้น:
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];
ตรวจสอบหน้าเว็บที่มีแสดงให้เห็นว่าการเขียนเพื่อDBCC PAGE
sys.plan_persist_runtime_stats_interval
USE Foo;
DBCC TRACEON(3604);
DBCC PAGE(5,1,344,1); SELECT
OBJECT_NAME(229575856);
โปรดทราบว่ารายการบันทึกแสดงธุรกรรมที่ซ้อนกันสามรายการ แต่มีระเบียนการส่งมอบเพียงสองรายการ ในสถานการณ์ที่คล้ายกันในการผลิตสิ่งนี้นำไปสู่ไลบรารีไคลเอ็นต์ที่มีข้อผิดพลาดที่ใช้ธุรกรรมโดยนัยโดยไม่คาดคิดในการเริ่มต้นธุรกรรมการเขียนป้องกันการทำธุรกรรมบันทึกจากการล้าง ไลบรารีถูกเขียนเพื่อออกคำสั่ง commit หลังจากรันอัพเดต, แทรกหรือลบคำสั่งเท่านั้นดังนั้นจึงไม่เคยออกคำสั่ง commit และเปิดธุรกรรมการเขียนค้างไว้