sql >> データベース >  >> RDS >> Sqlserver

tblPurchase および tblProductStock テーブルをドロップせずに保持するにはどうすればよいですか。 (テーブルと値の両方をドロップせずに永続的に保持する必要があります)

    インデックス ビュー

    インデックス ビュー 可能です。

    インデックス付きビューは、クラスター化されたインデックスを持つビューであり、データは実際にはディスクに保存されます。

    私が理解しているように、あなたは 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 を使用するのが最善です .

    こちらの記事 をご覧ください これについてはポール​​・ホワイトによる。




    1. ステートメントにUNION、INTERSECT、またはEXCEPT演算子が含まれている場合は、ORDER BY項目を選択リストに表示する必要があります(SQL Server)

    2. 明示的に注文してデッドロックを回避する

    3. qt+oracle接続の問題

    4. これらのメトリックを使用してSQLServerのパフォーマンスを測定していますか?