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
と-able列transaction_count
としてマークさNULL
れています。
私はいくつかのディスカッションを調べましたが、これはそれらの中で最も関連性が高く、SQL Serverがビュー列が常にであることをSQL Serverが認識するのに役立つ可能性のある関数のシャッフルを示唆していますNOT NULL
。ただし、インデックス付きビューでは集約関数の式(たとえば、ISNULL()
over SUM()
)は許可されていないため、私の場合、そのようなシャッフルは不可能です。
SQL Serverはそれを認識し、私は助けることができる任意の方法がある
balance_amount
とtransaction_count
しているNOT NULL
-ableは?そうでない場合、これらの列が誤って
NULL
-able と識別されることについて心配する必要がありますか?私が考えることができる2つの懸念は次のとおりです。
- 残高ビューにマップされたアプリケーションオブジェクトは、残高の定義が正しくありません。
- 非常に限られたケースでは、これらの2つの列がであるというビューからの保証がないため、クエリオプティマイザーは特定の最適化を利用できません
NOT NULL
。
これらの懸念のいずれかは大きな問題ですか?他に覚えておくべき懸念はありますか?