Eu tenho a seguinte exibição indexada definida no SQL Server 2008 (você pode baixar um esquema funcional da gist para fins de teste):
CREATE VIEW dbo.balances
WITH SCHEMABINDING
AS
SELECT
user_id
, currency_id
, SUM(transaction_amount) AS balance_amount
, COUNT_BIG(*) AS transaction_count
FROM dbo.transactions
GROUP BY
user_id
, currency_id
;
GO
CREATE UNIQUE CLUSTERED INDEX UQ_balances_user_id_currency_id
ON dbo.balances (
user_id
, currency_id
);
GO
user_id,, currency_ide transaction_amountsão todos definidos como NOT NULLcolunas em dbo.transactions. No entanto, quando olho para a definição de exibição no Pesquisador de Objetos do Management Studio, ela marca as colunas como balance_amounte -able na exibição.transaction_countNULL
Examinei várias discussões, sendo esta a mais relevante, que sugerem que algumas funções aleatórias podem ajudar o SQL Server a reconhecer que uma coluna de exibição é sempre NOT NULL. No entanto, não é possível embaralhar esse tipo, pois expressões em funções agregadas (por exemplo, um ISNULL()over the SUM()) não são permitidas em visualizações indexadas.
Existe alguma maneira eu posso ajudar SQL Server reconhecer que
balance_amountetransaction_countsãoNOT NULL-able?Caso contrário, devo ter alguma preocupação sobre o fato de essas colunas serem identificadas por engano como
NULL-able?As duas preocupações em que consigo pensar são:
- Quaisquer objetos de aplicativo mapeados para a exibição de saldos estão recebendo uma definição incorreta de um saldo.
- Em casos muito limitados, certas otimizações não estão disponíveis para o Query Optimizer, pois não há garantia da exibição de que essas duas colunas estão
NOT NULL.
Alguma dessas preocupações é um grande negócio? Há outras preocupações que devo ter em mente?
