我的 SQL Server 数据库的性能有问题。我找到了这个工具sp_BlitzCache。命令执行后,我得到了这个语句:
您在过去 24 小时内创建了 92.00% 的计划,在过去 4 小时内创建了 92.00%。
虽然我发现了问题(使用 SQL Server Profiler,我检查了 StmtRecompile 事件发生),但我只能找到几个经常重建的全文搜索查询。但是,全文搜索查询仅占所有查询的 5% 左右。
您有什么建议可能会导致其余 87% 的计划重新创建?
我有 SQL Server 2012(版本 11.0.6567.0)。
编辑:我添加了我的性能计数器
+---------------------------+--------------------------------+--------------+
| object_name | counter_name | cntr_value |
+---------------------------+--------------------------------+--------------+
| SQLServer:Buffer Manager | Background writer pages/sec | 0 |
| SQLServer:Buffer Manager | Buffer cache hit ratio | 28436 |
| SQLServer:Buffer Manager | Buffer cache hit ratio base | 28436 |
| SQLServer:Buffer Manager | Checkpoint pages/sec | …
Run Code Online (Sandbox Code Playgroud) performance sql-server sql-server-2012 sp-blitzcache query-performance
我正在使用 Brent Ozar 的 sp_BlitzCache 存储过程,并试图确定它报告的原因:
“您计划中的某些内容正在强制进行串行查询。如果这不是故意的,则需要进一步调查。”
经过调查,我发现服务器配置已设置:
'Max Degree of Parallelism = 1'
Run Code Online (Sandbox Code Playgroud)
(这是我要正确配置的清单。这是无知的日子。)
这是否是 Brent 报告强制序列化的原因?
sql-server parallelism sql-server-2016 sp-blitz sp-blitzcache
sp_BlitzCache
几天来,我一直在使用我的数据库来调查一些问题。这是一个巨大的帮助,但就在今天,它开始表现得有点奇怪,我很好奇是否有人知道发生了什么。
昨天我用@SortOrder
“读取”或“CPU”运行了许多检查,它运行良好,并且总是在大约相同的时间内返回结果。
今天,'reads' 返回的时间与昨天大致相同,但 'cpu' 需要 10 倍或更多的时间。它进入“检查功能”,然后在那里坐了很长时间。'xpm' 也和往常一样快。
我正在使用 v5.7(20170901)
我意识到我的 SQL 会话已经打开了 +24 小时,并认为##temp
文件可能变得太大了。但是在我重新启动会话并且那些表消失后,cpu 排序顺序仍然很慢。所以不是这样。
关于什么会导致这种情况的任何想法?
我正在运行 SQL Server 2012 并使用 2019 年 3 月发布的 sp_blitzCache 来分析系统上一些运行缓慢的查询。
我已经使用参数 @SortOrder = 'Reads' 执行了存储过程,并发现一些查询需要减少读取大量页面(以百万计)。
奇怪的是,这些查询都没有返回内存授予列的任何信息,它们都是空的。
为什么我们可以让 sp_BlitzCache 返回的查询执行多次读取和写入,但所有内存授予列都包含空值?
谢谢,凯文
我们有一个多租户数据库。FirmID 是分区键,我们有很多不同的公司。
我遇到了一个参数嗅探问题,我很忙。
我宁愿不在查询中使用任何 [Options]。
我最近的想法是更改我为公司使用的参数的名称。在下面的代码段中,您将看到我将其命名为 @Firm611 而不是使用 @FirmID,其中 611 是 ID 的实际公司。这将为我提供每个公司的唯一查询。
select
c.ID [_cid],
c.Name [Name]
from vwClaims c with(nolock)
where c.FirmID=@Firm611
and (c.Name is not null and c.Name!='')
select
c.ID [_cid],
c.Name [Name]
from vwClaims c with(nolock)
where c.FirmID=@Firm625
and (c.Name is not null and c.Name!='')
Run Code Online (Sandbox Code Playgroud)
运行 Brent Ozar 的 sp_BlitzCache 后,我发现它只是编译为相同的查询并导致重复的缓存条目:
我的问题是我读的结果对吗?即使我更改了参数名称,它真的还在使用相同的计划和参数嗅探吗?
我sp_BlitzCache
version 4.1 (20161210)
在一个2008R2 instance (10.5.4042)
.
如果我在没有 的情况下执行 sp @OutputDatabaseName, @OutputSchemaName, and @OutputTableName
,它工作正常。但是,当我设置这些值时,它会在整个过程中运行到最后,并出现错误:
“INSERT 语句的选择列表包含比插入列表更多的项目。SELECT 值的数量必须与 INSERT 列的数量相匹配。”
我正在运行的具体语句是:
EXEC [dbo].[sp_BlitzCache] @OutputDatabaseName = 'Maintenance_Stats'
,@OutputSchemaName = 'dbo'
,@OutputTableName = 'BlitzCacheResults'
Run Code Online (Sandbox Code Playgroud)
数据库、模式和表已经存在,但其中没有记录。所以......在 sp 代码的某个地方,它创建了表,但试图将太多的值填充到表中。
我正在使用它来尝试解决应用程序 (SCCM) 挂起问题,并按照建议创建了一个 SQL 代理作业,帮助台在遇到问题时可以执行该作业(它是间歇性的),但我尝试自己执行它,并且它因上述错误而失败。
我已经从 First Responder Kit 安装了 sp_BlitzCache(和其他),并且收到以下错误:
EXEC sp_BlitzCache;
Run Code Online (Sandbox Code Playgroud)
消息 208,级别 16,状态 0,过程 sp_BlitzCache,第 3878 行 [批处理开始第 0 行]
无效的对象名称“#trace_flags”。
所有其他脚本似乎都按预期工作,但我不确定我是否遇到了缺陷,或者它是否与我的使用和/或配置有关。
同样值得注意的是,该过程确实返回了 10 个结果,但随后因上述错误而失败。
我已经在网上和通过存储过程本身做了一些搜索。虽然我很困惑#trace_flags临时表似乎不像其他人那样创建,但我在 GitHub 上找不到似乎表明它曾经有过的代码..所以因为我认为它一直在为其他人工作,所以它导致我相信我假设错误的事情和/或错误地运行它。
先感谢您!无论是为了帮助,还是为了任何参与开发急救箱的人。
尝试sp_BlitzCache
在 SQL Server 2008上安装时,我得到:
Msg 102, Level 15, State 1, Procedure sp_BlitzCache, Line 2705 Incorrect syntax near '.'.
Msg 102, Level 15, State 1, Procedure sp_BlitzCache, Line 2715 Incorrect syntax near '.'.
Msg 102, Level 15, State 1, Procedure sp_BlitzCache, Line 2865 Incorrect syntax near '.'.
Run Code Online (Sandbox Code Playgroud)
第 2705 行是:
/* END Testing using XML nodes to speed up processing */
Run Code Online (Sandbox Code Playgroud)
第 2865FROM
行是:
/* Set configuration values */
SELECT @ctp = NULLIF(CAST(value AS INT), 0)
FROM sys.configurations …
Run Code Online (Sandbox Code Playgroud) 最近我们开始使用 sp_BlitzCache 来帮助我们调整我们的查询。我们发现一个 SP 有一些问题,我们能够成功地重构它。
在我们调整查询之前的一周内,我有一份 sp_BlitzCache 的输出副本,可在此处获得
https://drive.google.com/open?id=1oiAEl62ZT51qcCEhVzkg8oDA3HB-NCsv
生成此输出的命令运行是
exec sp_BlitzCache @StoredProcName = 'hs_UpdateShipmentPackagesAndWeightSp'
Run Code Online (Sandbox Code Playgroud)
几个问题
1)我注意到我们有多个行用于同一个计划句柄,这是为什么?
2) 您会注意到成本最高的查询 (1451) 具有整个 create procedure 语句的查询文本,这是什么意思?该行的指标是否仅用于创建存储过程?
3) 对于成本最高的行,即上面提到的行,它的最小/最大授权几乎为 2GB。这是否意味着当我们运行 create procedure 语句时,它要求 2gb 的内存?还是在调用 proc 时使用此计划?我想这与问题 2 的答案有关
4) 为什么在某些情况下我们有 Min/Max grant KB > 0 和 Min/Max used grant kb > 0,但百分比内存授权为 null ?
我们正在运行 SQL Server 2012。
谢谢,凯文