Eu tenho um banco de dados que Manifest
contém vários Inventory
itens. Cada item de inventário possui um número inteiro NetWeight
.
Eu tenho a seguinte consulta:
SELECT
ID,
(SELECT SUM(NetWeight) FROM Inventory WHERE Inventory.ManifestID = Manifest.ID)
FROM Manifest
que está lançando uma exceção: Arithmetic overflow error converting expression to data type int.
e não entendo o porquê.
Recentemente, a Inventory
tabela excedeu o tamanho de um int se você SUM(NetWeight)
não tiver filtro.
No entanto, sei e verifiquei que não existem Manifest
valores com valor superior a 100.000 para essa subconsulta.
Se eu anexar WHERE ID > 0
ao final da consulta, tudo funcionará bem. Todos Manifest
os IDs são maiores que 0, então isso é teoricamente equivalente a não ter nenhum filtro.
Eu sei que posso simplesmente convertê-lo para a bigint
e continuar meu dia, mas quero entender por que o SQL está transbordando.
Está somando internamente toda a tabela de inventário por algum motivo?
Qualquer visão seria muito apreciada.
Plano de consulta estimado: https://www.brentozar.com/pastetheplan/?id=BJETnFUpa
A ramificação superior do plano de execução seleciona todas as 1.098.300 linhas
Inventory
e executaA saída disso (estimado em 6 grupos) é mesclada
Manifest
(com uma junção externa direita, significando que todas as linhasManifest
são preservadas).Manifest
tem uma cardinalidade de 5 linhas.Presumivelmente, existe um
ManifestID
inInventory
que está causando esse estouro para um grupo, mas é incomparávelManifest
e é eliminado pela junção.Talvez linhas onde
ManifestID
estáNULL
?Você poderia tentar alterar a consulta para
para eliminar essas linhas anteriormente no plano ( Fiddle ).
Você também pode avaliar um índice em
para evitar a leitura completa dessas linhas e fornecer um índice de cobertura útil para a agregação por
ManifestID
.