Ho la seguente vista indicizzata definita in SQL Server 2008 (è possibile scaricare uno schema funzionante da gist a scopo di test):
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_id
e transaction_amount
sono tutti definiti come NOT NULL
colonne in dbo.transactions
. Tuttavia, quando guardo la definizione della vista in Esplora oggetti di Management Studio, segna entrambe le colonne come balance_amount
e -able nella vista.transaction_count
NULL
Ho dato un'occhiata a diverse discussioni, questa è la più pertinente di esse, che suggerisce che alcune mescolanze di funzioni potrebbero aiutare SQL Server a riconoscere che una colonna di visualizzazione è sempre NOT NULL
. Nel mio caso, tuttavia, non è possibile effettuare tale shuffle, poiché le espressioni sulle funzioni aggregate (ad esempio un ISNULL()
over the SUM()
) non sono consentite nelle viste indicizzate.
C'è un modo posso aiutare SQL Server riconoscere che
balance_amount
etransaction_count
sonoNOT NULL
-abile?In caso contrario, dovrei avere dubbi sul fatto che queste colonne vengano erroneamente identificate come
NULL
-able?Le due preoccupazioni che mi vengono in mente sono:
- Qualsiasi oggetto dell'applicazione mappato alla vista dei saldi sta ottenendo una definizione errata di un saldo.
- In casi molto limitati, alcune ottimizzazioni non sono disponibili per lo Strumento per ottimizzare le query poiché non ha una garanzia dal punto di vista della presenza di queste due colonne
NOT NULL
.
Una di queste preoccupazioni è un grosso problema? Ci sono altre preoccupazioni che dovrei tenere a mente?