gpt4 book ai didi

sql-server - SQL Server 查询的执行时间呈指数增长

转载 作者:行者123 更新时间:2023-12-02 05:20:23 25 4
gpt4 key购买 nike

我目前在运行连接多个表的查询时遇到了一些性能问题。主表有 1.7 亿条记录,所以它非常大。

我遇到的情况是,当我使用前 1000 个子句运行查询时,结果是即时的。但是,当我将其增加到 top 8000 时,查询很容易运行 15 分钟(然后我将其终止)。通过反复试验,我发现临界点是 Top 7934(非常有效)和 Top 7935(永远运行)

有人能识别出这种行为并看出我做错了什么吗?也许我的查询在某些方面有问题。

提前致谢

SELECT  top 7934 h.DocIDBeg
,h.[Updated By]
,h.Action
,h.Type
,h.Details
,h.[Update Date]
,h.[Updated Field Name]
,i.Name AS 'Value Set To'
,COALESCE(i.Name,'') + COALESCE(h.NewValue, '') As 'Value Set To'
,h.OldValue
FROM
(SELECT g.DocIDBeg
,g.[Updated By]
,g.Action
,g.Type
,g.Details
,g.[Update Date]
,CAST(g.details as XML).value('auditElement[1]/field[1]/@name','nvarchar(max)') as 'Updated Field Name'
,CAST(g.details as XML).value('(/auditElement//field/setChoice/node())[1]','nvarchar(max)') as 'value'
,CAST(g.details as XML).value('(/auditElement//field/newValue/node())[1]','nvarchar(max)') as 'NewValue'
,CAST(g.details as XML).value('(/auditElement//field/oldValue/node())[1]','nvarchar(max)') as 'OldValue'
FROM(
SELECT a.ArtifactID
,f.DocIDBeg
,b.FullName AS 'Updated By'
,c.Action
,e.ArtifactType AS 'Type'
,a.Details
,a.TimeStamp AS 'Update Date'
FROM [EDDS1015272].[EDDSDBO].[AuditRecord] a
LEFT JOIN [EDDS1015272].[EDDSDBO].AuditUser b
ON a.UserID = b.UserID
LEFT JOIN [EDDS1015272].[EDDSDBO].AuditAction c
ON a.Action = c.AuditActionID
LEFT JOIN [EDDS1015272].[EDDSDBO].[Artifact] d
ON a.ArtifactID = d.ArtifactID
LEFT JOIN [EDDS1015272].[EDDSDBO].[ArtifactType] e
ON d.ArtifactTypeID = e.ArtifactTypeID
INNER JOIN [EDDS1015272].[EDDSDBO].[Document] f
ON a.ArtifactID = f.ArtifactID
) g
) h
LEFT JOIN [EDDS1015272].[EDDSDBO].[Code] i
ON h.value = i.ArtifactID

最佳答案

我以前经常和数据仓库打交道,经常遇到类似的问题。根本原因显然是内存使用,就像这里已经提到的那样。如果您真的需要查询所有 1.7 亿条记录,我认为重写您的查询不会有太大帮助,而且我认为您等待更多的内存资源也不行。所以这只是我的一个简单解决方法:

尝试拆分您的查询。例如,先从AuditRecord记录表中查询你需要的所有数据加入AuditUser表,并将结果存储在另一个(例如临时表)表中。然后将这个新表与 Artifact 表等连接起来。在这种情况下,这个步骤将需要更少的内存,然后运行整个查询并将其挂起。因此,从长远来看,您将没有查询,而是一个易于跟踪的凭证,因为您可以在控制台中打印出一些状态,并且它将完成他的工作,这与永无止境的查询不同

还要确保你真的需要一次查询所有这些数据,因为我想不出你为什么需要它的用例,但如果它是一个应用程序,那么你应该实现分页,如果它是一些导出功能那么也许有一个时间线可以用来批处理数据。比如每天导出数据,只查询昨天的数据。在这种情况下,您将提出增量导出。

关于sql-server - SQL Server 查询的执行时间呈指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13955831/

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