J'ai la vue indexée suivante définie dans SQL Server 2008 (vous pouvez télécharger un schéma de travail à partir de gist à des fins de 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
et transaction_amount
sont tous définis comme des NOT NULL
colonnes dans dbo.transactions
. Cependant, lorsque je regarde la définition de la vue dans l'Explorateur d'objets de Management Studio, elle marque les deux colonnes balance_amount
et en transaction_count
tant que NULL
-able dans la vue.
J'ai jeté un coup d'œil à plusieurs discussions, celle-ci étant la plus pertinente d'entre elles, qui suggèrent qu'un mélange des fonctions peut aider SQL Server à reconnaître qu'une colonne de vue est toujours NOT NULL
. Un tel mélange n'est pas possible dans mon cas, cependant, car les expressions sur les fonctions d'agrégation (par exemple un ISNULL()
sur le SUM()
) ne sont pas autorisées dans les vues indexées.
Est - il possible que je peux aider SQL Server reconnaître que
balance_amount
ettransaction_count
sontNOT NULL
able?Sinon, devrais-je craindre que ces colonnes soient identifiées par erreur comme étant
NULL
-able?Les deux préoccupations auxquelles je pouvais penser sont:
- Tous les objets d'application mappés à la vue des soldes obtiennent une définition incorrecte d'un solde.
- Dans des cas très limités, certaines optimisations ne sont pas disponibles pour l'Optimiseur de requête car il n'a pas de garantie de la vue que ces deux colonnes le sont
NOT NULL
.
L'une ou l'autre de ces préoccupations est-elle un gros problème? Y a-t-il d'autres préoccupations que je dois garder à l'esprit?