我有一个查询,向我报告添加记录的时间。我还在这个查询中跟踪添加到数据库中的图像的大小。据我所见,它看起来像是从链接服务器返回整个图像,然后计算大小。有没有一种简单的方法可以在链接的另一端计算大小,以便更快地返回?
SELECT
[Date] = CAST(DATEADD(DAY,-@DaysBack,GETDATE()) AS DATE)
,NOTES = N.RPMID
,TimeTaken = DATEDIFF("SECOND",SN.PickedUpDate,SN.ProcessedDate)
,PictureSize = SUM(CAST(DATALENGTH(SI.[Image])AS BIGINT))
,RecordsAdded = CAST(COUNT(*) AS BIGINT)
FROM
DBServer1.DB1.dbo.Notes AS N WITH (NOLOCK)
INNER JOIN DBServer1.DB1.dbo.NoteDistribution AS ND WITH (NOLOCK) ON N.Notes=ND.Notes
INNER JOIN dbo.Submission_Notes AS SN WITH (NOLOCK) ON SN.RetailPlanGuid=N.RPMID
LEFT JOIN DBServer1.DB1.dbo.SavedImage SI WITH (NOLOCK) ON SI.Notes=N.Notes
WHERE
1=1
AND N.RecordStampWhenAdd > CAST(GETDATE()-@DaysBack AS DATE)
AND N.RecordStampWhenAdd < CAST(GETDATE()-@DaysBack+1 AS DATE)
AND DATEDIFF("SECOND",SN.PickedUpDate,SN.ProcessedDate) > 0
GROUP BY
N.RPMID
,DATEDIFF("SECOND",SN.PickedUpDate,SN.ProcessedDate)
有问题的部分是返回的图片大小。我希望其中的计算在存储数据的服务器上完成,并将数字返回给我。在这方面的任何帮助都会很棒。谢谢。
我不确定您是如何确定所有数据都通过网络的(或者为什么会这样),但是您总是可以有一个计算列:
或者只需添加一列并在插入/更新行时自行计算,方法是通过存储过程强制插入/更新,或使用触发器。
并根据需要保留和/或索引,然后仅
SUM(PictureSize)
在查询中使用。当然,最大的影响仍然在于您必须扫描整个表或索引才能生成聚合。
此方法也可用于维护其他表中所有列的总大小,但我主要反对具体化冗余数据,除非这样做有明显的优势。
无论如何,我真的不认为这个查询很慢,因为它通过网络移动整个 varbinary 数据,然后在错误的一端计算长度;如果您有证据表明是这种情况,请更新问题,我们将尽力解决。
你能在源数据库中创建一个
ImageSize
持久化的计算列吗?这将在插入时为您计算大小,并允许您只请求该数据。