Saya memiliki tampilan indeks berikut yang didefinisikan dalam SQL Server 2008 (Anda dapat mengunduh skema kerja dari intisari untuk tujuan pengujian):
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
dan transaction_amount
semuanya didefinisikan sebagai NOT NULL
kolom dalam dbo.transactions
. Namun, ketika saya melihat definisi tampilan di Object Explorer Management Studio, itu menandai kedua balance_amount
dan transaction_count
sebagai NULL
-able kolom dalam tampilan.
Saya telah melihat beberapa diskusi, yang ini adalah yang paling relevan dari mereka, yang menyarankan beberapa pengocokan fungsi dapat membantu SQL Server mengenali bahwa kolom tampilan selalu NOT NULL
. Namun, tidak ada pengocokan seperti itu dalam kasus saya, karena ekspresi pada fungsi agregat (misalnya a ISNULL()
atas SUM()
) tidak diperbolehkan dalam tampilan yang diindeks.
Apakah ada cara saya dapat membantu SQL Server mengenali itu
balance_amount
dantransaction_count
dapatNOT NULL
digunakan?Jika tidak, haruskah saya memiliki keprihatinan tentang kolom-kolom ini yang secara keliru diidentifikasi sebagai
NULL
-able?Dua masalah yang bisa saya pikirkan adalah:
- Setiap objek aplikasi yang dipetakan ke tampilan saldo mendapatkan definisi saldo yang salah.
- Dalam kasus yang sangat terbatas, pengoptimalan tertentu tidak tersedia untuk Pengoptimal Kueri karena tidak memiliki jaminan dari pandangan bahwa kedua kolom ini
NOT NULL
.
Apakah salah satu dari masalah ini merupakan masalah besar? Apakah ada masalah lain yang harus saya ingat?