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_idy transaction_amountestán todos definidos como NOT NULLcolumnas 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_amounty transaction_countcomo NULLcolumnas -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_amountytransaction_countsonNOT 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?
