Mam następujący widok indeksowany zdefiniowany w SQL Server 2008 (możesz pobrać działający schemat z gist do celów testowych):
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
i transaction_amount
wszystkie są zdefiniowane jako NOT NULL
kolumny w dbo.transactions
. Jednak kiedy patrzę na definicji widoku w zarządzaniu Studio Object Explorer, to znaki obu balance_amount
i transaction_count
jak NULL
-able kolumn w widoku.
Rzuciłem okiem na kilka dyskusji, z których ta jest najbardziej odpowiednia, sugerując, że pewne tasowanie funkcji może pomóc SQL Serverowi rozpoznać, że kolumna widoku jest zawsze NOT NULL
. W moim przypadku takie tasowanie nie jest możliwe, ponieważ wyrażenia dotyczące funkcji agregujących (np. ISNULL()
Ponad SUM()
) nie są dozwolone w widokach indeksowanych.
Czy jest jakiś sposób, w jaki mogę pomóc SQL Serverowi to rozpoznać
balance_amount
i czytransaction_count
możnaNOT NULL
?Jeśli nie, to czy powinienem mieć jakiekolwiek obawy, że te kolumny zostaną omyłkowo zidentyfikowane jako możliwe
NULL
?Dwa problemy, o których mogłem pomyśleć, to:
- Wszelkie obiekty aplikacji odwzorowane na widok sald otrzymują niepoprawną definicję salda.
- W bardzo ograniczonych przypadkach niektóre optymalizacje nie są dostępne dla Optymalizatora zapytań, ponieważ nie ma gwarancji z widoku, że te dwie kolumny są
NOT NULL
.
Czy któraś z tych kwestii jest ważna? Czy są jeszcze jakieś obawy, o których powinienem pamiętać?