标签: execution-plan

查询计划未保留内存不足错误

我们一直遇到 SQL Server 的内存问题。

当我们开始出现超时和登录错误时,我们首先意识到我们遇到了问题:

已成功与服务器建立连接,但随后在登录过程中出现错误。(提供者:TCP 提供者,错误:0 - 指定的网络名称不再可用。)

在我们的 sqlbox 上查看事件查看器,我们注意到大量内存不足错误:

系统内存不足,无法运行此查询。
有关详细信息,请参阅http://go.microsoft.com/fwlink/events.asp 上的帮助和支持中心。

在此之前唯一的即时警告是以下消息:

AppDomain 119 (Alerts.dbo[runtime].118) 已卸载。

在此之前大约 20 分钟,我们收到了许多与性能相关的消息和错误:

信息:
此计算机上的 Microsoft Operations Manager 代理从其 MOM 服务器收到新规则和配置设置。管理组:GGC

警告:
“ASP”服务的性能库“C:\WINDOWS\system32\aspperf.dll”的配置信息与存储在注册表中的可信性能库信息不匹配。此库中的函数不会被视为受信任的。

错误:
Microsoft Operations Manager 性能提供程序无法访问计算机上的性能计数器等等。Microsoft Operations Manager 不会监视这台计算机上的性能计数器,直到它们可用。

信息:
Microsoft Operations Manager 在上次失败后成功加载了计算机上的性能计数器,并将开始监视它们。

我怀疑上面的性能警报/错误与两个小时的“内存不足异常”有什么关系,但为了以防万一,我已经包含了这些消息。

最后,经过两个小时的红色内存错误后,以下信息消息预示着内存不足警报的结束:

由于“DBCC FREEPROCCACHE”或“DBCC FREESYSTEMCACHE”操作,SQL Server 遇到了 2 次出现“绑定树”缓存存储(计划缓存的一部分)的缓存存储刷新。

所以我们的 DBA 在某个时候调用了 freeprocache。尽管最终修复了内存不足的异常,我们注意到我们的执行计划仍然没有被存储。这个“问题”现在已经持续了整整 3 天,这意味着使用具有复杂计划的查询的应用程序面临着严重的性能困难。在某些情况下,计划开始再次被采用,但它们不会在缓存中停留很长时间。

我想知道是否有人可以帮助确定关注的领域。

A 部分代表查询计划被保留时的系统(计划被保留,但只保留一个小时左右),B 部分代表计划根本没有被缓存(检查 dm_exec_query_stats)

甲部

DBCC MemoryStatus 结果:

Memory Manager   KB 
VM Reserved 1828768 …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 memory execution-plan

6
推荐指数
2
解决办法
976
查看次数

捕获复杂的实际执行计划

我有一个存储过程,其中包括构建和执行大量动态 SQL 语句。(不要恨我,我没有写。)

我想检索整个过程的实际执行计划,以便我可以在 SQL Sentry 计划资源管理器中对其进行分析。

当我在查询窗口中执行 PROC 时打开实际执行计划只会在我尝试查看它并将其保存时使 Management Studio 崩溃。

如果我打开 SHOW STATISTICS XML,它只会导致每个单独的语句计划 xml 作为单独的结果。那对我没有帮助,因为我需要整个计划作为一个整体。

我的问题是我想从服务器上保存一个 .sqlplan 文件并将其保存到我的本地机器上,我可以在其中在 Plan Explorer 中对其进行分析。原因是我无法直接连接到运行 Plan Explorer 的服务器。通过代理的 RDP 是我唯一的连接方法,因此我只能分析已保存并已检索到本地计算机进行分析的 .sqlplan 文件。

当我检索程序的估计计划时,我可以将返回的图形计划另存为 .sqlplan 文件,该文件具有单个根节点和单个 Batch Sequence 节点。然后我可以将该文件带到我的本地计算机并在 Plan Explorer 中打开它,该软件可以看到构成批处理的所有不同语句。

如果我打开 XML Statistics,则每个语句计划都将作为它自己的独立计划返回,并且具有自己的根节点。我不能把它放在一个文件中,因为那不是有效的 xml。

有任何想法吗?

谢谢,比尔

ssms execution-plan sql-server-2008-r2

6
推荐指数
1
解决办法
526
查看次数

使用 union all 和 join 连接两个子查询会导致执行计划不理想

