AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 297929
Accepted
Don
Don
Asked: 2021-08-12 16:15:53 +0800 CST2021-08-12 16:15:53 +0800 CST 2021-08-12 16:15:53 +0800 CST

由于内存压力,AppDomain 2 SSISDB 被标记为卸载

  • 772

我有一个存储过程,它将三个大表连接在一起(每个大约 2000 万条记录)并将记录加载到一个临时表中。然后将临时表中的数据合并到一个包含大约 6000 万条记录的现有表中。

服务器离线并显示以下错误消息:

由于内存压力,AppDomain 2 (SSISDB.dbo.[runtime].1] 被标记为卸载。

错误日志消息

让服务器重新联机后,我重新启动 SQL 服务以清除任何可能一直存在的进程。再次开始工作,并且没有问题地完成。

我正在运行具有 128GB RAM 的 SQL Server 2019。64 位虚拟服务器上的最大服务器内存为 117964MB。有人在任务管理器中告诉我内存使用率为 94%,这可能是问题所在。但是 SQL 不会占用所有可用内存并保留它吗?所以看起来它正在按预期运行。

sp_WhoIsActive揭示了一些状态为“暂停”和“等待命令”的查询,但我认为这些不会产生太大影响。128GB 的​​内存似乎足够了,但我想这与它被要求做的工作有关。知道如何排除故障或防止再次发生吗?

服务器的数据驱动器约为 1.6TB。连接中的两个较大的数据库是 10GB 的 1900 万行和 13GB 的 2000 万行。这些进入一个临时表,然后MERGE进入一个有 5300 万行的 26GB 表。

请求的内存授权为 45GB,实际为 30GB。这项工作是在正常工作时间之外进行的,所以应该没有竞争性查询,但我不能 100% 确认有人没有工作到很晚。

我确实注意到它也必须这样做CONVERT_IMPLICIT。这对所需的内存有重大影响吗?

查询计划链接: https ://www.brentozar.com/pastetheplan/?id=SyXaty7xK

sql-server memory
  • 1 1 个回答
  • 1263 Views

1 个回答

  • Voted
  1. Best Answer
    Erik Darling
    2021-08-14T05:33:16+08:002021-08-14T05:33:16+08:00

    关于您的服务器

    尽管授予了 29 GB 内存,但此查询在两个地方严重溢出。这是关于最大服务器内存设置为 115 GB 的系统上查询可以要求的高端内容。

    授予该大小的内存的原因是优化器估计它将需要对 46 GB 的数据进行排序:

    坚果

    您可以通过查看资源调控器来查看内存授予百分比的详细信息——单个查询可以请求最大服务器内存设置的 25% 左右——并且最多三个查询可以同时请求完全授予。

    如果您获得了该大小的授权,但仍会看到如此数量的溢出和时间消耗,这可能意味着您的服务器就内存而言远远低于配置。

    坚果

    由于两个运算符都在批处理模式下执行,因此您看到的时间是per operator。

    • 操作员时间

    我敢肯定,如果您查看此服务器的等待统计信息(考虑到 1.6 TB 的数据),PAGEIOLATCH_可能会出现这种情况,SLEEP_TASK或者IO_COMPLETION这种大小的溢出很常见。虽然这两种等待也可以与其他事情相关联,但我经常看到它们在像你这样的情况下堆积起来。

    我首先建议为您的服务器添加更实际的内存量。我不知道这个数字是多少(我也不能在这里告诉你),但我可能会根据数据大小而不是其他目标来瞄准 512 GB 或更高。如果还没有,您还应该打开内存中的锁定页面。

    关于您的查询

    我看不到全文,因为查询计划中出现的只是插入和选择列表的一部分,但鉴于看起来我可以对整体代码质量做出一些合理的假设。

    例如,有几个连接在表达式上,这可能表明您正在将连接列包装在类似rtrim或之类的函数中isnull。

    坚果

    但是您的主要问题是在查询的末尾和上图所示的溢出。

    让我们谈谈那些!

    哈希连接

    哈希联接用于DISTINCT您在143 列查询中抛出的问题。这让我毛骨悚然,写这篇文章的人如果要继续使用 SQL Server,应该强烈考虑接受一些培训。

    我建议找到产生唯一行的列的较小组合,并使用row_number来标记它们,就像我在这个视频中展示的那样:

    • 非常糟糕

    一个伪代码示例如下所示:

    WITH 
       cte AS
    (
       SELECT
           *,
            n = 
                ROW_NUMBER..
        FROM ...
    )
    SELECT
        c.*
    FROM cte AS c
    WHERE c.n = 1;
    

    只需确保您的索引适合支持窗口功能。

    • 窗口函数的常见查询计划模式:行与批处理模式
    • 窗口函数的常见查询计划模式:行存储与列存储索引
    • 当索引排序方向很重要时

    种类

    排序在那里,因为您的#temp表上有一个聚集索引。

    坚果

    如果您将表创建为堆,并稍后添加索引,则可以避免查询运行时的不愉快,但根据各种本地因素,添加索引可能并不有趣。

    • 什么时候应该索引临时表?

    如果可能的话,我还建议在您的插入tablock中添加一个提示以鼓励完全并行插入。

    • 充分利用临时表第 1 部分:并行插入

    现在,您的查询在插入之前是单线程的,这肯定会损害此行数的性能。

    坚果

    鉴于查询的整体状态,可能值得探索重写以将查询分解为更小的部分,以识别您感兴趣的唯一键集,然后获取您感兴趣的完整列集:

    • 信息与关系
    • 11

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve