スキーマを持つ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