Eu tenho uma consulta que me informa quanto tempo passou para os registros serem adicionados. Eu também acompanho nesta consulta o tamanho de uma imagem que foi adicionada ao banco de dados. Pelo que vejo, parece que está retornando a imagem inteira do servidor vinculado e calculando o tamanho. Existe uma maneira fácil de fazer com que o cálculo do tamanho ocorra do outro lado do link para que o retorno seja mais rápido?
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)
A parte em questão é o tamanho da imagem que é retornado. Eu quero que os cálculos lá sejam feitos no servidor onde os dados estão armazenados e apenas que o número me retorne. Qualquer ajuda nisso seria ótimo. Obrigado.
Não sei exatamente como você determinou que todos os dados estão passando pela rede (ou por que deveria ser esse o caso), mas você sempre pode ter uma coluna computada:
Ou apenas adicione uma coluna e calcule você mesmo sempre que inserir/atualizar uma linha, forçando inserções/atualizações por meio de um procedimento armazenado ou usando um gatilho.
E persista e/ou indexe conforme necessário, e depois é só usar
SUM(PictureSize)
na consulta.É claro que o grande impacto ainda será o fato de você ter que escanear toda a tabela ou índice para gerar o agregado.
Esse método também pode ser usado para manter o tamanho total de todas as colunas em alguma outra tabela, mas sou totalmente contra a materialização de dados redundantes, a menos que haja uma vantagem demonstrada em fazê-lo.
Em qualquer caso, eu realmente não acho que essa consulta seja lenta porque está movendo todos os dados varbinary pela rede e, em seguida, calculando o comprimento na extremidade errada; se você tiver evidências que sugiram que seja esse o caso, atualize a pergunta e tentaremos resolvê-la.
Você pode simplesmente criar uma
ImageSize
coluna computada persistente no banco de dados de origem? Isso calcularia o tamanho para você na inserção e permitiria apenas solicitar esses dados.