gpt4 book ai didi

SQL存储过程临时表内存问题

转载 作者:行者123 更新时间:2023-12-02 00:46:47 29 4
gpt4 key购买 nike

我们有以下简单的存储过程,它作为夜间 SQL Server 代理作业运行。通常它会在 20 分钟内运行,但最近 MatchEvent 和 MatchResult 表已分别增长到超过 900 万行。这导致存储过程需要 2 个多小时才能运行,我们的 SQL 框上的所有 8GB 内存都用完了。这使得数据库对试图访问它的常规查询不可用。

我认为问题是临时表太大,导致内存和数据库不可用问题。

如何重写存储过程以提高效率并减少内存占用?

注意:我已经编辑了 SQL 以表明存在影响初始 SELECT 语句的条件。为了简单起见,我之前将其排除在外。此外,当查询运行时,CPU 使用率为 1-2%,但如前所述,内存已用尽


CREATE TABLE #tempMatchResult
(
matchId VARCHAR(50)
)<p></p>

<p>INSERT INTO #tempMatchResult
SELECT MatchId FROM MatchResult WHERE SOME_CONDITION</p>

<p>DELETE FROM MatchEvent WHERE<br/>
MatchId IN (SELECT MatchId FROM #tempMatchResult)</p>

<p>DELETE FROM MatchResult WHERE
MatchId In (SELECT MatchId FROM #tempMatchResult)</p>

<p>DROP TABLE #tempMatchResult
</p>

最佳答案

这里可能发生了很多事情,但并不是您要查询的全部内容。

首先,我同意其他海报。如果可能的话,尝试在没有临时表的情况下重写它。

但是假设您在这里需要一个临时表,那么您会遇到一个大问题,因为您没有在其上定义 PK。这将大大延长查询运行所需的时间。改为像这样创建你的表:

CREATE TABLE #tempMatchResult (
matchId VARCHAR(50) NOT NULL PRIMARY KEY /* NOT NULL if at all possible */
);

INSERT INTO #tempMatchResult
SELECT DISTINCT MatchId FROM MatchResult;

此外,请确保您的 TempDB 大小正确。您的 SQL 服务器很可能会在您身上动态扩展数据库文件,从而导致您的查询占用 CPU 和磁盘时间。此外,请确保您的事务日志大小正确,并且不会自动增长。祝你好运。

关于SQL存储过程临时表内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/227994/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com