我目前在运行连接多个表的查询时遇到一些性能问题。主表有1.7亿条记录,相当大。
我遇到的是,当我使用 top 1000 子句运行查询时,结果是即时的。然而,当我将其增加到最高 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 亿条记录,并且我认为您等待更多内存资源也不合适,那么我认为重写查询不会有太大帮助。 所以这只是我的一个简单的解决方法:
尝试拆分您的查询。例如,首先从连接到 AuditUser 表的 AuditRecord 记录表中查询所需的所有数据,并将结果存储在另一个表(例如临时表)中。然后将这个新表与 Artifact 表连接起来,依此类推。在这种情况下,这些步骤将逐一需要更少的内存,然后运行整个查询并将其挂起。因此,从长远来看,您将拥有的不是一个查询,而是一个凭证,它很容易跟踪,因为您可以在控制台中打印出一些状态,并且它将完成他的工作,这与永无止境的查询不同
还要确保您确实需要立即查询所有这些数据,因为我想不出为什么需要它的用例,但如果它是一个应用程序,那么您应该实现分页,如果它是某些导出功能那么也许有一个时间线可以用来批量处理数据。例如导出每天的数据,只查询昨天的数据。在这种情况下,您将提出增量导出。
关于sql-server - SQL Server 查询的执行时间呈指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13955831/