web-dev-qa-db-ja.com

計算列またはトリガー

現在、oninsert()トリガーの設定があり、行がテーブルに挿入されるたびに、更新クエリが発行されて3つのフィールドを更新します。フィールドは次のような単純な計算です

field1update = (amt/12)*14
field2update = (amt/12)*16
field3update = (amt/12)*18

トリガーは適切ですが、行をロックして、すぐにアクセスできない場合があります。私の質問は、これらのフィールドが(無知ですが)計算された列または計算された列に変換された場合、パフォーマンスが向上するのでしょうか?

通常、これはスプレッドシートのインポートであり、一度に約20,000〜25,000行が挿入されます。

4
user2676140

あなたが提供した情報に基づいて、私は非常に基本的なテストを行ったので、最終的な決定を下す前に、同様のものをセットアップすることをお勧めします。私の結果は、計算列がトリガーよりも優れたパフォーマンスを発揮することを示していますが、テーブル構造、挿入率、テーブル内の他のアクティビティによって変化する可能性があることを強調したいので、テストする必要があります。

セットアップ:

CREATE TABLE TestTrigger
(
    amt INT NOT NULL,
    field1update INT,
    field2update INT,
    field3update INT
 )
 GO

CREATE TRIGGER triTestTrigger on TestTrigger
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO TestTrigger
       SELECT amt, (amt/12)*14, (amt/12)*16,(amt/12)*18
       FROM inserted
END
GO

CREATE TABLE TestCompCol
(
    amt INT NOT NULL,
    field1update AS (amt/12)*14,
    field2update AS (amt/12)*16,
    field3update AS (amt/12)*18
 )
 GO

両方のテーブルに挿入します。

 INSERT INTO TestTrigger 
 (amt)
 VALUES(1)
 GO
 INSERT INTO TestCompCol
 (amt)
 VALUES(1)
 GO

最初の(トリガー)挿入は、2番目の(計算列)挿入(30%)と比較して、より多くの作業(70%)を行う必要があります。最初の挿入(.010023 + .0132842)= 0.0233072のサブツリーコストを見ると、2番目の挿入は.0100022です。

enter image description here

トリガー挿入のCPU時間については、

SQL Server実行時間:CPU時間= 0 ms、経過時間= 90 ms。

計算された列の挿入の場合、次のようになります。

SQL Server実行時間:CPU時間= 0ミリ秒、経過時間= 2ミリ秒。

6
SqlWorldWide