Tengo la siguiente vista indizada definida en SQL Server 2008 (puede descargar un esquema de trabajo de GIST para fines de prueba):
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
y transaction_amount
están todos definidos como NOT NULL
columnas en dbo.transactions
. Sin embargo, cuando miro a la definición de la vista en el objeto de estudio de la gerencia Explorer, ambas marcas balance_amount
y transaction_count
como NULL
columnas -able en la vista.
He echado un vistazo a varias discusiones, éste es el más relevante de ellos, que sugieren cierta redistribución de las funciones puede ayudar a SQL Server reconoce que una columna de vista es siempre NOT NULL
. Sin embargo, en este caso no es posible mezclar, ya que las expresiones en funciones agregadas (por ejemplo, un ISNULL()
sobre SUM()
) no están permitidas en las vistas indizadas.
¿Hay alguna manera de que pueda ayudar a SQL Server reconoce que
balance_amount
ytransaction_count
sonNOT NULL
-able?Si no es así, ¿debo preocuparme de que estas columnas se identifiquen erróneamente como
NULL
-able?Las dos preocupaciones que se me ocurren son:
- Los objetos de aplicación asignados a la vista de saldos obtienen una definición incorrecta de un saldo.
- En casos muy limitados, ciertas optimizaciones no están disponibles para el Optimizador de consultas, ya que no tiene una garantía desde el punto de vista de que estas dos columnas lo estén
NOT NULL
.
¿Alguna de estas preocupaciones es un gran problema? ¿Hay alguna otra preocupación que deba tener en cuenta?