我在生产环境中遇到了类似的问题,但我设法在Northwind DB上重现了这种行为。

考虑以下查询:

USE NORTHWND; 
DECLARE @ids TABLE ( Id NCHAR(50) );
INSERT  INTO @ids
VALUES  ( N'AROUT' ),
        ( N'ALFKI' );

SELECT  *
FROM    ( SELECT    c.CustomerID
          FROM      dbo.Customers c
          WHERE     c.CustomerID IN ( SELECT    Id
                                      FROM      @ids )
          UNION ALL
          SELECT    '0'
        ) t1
JOIN    ( SELECT    o.CustomerID
          FROM      dbo.Orders o
          --LEFT JOIN dbo.[Order Details] od ON o.OrderID = od.OrderID
          UNION ALL
          SELECT    '0'
        ) t2 ON t2.CustomerID = t1.CustomerID
OPTION  ( RECOMPILE );
Run Code Online (Sandbox Code Playgroud)

它有很好的查询计划: 好计划

现在,当我取消注释 …

performance sql-server execution-plan

6
推荐指数
1
解决办法
5232
查看次数

在缓存的执行计划中寻找缺失的索引

我有以下查询向我显示了 sql server 中缓存的内容:

SELECT cp.objtype AS ObjectType,
OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
cp.usecounts AS ExecutionCount,
st.TEXT AS QueryText,
qp.query_plan AS QueryPlan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 1=1
  --AND OBJECT_NAME(st.objectid,st.dbid) = 'YourObjectName'
  AND query_plan IS NOT NULL
ORDER BY ExecutionCount DESC
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有没有办法可以查询 queryPlan 字段以查找丢失的索引?

performance index sql-server execution-plan sql-server-2014 query-performance

6
推荐指数
1
解决办法
1506
查看次数

提高 GROUP BY 子句中的排序性能

我在 Postgres 9.4.1 中有两个表,eventsevent_refs具有以下模式:

events 桌子

CREATE TABLE events (
  id serial NOT NULL PRIMARY KEY,
  event_type text NOT NULL,
  event_path jsonb,
  event_data jsonb,
  created_at timestamp with time zone NOT NULL
);

-- Index on type and created time

CREATE INDEX events_event_type_created_at_idx
  ON events (event_type, created_at);
Run Code Online (Sandbox Code Playgroud)

event_refs 桌子

