インデックス ビュー
インデックス ビュー 可能です。
インデックス付きビューは、クラスター化されたインデックスを持つビューであり、データは実際にはディスクに保存されます。
私が理解しているように、あなたは tblProduct
に保存されている製品アイテムごとの購入の合計を維持しようとしています . ItemCode
と仮定しました は tblProduct の PK であり、その ItemName
も定義されています (MAX
は使用できません) インデックス付きビューで)。したがって、次のようなビューを定義できます:
CREATE VIEW dbo.vwTotalPurchases
WITH SCHEMABINDING -- must be schema bound, we cannot change underlying columns after creation
AS
SELECT
ItemCode,
SUM(Quantity) QuantityPurchased,
COUNT_BIG(*) CountPurchases -- if we group, must have count also, so that rows can be maintained
FROM dbo.tblPurchase -- must use two-part names
GROUP BY itemCode;
GO
次に、その上にクラスター化インデックスを作成して、ディスク上に永続化できます。 SQL Server は、ベース テーブルが更新されるたびにインデックスを維持します。グループ内にそれ以上行がない場合 (count が 0 であることで識別される)、その行は削除されます:
CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO
クエリを実行する場合は、このビューを tblProducts
に結合したままにすることができます (購入がない可能性があるため、参加をやめました):
SELECT
p.ItemCode,
p.ItemName,
ISNULL(tp.QuantityPurchased, 0) QuantityPurchased,
ISNULL(tp.CountPurchases, 0) CountPurchases
FROM tblProducts p
LEFT JOIN vwTotalPurchases tp WITH (NOEXPAND) ON tp.ItemCode = p.ItemCode;
これをビューとして定義することもできます (インデックス付きビューではなく、標準ビュー) ので、定義はどこでも使用できます。
NOEXPAND
に関する注意 :
SQL Server Enterprise Edition または Developer Edition を使用していない場合は、ヒント WITH (NOEXPAND)
を使用する必要があります。 強制的にインデックスを使用するか、それ以外の場合はベースの tblPurchase
を照会します 代わりは。そしてそれらのエディションでも、 NOEXPAND
を使用するのが最善です .
こちらの記事 をご覧ください これについてはポール・ホワイトによる。