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_idi transaction_amountwszystkie są zdefiniowane jako NOT NULLkolumny w dbo.transactions. Jednak kiedy patrzę na definicji widoku w zarządzaniu Studio Object Explorer, to znaki obu balance_amounti transaction_countjak 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_amounti czytransaction_countmoż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ć?