CREATE TABLE event_refs (
  event_id integer NOT NULL,
  reference_key text NOT NULL,
  reference_value text NOT NULL,
  CONSTRAINT event_refs_pkey PRIMARY KEY (event_id, reference_key, reference_value),
  CONSTRAINT event_refs_event_id_fkey FOREIGN KEY (event_id) …
Run Code Online (Sandbox Code Playgroud)

postgresql performance execution-plan group-by postgresql-9.4 postgresql-performance

6
推荐指数
1
解决办法
2674
查看次数

存储过程的固定查询计划

我正在探索计划指南主题。听起来很简单,就我们通过文档中的示例而言。

问题是我找不到任何工作示例(我也没有设法自己弄清楚)来为存储过程或过程中的语句设置固定计划。

我已经阅读了很多博客文章,但它们都只是从 microsoft docs 复制/粘贴示例。

有人更有创意/经验丰富吗?

sql-server hints execution-plan

6
推荐指数
1
解决办法
2838
查看次数

查询不会编译/运行

我有一个不会在生产服务器上运行但它在测试服务器上运行的查询。查询计划似乎无法编译或编译的查询计划非常糟糕。我已经用全扫描更新了所有统计信息,并重建了所有相关表的索引,但没有成功,任何表中的行都没有那么多。我无法更改查询,因为它是 AOS (AX 2012) 创建的。我应该怎么做才能按原样使用查询?

询问

DECLARE @P1 AS BIGINT = 5637144576
DECLARE @P2 AS NVARCHAR(4) = N'1003'
DECLARE @P3 AS INT = 212
DECLARE @P4 AS BIGINT = 5638885273
DECLARE @P5 AS BIGINT = 5637144576
DECLARE @P6 AS INT = 865
DECLARE @P7 AS BIGINT = 5637144576
DECLARE @P8 AS BIGINT = 5637144576

SELECT     t1.balance01, 
           t1.recid, 
           t2.amountcur, 
           t2.dataareaid, 
           t2.recid, 
           t3.recid, 
           t3.voucher, 
           t3.accountnum, 
           t3.approved, 
           t3.closed, 
           t3.dataareaid, 
           t4.party, 
           t4.dataareaid, 
           t4.recid 
FROM       spectrans T1 
CROSS JOIN custtransopen T2 
CROSS JOIN custtrans T3 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan sql-server-2014 query-performance

6
推荐指数
1
解决办法
243
查看次数

对连接到 sys.databases 的查询统计和执行计划运行针对 DMV 的查询

我最初在 Twitter #sqlhelp 中将此作为一个不同的问题发布,但想以不同的方式发布在这里。

我正在尝试使用 DMV dm_exec_query_statsdm_exec_cached_plansdm_exec_sql_text以及最初的sys.databases创建一个跟踪各种统计数据(例如读取、写入、CPU、执行计数等)性能最差的语句的作业。

发生的情况是,这个查询有时(并非总是)在繁忙的服务器上运行需要超过 8 分钟,但是一旦我删除了对sys.databases的连接,只需要 9 秒。这段时间的大部分时间是 CPU 时间,几乎没有等待,没有阻塞,没有扫描,只有 13406 次逻辑读取和 1562 次 lob 读取。

所以我想知道的是,为什么加入 sys.databases导致巨大的性能下降?为什么不一致?

发生的情况是,当我运行以下测试查询时,有时会无缘无故地花费超过 8 分钟,而其他时间则在 11 秒内完成。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
DECLARE @snapshot_timeoffset AS datetimeoffset(3) = CAST(SYSDATETIMEOFFSET() AS datetimeoffset(3));

SELECT
    @snapshot_timeoffset AS [snapshot_timeoffset]
    ,db.name AS [database_name]  
    ,OBJECT_SCHEMA_NAME(st.objectid, st.dbid) [schema_name] 
    ,OBJECT_NAME(st.objectid, st.dbid) [object_name]   
    ,cp.objtype
    ,cp.usecounts
    ,cp.refcounts
    -- find the offset of the actual …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan dmv query-performance

6
推荐指数
2
解决办法
539
查看次数

对聚集索引扫描和聚集索引搜索的澄清

我已创建了80000条记录与一个表Cluster Index上的CustomerID列。当我查询以下语句时,执行计划的行为有所不同。任何人都可以澄清相同。

select * from customer
Run Code Online (Sandbox Code Playgroud)

显示集群索引扫描,所以这是正确的。

select * from customer where CustomerID=80000
Run Code Online (Sandbox Code Playgroud)

执行计划显示 ClusterIndex Seek,所以这是正确的。

select * from customer where CustomerID between 1 and 70000
Run Code Online (Sandbox Code Playgroud)

执行计划仍然显示ClusterIndex 求问为什么?

根据统计,行数为 90%,然后优化器必须使用“ClusterIndex Scan”,但它使用的是“Cluster Index Seek”,为什么?所有统计数据都是最新的,我已经检查了估计行和实际行,那么为什么优化器选择“集群索引搜索”来获取总记录中 90% 的行。

index sql-server execution-plan sql-server-2014

6
推荐指数
2
解决办法
704
查看次数

如何更新数据库系统表的统计信息

我们最近将许多实例升级到 2016 年。因此,来自sqlpackage.exe的 SELECT 语句在某些实例上超时。

经过一些测试,我发现通过更新执行计划中显示的数据库系统表的统计信息,SELECT 停止了超时。

update statistics sys.[sysclsobjs] with fullscan
update statistics sys.[syscolpars] with fullscan
update statistics sys.[sysidxstats] with fullscan
update statistics sys.[sysiscols] with fullscan
update statistics sys.[sysobjvalues] with fullscan
Run Code Online (Sandbox Code Playgroud)

无论如何,是否可以通过标准维护包、Ola Hallengren 的脚本或其他一些过程来仅更新系统表统计信息?

08/01 更新

以下是我升级后的步骤

关于 4199 跟踪标志KB974006

-- for the instance
/* 
Turn on traceflag 4199 (my understanding of this traceflag is that it disables
optimizer hotfixes in 2016
*/

-- disable automatic numa
sp_configure 'automatic soft-NUMA disabled', 1
GO

-- For each …
Run Code Online (Sandbox Code Playgroud)

statistics execution-plan sql-server-2016

6
推荐指数
1
解决办法
2696
查看次数