У меня есть следующее индексированное представление, определенное в 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
. Однако когда я смотрю на определение представления в обозревателе объектов Management Studio, оно помечает столбцы как balance_amount
и transaction_count
как NULL
доступные в представлении.
Я принял взглянуть на несколько дискуссий, это один является наиболее важным из них, которые предполагают некоторую перестановку функций может помочь SQL Server признать , что столбец вид всегда NOT NULL
. Однако в моем случае такая перетасовка невозможна, так как выражения в агрегатных функциях (например, ISNULL()
над over SUM()
) не допускаются в индексированных представлениях.
Можно ли как-то помочь SQL Server распознать это
balance_amount
иtransaction_count
можноNOT NULL
ли?Если нет, следует ли мне
NULL
опасаться, что эти столбцы ошибочно определены как -able?Две проблемы, о которых я мог подумать:
- Любые объекты приложения, сопоставленные с представлением сальдо, получают неверное определение сальдо.
- В очень ограниченных случаях определенные оптимизации не доступны Оптимизатору запросов, так как он не имеет гарантии, исходя из того, что эти два столбца доступны
NOT NULL
.
Является ли что-то из этого серьезным? Есть ли еще какие-то проблемы, которые я должен иметь в виду?