У мене є такий індексований вигляд, визначений у 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.
Чи є одна з цих проблем великою справою? Чи є якісь проблеми, які я маю пам’ятати?
