У мене є такий індексований вигляд, визначений у SQL Server 2008 (ви можете завантажити робочу схему з gist для тестування):
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
і transaction_amount
всі вони визначені як NOT NULL
стовпці в dbo.transactions
. Однак, коли я переглядаю визначення перегляду в Object Explorer, він позначає як balance_amount
і transaction_count
як NULL
стовпці стовпців у поданні.
Я прийняв поглянути на кілька дискусій, це один є найбільш важливим з них, які припускають деяку перестановку функцій може допомогти SQL Server визнати , що стовпець вид завжди NOT NULL
. У моєму випадку таке переміщення неможливо, оскільки вирази на сукупних функціях (наприклад, ISNULL()
над SUM()
) не допускаються в індексованих видах.
Чи я можу допомогти SQL Server розпізнати це
balance_amount
таtransaction_count
єNOT NULL
дієвим?Якщо ні, чи слід сумніватися, що ці стовпці помилково визначені як
NULL
-able?Дві проблеми, про які я міг би придумати:
- Будь-які об’єкти програми, відображені на подання балансів, отримують неправильне визначення балансу.
- У дуже обмежених випадках певні оптимізації недоступні Оптимізатору запитів, оскільки він не має гарантії з точки зору того, що ці два стовпці є
NOT NULL
.
Чи є одна з цих проблем великою справою? Чи є якісь проблеми, які я маю пам’ятати?