0

スキーマを持つ6つのフィールドテーブルで起動される単純なNO-OP CLRトリガーがあります。

 datetime (PK)
 char (PK)
 int (PK, FK)
 varchar(1)
 tinyint
 real

これは、合計 19 バイト/行が挿入されるはずです。

上記の FK は、スキーマを持つテーブルを指しています。

 int (PK)
 nchar(10)
 ncahr(10)
 nchar(10)
 nchar(10)

1000 行ごとに準備済みステートメントを使用してバッチ挿入を実行しています。約11秒の実行時間で挿入された150K行を取得しています。これは、~.24MB/s (150,000*19B / 11s) のスループットに相当します。なぜそんなに遅いのですか?私はディスクとさえ話していませんか?

送信を行うクライアント側のコードがはるかに高速であることを知っています。私がコメントアウトした場合:

 executeBatch()

クライアントでのメソッドは、5MB/s 以上になります。JDBC/ODBC 接続と SQL Server での処理がこれほど遅くなる原因は何ですか?

この場合、これは実際に SQL Server と JDBC/ODBC 接続から期待できるスループットですか?

- -編集 - -

実際の CLR コードは非常に単純で、文字通り空のメソッドです。

 public class Triggers
 {
     [SqlTrigger(Name = "InsertHook", Target = ConfigConstants.TABLE_NAME, Event =   "INSTEAD OF INSERT")]
     public static void InsertHook()
     {
       //empty
     }
 }

T-SQL ストアド プロシージャでの操作なし 合計測定時間: 3475297036ns または 3.475297036 秒 INSERT COUNT:150000 0.783276657MB/s 43165.47 行/秒

INSERTING NORMAL to SQL Server Total Measured Time was:4884190118ns or 4.884190118sec INSERT COUNT:150000 MB Sent:2.7179718017578125 0.556MB/s 30712.53 Rows/s

残念ながら、ここで作業しているスキーマを制御することはできません。FK 制約が 1 つあったとしても、これが SQL Server で実行できる最善の方法であることに、まだショックを受けていると思います。

要約すると、パフォーマンスをランク付けする必要がある場合。それはそのようになります:

1) トリガーの代わりに T-SQL NO-OP (最速) - 0.78MB/秒

2) 通常の挿入 - 0.56MB/s

3) トリガーの代わりに CLR NO-OP ストアド プロシージャ - .24MB/s

4

0 に答える 0