sql-server – 为什么SELECT查询会导致写入?
我留意到在运行SQL Server 2016 SP1 CU6的处事器上,偶然扩展变乱会话会表现导致写入的SELECT查询.
执行打算没有表现写入的明明缘故起因,譬喻也许溢出到TempDB的哈希表,假脱机或排序: 对MAX范例或自动统计信息更新的变量赋值也也许导致这种环境,但在这种环境下写入的缘故起因都不是. 写作还能从中获得什么? 办理要领在某些环境下,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.sql_text) WHERE ([writes]>(0))) ADD TARGET package0.event_file(SET filename=N'C:tempFooActivity2016.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: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); 请留意,日记条目表现三个嵌套事宜,但只表现两个提交记录.在出产中的相同环境下,这导致了一个可以说是错误的客户端库,该库行使不测启动写入事宜的隐式事宜,从而阻止事宜日记破除.编写库只是在运行更新,插入或删除语句后才发出提交,因此它从不发出提交呼吁并使写入事宜处于打开状态. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |