Ich habe die folgende indizierte Ansicht in SQL Server 2008 definiert (Sie können ein Arbeitsschema zu Testzwecken von gist herunterladen ):
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
und transaction_amount
sind alle als NOT NULL
Spalten in definiert dbo.transactions
. Aber wenn ich mir die Sichtdefinition in Management Studio Object Explorer, es Markierungen sowohl balance_amount
und transaction_count
als NULL
-able Spalten in der Ansicht.
Ich habe mir mehrere Diskussionen angesehen, von denen diese die relevanteste ist. Diese weisen darauf hin, dass durch das Mischen von Funktionen SQL Server möglicherweise erkennt, dass eine Ansichtsspalte immer vorhanden ist NOT NULL
. In meinem Fall ist ein solches Mischen jedoch nicht möglich, da Ausdrücke für Aggregatfunktionen (z. B. ein ISNULL()
Over-Over SUM()
) in indizierten Ansichten nicht zulässig sind .
Gibt es eine Möglichkeit, SQL Server erkennen , dass helfen kann ,
balance_amount
undtransaction_count
sindNOT NULL
-able?Wenn nicht, sollte ich Bedenken haben, dass diese Spalten fälschlicherweise als
NULL
-able identifiziert werden ?Die zwei Bedenken, an die ich denken könnte, sind:
- Alle Anwendungsobjekte, die der Saldenansicht zugeordnet sind, erhalten eine falsche Definition einer Bilanz.
- In sehr begrenzten Fällen stehen dem Abfrageoptimierer bestimmte Optimierungen nicht zur Verfügung, da aus der Sicht dieser beiden Spalten keine Garantie besteht
NOT NULL
.
Ist eines dieser Probleme eine große Sache? Gibt es noch andere Bedenken, die ich berücksichtigen sollte?