Eu criei um índice filtrado (no SQL Server 2012) e o comparei com um índice não filtrado – pude ver melhorias promissoras conforme mostrado abaixo. Agora preciso alterar a condição do filtro para usar duas colunas na tabela. A condição necessária é WHERE InboundQuantity - OutboundQuantity <> 0
ou InboundQuantity <> OutboundQuantity
Mas quando aplico este filtro, recebo uma mensagem de erro
“Cláusula WHERE incorreta para índice filtrado 'IX_WO_PlantCD_FilterQtyNotEqual'”.
Eu sei que existem limitações com índice filtrado. No entanto, existe uma maneira de obter essa melhoria com duas condições de coluna, usando índice filtrado ou algo semelhante?
Consulta
--Normal Index
CREATE NONCLUSTERED INDEX IX_WO_NormalPlantCD
ON dbo.MyTable (PlantCD) INCLUDE (InboundQuantity,OutboundQuantity)
--Filtered Index
CREATE NONCLUSTERED INDEX IX_WO_PlantCD_FilterInboundQtyNotEqual
ON dbo.MyTable (PlantCD) INCLUDE (InboundQuantity,OutboundQuantity)
WHERE InboundQuantity <> 0
--Query 1
SELECT SUM([InboundQuantity] - [OutboundQuantity])
FROM [MyTable]
WHERE [PlantCD] = 'XX'
--Query2 (suing same where condition as filtered index)
SELECT SUM([InboundQuantity] - [OutboundQuantity])
FROM [MyTable]
WHERE [PlantCD] = 'XX'
AND InboundQuantity<>0
Plano
Onde um índice filtrado em uma coluna computada é muito limitado, você tem a opção de criar uma exibição indexada.
A exibição indexada é mantida automaticamente pelo banco de dados, portanto, você não precisa se preocupar em obter a lógica de disparo correta para todas as operações DML possíveis. Você também não precisa se preocupar com problemas complicados de correção em alta simultaneidade.
A sobrecarga de manter os índices de exibição também é normalmente menor do que para gatilhos.
Por exemplo, dada uma tabela:
Uma exibição indexada adequada pode ser:
Se você estiver executando o Enterprise Edition, a correspondência de visualização indexada automática significa que uma consulta escrita sem referenciar a visualização diretamente ainda pode usá-la:
O plano de execução mostra a exibição indexada sendo acessada:
Para outras edições, você precisaria referenciar a view diretamente e usar a
NOEXPAND
dica:Plano de execução:
As mesmas restrições de configuração de conexão se aplicam a exibições indexadas para colunas computadas indexadas. Você pode optar por usar a
NOEXPAND
versão mesmo na Enterprise Edition, pois o uso da exibição é garantido (não decidido pelo otimizador) e as estimativas de cardinalidade geralmente também serão melhores .O efeito de adicionar uma exibição indexada depende de muitos fatores, portanto, você precisa testá-lo. Qualquer solução segura tem o potencial de aumentar a contenção, mas onde uma coluna computada indexada não se encaixa, uma exibição indexada geralmente é a segunda melhor opção. Se bem feito, o efeito pode ser mínimo. A sobrecarga de uma exibição indexada em uma única tabela não pode ser maior do que a adição de um novo índice não clusterizado à tabela base.
Pensei em adicionar uma coluna computada como esta:
mas isso não funciona.
Isso é um pouco complicado, mas funciona:
mas você precisa adicionar um gatilho na tabela para manter a
diff
coluna atualizada.Também seria bom adicionar uma restrição:
...como quer que você escolha manter a coluna (acionar ou alterar todos os procedimentos de inserção/atualização na tabela).