我在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
在视图-able列。
我看了几个讨论,其中最相关的讨论表明一些功能改组可以帮助SQL Server识别视图列始终为NOT NULL
。不过,在我的情况下,这样的改组是不可能的,因为在索引视图中不允许使用聚合函数的表达式(例如ISNULL()
over SUM()
)。
有什么方法可以帮助SQL Server识别
balance_amount
并且transaction_count
可以NOT NULL
?如果不是,我是否应该担心这些列被错误地标识为
NULL
-able?我能想到的两个问题是:
- 映射到余额视图的所有应用程序对象都获得了错误的余额定义。
- 在非常有限的情况下,某些优化不适用于Query Optimizer,因为从视图的角度来看无法保证这两个列都是
NOT NULL
。
这些担忧中有什么大不了的吗?我还有其他需要注意的问题吗?