gpt4 book ai didi

sql-server - 由于文件组 'TEMPDB' 中的磁盘空间不足,无法为数据库 'DEFAULT' 分配新页面

转载 作者:行者123 更新时间:2023-12-02 00:21:44 26 4
gpt4 key购买 nike

由于文件组“DEFAULT”中的磁盘空间不足,无法为数据库“TEMPDB”分配新页面。通过删除文件组中的对象、向文件组中添加其他文件或为文件组中的现有文件设置自动增长来创建必要的空间。

在执行包含近 2.5 亿条记录的选择语句的存储过程时遇到此错误。

即使我在 tempdb 中有大约 650gb 的空间,我仍然面临这个错误。想知道我可以在这方面做些什么

查询:

SELECT u.Id, u.place, u.name, u.lname, LOWER(ue.email) AS Email, MIN(dp.BirthTime) AS Time
FROM tableA u
JOIN tableB ue ON ue.id = u.id AND ue.Did = 0
JOIN tableC dp ON dp.Id = u.Id
JOIN tableB dpe ON dpe.Id = dp.Id
LEFT JOIN tableB idpe ON idpe.Email = dpe.Email
LEFT JOIN tableE idp ON idp.Id = idpe.Id
LEFT JOIN tableD pidp ON pidp.Id = idp.Id
JOIN tableD cp ON dp.Id = cp.Id
where ISNULL(cp.FName,'') = '' AND ISNULL(cp.LName,'') = '' AND ISNULL(cp.IsActive,0) = 0 AND ISNULL(dp.Isinactive,0) = 0
AND ISNULL(pidp.FName,'') = '' AND ISNULL(pidp.LName,'') = ''
AND ISNULL(pidp.Isactive,0) = 0 AND ISNULL(idp.IsInactive,0)
AND ISNULL(u.EHome, '') != ''
GROUP BY u.Id, u.Isactive, u.name, u.EServer, ue.Email

最佳答案

TempDB 不是问题。

查询有多个带有非 SARGable 表达式的过滤器。在可以过滤任何 where 子句数据之前,必须处理所有连接。如果您的最终结果(过滤和分组)是 2.5 亿行,我预计连接后的结果将高达数十亿。在进行过滤和分组之前,必须在 tempdb 中具体化该结果。

尝试将此 ISNULL(cp.FName,'') = '' 更改为此 (cp.FName = '' OR cp.FName IS NULL),然后所有类似的表达。这至少可以允许在连接之前进行一些过滤。

第二步是删除结果集中未使用的连接。您只从表 U、UE 和 DP 返回数据。将其他内部连接移动到 exists 子句中

EXISTS (SELECT 1 FROM tableB dpe WHERE dpe.Id = dp.Id)

这会将初始加入产品减少到更易于管理的程度。

您的左连接解析起来会更复杂,但如果不是结果集的一部分,也不应该是连接。我读了你的查询,说你想在数据丢失的地方过滤你的结果。例如,FName 仅当 FName 为空字符串、空值或没有匹配记录时才返回。另一种说法是,您不希望看到 FName、LName、IsActive 的记录填充有非零/非空值。

AND NOT EXISTS ( SELECT 1 FROM tableD AS pidp where pidp.Id = idp.Id AND fname <> '' AND lname <> '' AND isactive = 0)

如果所有 3 个都已填充,此语句将排除它们。如果您只想在任何一个字段有值时排除它们,请将 EXISTS 子句中的 AND 更改为 OR

尝试这些更改,我希望您会完全避免臃肿的 TempDB。

关于sql-server - 由于文件组 'TEMPDB' 中的磁盘空间不足,无法为数据库 'DEFAULT' 分配新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55144119/

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