加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 为什么SELECT查询会导致写入?

发布时间:2021-03-13 22:03:15 所属栏目:编程 来源:网络整理
导读:我留意到在运行SQL Server 2016 SP1 CU6的处事器上,偶然扩展变乱会话会表现导致写入的SELECT查询. 譬喻: 执行打算没有表现写入的明明缘故起因,譬喻也许溢出到TempDB的哈希表,假脱机或排序: 对MAX范例或自动统计信息更新的变量赋值也也许导致这种环境,但在这种情

我留意到在运行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);

请留意,日记条目表现三个嵌套事宜,但只表现两个提交记录.在出产中的相同环境下,这导致了一个可以说是错误的客户端库,该库行使不测启动写入事宜的隐式事宜,从而阻止事宜日记破除.编写库只是在运行更新,插入或删除语句后才发出提交,因此它从不发出提交呼吁并使写入事宜处于打开状态.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读