我每 5 分钟从 sys.dm_io_virtual_file_stats 收集 IO_STALLS,然后进行增量以查看哪些文件受 IO 影响最大。
在一个 5 分钟的时间内,我得到了 5826331 毫秒的增量,即 97 分钟。
我对此有点困惑,这是说 97 分钟前开始的操作仅在那时完成并因此记录了等待时间?
谢谢
根据要求添加代码:
/*
USE [SysDBA]
GO
*/
/****** Object: Table [dbo].[DISKIOPS] Script Date: 04/07/2013 11:40:15 ******/
/*
DROP TABLE [dbo].[DISKIOPS]
GO
*/
--Create the table
/****** Object: Table [dbo].[DISKIOPS] Script Date: 04/07/2013 11:40:15 ******/
/*
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DISKIOPS](
[IO_STALL] [bigint] NULL,
[IO_STALL_READ_MS] [bigint] NULL,
[IO_STALL_WRITE_MS] [bigint] NULL,
[NUM_OF_READS] [bigint] NULL, …
Run Code Online (Sandbox Code Playgroud) 我们的监控解决方案 (SCOM) 当前标记 tempdb 日志空间不足。但是,我们将日志的自动增长设置为 1GB 块,并且驱动器上还有 25GB 的空间。
我看了看那是什么log_reuse_wait_desc
,发现它是ACTIVE_TRANSACTION
我开始怀疑是否出于某种原因日志文件被填满并且自动增长没有启动,经过一些研究我发现即使在ACTIVE_TRANSACTION
.
我找到了一篇关于 tempdb 日志空间不足的类似问题的文章:
他们在这里发布了一个CHECKPOINT
解决问题的关于tempdb
. 我知道CHECKPOINT
将脏页刷新到磁盘,但是我不明白这将如何解决ACTIVE_TRANSACTION
问题?
此外,我也不知道为什么在有足够空间时我们会收到此警报。是否存在tempdb
罐头填充和自动增长由于某种原因不起作用的情况?
我们有一台新服务器,我们也在迁移它,并希望看到硬件的潜在优势。所以我们的想法是我们捕获工作负载并在我们的新盒子上重放它。
然而,我的问题是关于看到性能优势。我将运行一些性能计数器,但理想情况下,我们希望查看单个查询的速度有多快。
我将在初始工作负载捕获中获取此信息,但是当我在新服务器上重放此信息时,我是否同时需要运行跟踪以捕获新的工作负载信息。实际上同时运行 SQL 探查器两次以进行重放和捕获?
最近,我们的一台服务器出现了 CPU 问题,在调查此问题的同时,我们也注意到查询运行缓慢,等待PAGEIOLATCH_XX
. 特别是,重新索引作业似乎总是具有这种等待类型。
作为回应,我运行了一个收集sys.dm_io_virtual_file_stats
,然后将其分解为时间块并计算出每个操作的平均停顿。虽然主要是尖峰,但磁盘似乎有规律地低于 20 毫秒的值。据我所知,20 毫秒是推荐值(?)。
除此之外,我还运行了 Glenn Barry 的脚本:
select db_name(database_id) as DatabaseName, file_id
,io_stall_read_ms
,num_of_reads
,cast(io_stall_read_ms/(1.0+num_of_reads) as numeric(10,1)) as 'avg_read_stall_ms'
,io_stall_write_ms
,num_of_writes
,cast(io_stall_write_ms/(1.0+num_of_writes) as numeric(10,1)) as 'avg_write_stall_ms'
,io_stall_read_ms + io_stall_write_ms as io_stalls
,num_of_reads + num_of_writes as total_io
,cast((io_stall_read_ms+io_stall_write_ms)/(1.0+num_of_reads +
num_of_writes) as numeric(10,1)) as 'avg_io_stall_ms'
from sys.dm_io_virtual_file_stats(null,null) --where db_name(database_id) = 'tempdb'
order by [DatabaseName] desc'
Run Code Online (Sandbox Code Playgroud)
它还计算平均 I/O 停顿,这也确认停顿时间小于 20 毫秒。
我还查看了以下内容,看看是否有任何挂起的任务花费的时间比建议的要长,但这并没有抛出任何挂起的 I/O 操作的时间通常超过 20 毫秒。
SELECT db_name(database_id) as 'Database',
file_name(file_id) as 'File',
io_stall, …
Run Code Online (Sandbox Code Playgroud) performance sql-server-2008-r2 wait-types performance-tuning
我们有这样一种情况,即我们在使用可用性组的环境中使用复制数据库。由于我们希望在故障转移时不需要人工干预,因此我们决定设置订阅以将复制的数据写入我们的两个副本服务器。由于这些数据库只能被读取,所以这种架构应该没问题。
为了进一步配置,并在阅读Brent Ozar 的这篇文章后,我们在使用所述数据库的应用程序中设置了连接字符串,并具有故障转移合作伙伴,这样如果我们丢失了主要副本,那么我们的应用程序仍然可以工作。
在最近的测试、故障转移和故障恢复之后,我们现在开始从客户那里收到一些间歇性错误:
System.InvalidOperationException:
Server xxx, database xxx is not configured for database mirroring.
Run Code Online (Sandbox Code Playgroud)
目前我很困惑为什么会出现这个错误。有一些建议将连接超时添加到连接字符串,但这对我来说没有意义,好像主要超时然后从辅助读取应该工作,并且在我们的例子中是有效的,因为它是一个精确的副本。
如果有人有任何想法,我将不胜感激。
编辑:除此之外,我现在从连接字符串中删除了故障转移伙伴,并将其指向副本上的数据库,但是我们收到以下错误:
System.Data.SqlClient.SqlException:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:TCP 提供者,错误:0 - 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。)
它就像客户端在某处缓存了辅助服务器?
编辑:回应布伦特的回答
嗨,布伦特,谢谢你,但是我在最初的描述中不清楚。复制的数据库不是可用性组的一部分,而是我在每个节点上都有一个订阅,因为据我所知,AG 中并没有很好地支持复制的 DB。
因此,我试图想出一种方法,如果副本发生故障以及属于 AG 故障转移一部分的其他数据库,则可以避免对这些数据库进行手动干预。
我在想,当节点 A 启动时,所有连接都会转到该服务器,但是如果节点 A 失败,那么在使用故障转移伙伴时连接会转到节点 B。然而,事实似乎并非如此,实际上根据这篇文章:
http://msdn.microsoft.com/en-gb/library/system.data.sqlclient.sqlconnection.connectionstring.aspx
如果您指定了故障转移伙伴,但故障转移伙伴服务器没有配置为数据库镜像并且主服务器(用 Server 关键字指定)不可用,则连接将失败。
我尝试使用它的方式似乎不支持此故障转移伙伴配置,但让我遇到任何故障转移都需要手动干预的情况:( 除非我遗漏了什么?
我知道 Microsoft 提供的代码用于在 SQL 服务器之间传输登录名,但是这只适用于帐户和密码。
如果该特定帐户在服务器级别为其分配了各种角色和权限,那么是否也有等效的代码段来编写这些权限的脚本?
谢谢
将数据库更改为部分包含时,出现以下错误:
无法解决 EXCEPT 操作中“Latin1_General_CI_AS”和“Latin1_General_100_CI_AS_KS_WS_SC”之间的排序规则冲突。
在编译 > 对象期间,过程“RSExecRole.DeleteExtensionModuleDDL”中遇到错误。数据库“VeeamOne”的包含选项已更改,或者该对象存在于模型 db 中并且用户尝试创建新的包含数据库。ALTER DATABASE 语句失败。无法更改数据库“VeeamOne”的包含选项,因为在验证 SQL 模块期间遇到编译错误。请参阅以前的错误。ALTER DATABASE 语句失败。(.Net SqlClient 数据提供程序)
我认为这是报告的对象来自 SSRS。但是,我正在更改排序规则的 DB 是一个完全独立的应用程序。
有没有人对如何解决这个问题有任何建议?
================================================== ====================== 好的,这是 proc 的代码,但不确定它是什么导致它无法被包含
USE [VeeamOne]
GO
/****** Object: StoredProcedure [reporter].[DeleteExtensionModuleDDL] Script Date: 02/12/2015 12:06:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [reporter].[DeleteExtensionModuleDDL]
@EMID int
AS
BEGIN
SET NOCOUNT ON;
declare @Debug bit;
set @Debug = 0;
declare @Emulate bit;
set @Emulate = 0;
declare @reportPackDestructorFunctionName nvarchar(max)
exec @reportPackDestructorFunctionName = [reporter].GenerateExtensionModuleDestructorName @EMID
if …
Run Code Online (Sandbox Code Playgroud) sql-server collation sql-server-2012 contained-database except
我有一个在 VM 上运行的数据库,该数据库在大负载期间受到重创,特别是我可以看到 WRITELOG 正在等待。我最初的想法是将文件拆分到它们自己的驱动器上,但后端存储与其他数据库文件所在的位置相同。
基本上,它是作为集群共享卷呈现给整个虚拟机主机的 SAN。
这样做会有性能优势吗?我大脑深处的一些记忆告诉我一些关于 IO 流数量可能会更好的信息?
为了更新这个,我现在已经分离出文件并正确调整事务日志的大小。我一直在收集信息,sys.dm_io_virtual_file_stats
并且可以看到我现在拥有极高的 readIOstalls,但具有 13ms 的低延迟。我还收集了一些内存信息,PLE 平均数以千计,这是一个 32GB 的系统,我预计除了在 30 分钟内它下降到 30 之后再次急剧上升之外,此时懒惰写入/秒增加在减少到 0 之前也到 50。这段时间可能是我看到的大量读取停顿的原因吗?我会期望看到如此高的读取停顿和高延迟吗?
我有以下查询
Select Pt.PRODID, PT.INVENTREFID, Inv.ItemName, PT.ItemID, Configid, Pt.QTYSCHED,
PT.DLVDATE, Pt.CREATEDDATETIME, pt.SCHEDEND,
CASE Left(PT.INVENTREFID, 3)
WHEN 'SJB' THEN ST.SALESNAME
WHEN 'WJB' THEN 'Sub - Assembly'
ELSE 'Stock'
END as CustomerName
from Dynamicsv5Realtime.dbo.PRODTABLE PT
Join Dynamicsv5Realtime.dbo.Inventdim ID
On PT.InventdimId = ID.InventdimID
and PT.Dataareaid = ID.dataareaid
Join Dynamicsv5Realtime.dbo.INVENTTABLE Inv
On Inv.itemid = PT.ItemId
Left Join Dynamicsv5Realtime.dbo.SALESTABLE ST
ON ST.SalesId = PT.INVENTREFID
and ST.Dataareaid = PT.dataareaid
where pt.PRODSTATUS in(2,3,4)
and PT.DATAAREAID = 'AJB'
Order by 7
Run Code Online (Sandbox Code Playgroud)
当我想改进它时,我想出了以下索引
CREATE NONCLUSTERED INDEX [INDEX_2]
ON [dbo].[PRODTABLE] ([INVENTREFID],[DATAAREAID],[INVENTDIMID],[PRODSTATUS]) …
Run Code Online (Sandbox Code Playgroud) performance index sql-server t-sql index-tuning query-performance
我们目前使用一个监控工具,它通过等待任务的数量或总等待时间向我们显示我们的最高等待统计数据。以下是按等待任务数量以及每个任务的等待时间的等待统计数据。
我们有用户抱怨系统速度变慢,但服务器的指标在磁盘 IO、内存和 CPU 方面似乎很好。有谁知道 PREEMPTIVE 等待是否有问题?
Number of waiting tasks
SOS_SCHEDULER_YIELD
PAGELATCH_EX
PAGELATCH_SH
PREEMPTIVE_XE_CALLBACKEXECUTE
PREEMPTIVE_XE_GETTARGETSTATE
PREEMPTIVE_XE_SESSIONCOMMIT
Average wait per task
PAGEIOLATCH_SH
PREEMPTIVE_XE_GETTARGETSTATE
Run Code Online (Sandbox Code Playgroud)
更新:
我从 Paul Randal 运行了一个类似于您发布的查询并得到以下信息:
WaitType Wait_S Resource_S Signal_S WaitCount Percentage AvgWait_S AvgRes_S AvgSig_S
PREEMPTIVE_XE_GETTARGETSTATE 9704.81 9704.81 0.00 604647 44.60 0.0161 0.0161 0.0000
Run Code Online (Sandbox Code Playgroud)
我知道这不是很好,但基本上这种等待类型占所有等待类型的 %44.60。此外,由于这种类型没有信号等待,因此这表明没有 CPU 压力,而是在等待其他资源。不知道我是如何推断出该资源是什么的。
这也是 SQL 2012 SP1
更新2 此处请求的 AS 是您查询的结果。关于扩展事件,唯一运行的会话是我刚刚注意到的默认 system_health 1 和 2 SharePoint 会话,它们必须默认放置在那里。我可能会关闭这些,我想知道这些是否会导致问题。
有趣的是,我的 PREEMPTIVE_XE_GETTARGETSTATE 似乎不在此列表中。
wait_type wait_time_ms signal_wait_time_ms resource_wait_time_ms percent_total_waits percent_total_signal_waits percent_total_resource_waits
SP_SERVER_DIAGNOSTICS_SLEEP 300014 355508314 0 24.621089361251698 99.883069863550302 …
Run Code Online (Sandbox Code Playgroud) performance sql-server sql-server-2012 wait-types performance-tuning
我正在运行这篇文章中的查询:
http://sqlity.net/en/708/why-cxpacket-waits-are-not-your-performance-problem/
查看我的线程在等待类型为 CXPACKET 的挂起查询方面正在等待什么。
但是,对于有问题的 SPID,正在运行的线程显示 NULL 的等待类型,而每个其他线程都处于 SUSPENDED 状态,等待类型为 CXPACKET。
我期待其中一个线程具有除 CXPACKET 之外的某种等待类型,谁能向我解释在这种情况下发生了什么?
谢谢
谁能向我解释为什么这个查询返回 0.000?
SELECT CAST(20/1024 AS NUMERIC(10,3))
Run Code Online (Sandbox Code Playgroud)
我只是想简单地将 MB 转换为 GB
谢谢
我从计划缓存中提取了一个执行计划,并从 XML 中提取了编译值。然后我使用编译后的值在 SSMS 中运行查询,即使查询计划针对同一个数据库运行,查询计划也不同。
任何人都可以解释为什么会发生这种情况吗?
sql-server ×12
performance ×5
wait-types ×4
t-sql ×2
collation ×1
except ×1
index ×1
index-tuning ×1
permissions ×1
profiler ×1
security ×1
storage ×1
tempdb ×1
vmware ×1