私はこのように設計されたSQLServerデータベースを持っています:
TableParameter
Id (int, PRIMARY KEY, IDENTITY)
Name1 (string)
Name2 (string, can be null)
Name3 (string, can be null)
Name4 (string, can be null)
TableValue
Iteration (int)
IdTableParameter (int, FOREIGN KEY)
Type (string)
Value (decimal)
だから、あなたが今理解したように、TableValue
にリンクされていTableParameter
ます。
TableParameter
多次元辞書のようなものです。
TableParameter
多くの行(300,000行以上)があるはずです
私のc#クライアントプログラムから、各Compute()
関数の後にこのデータベースに入力する必要があります:
for (int iteration = 0; iteration < 5000; iteration++)
{
Compute();
FillResultsInDatabase();
}
FillResultsInDatabase()
メソッドでは、私はする必要があります:
- パラメータのラベルがにすでに存在するかどうかを確認してください
TableParameter
。存在しない場合は、新しいものを挿入する必要があります。 - 値を挿入する必要があります
TableValue
ステップ1には時間がかかります!すべてのテーブルTableParameter
をIEnumerableプロパティにロードしてから、パラメーターごとに作成します。
.FirstOfDefault( x => x.Name1 == item.Name1 &&
x.Name2 == item.Name2 &&
x.Name3 == item.Name3 &&
x.Name4 == item.Name4 );
それがすでに存在するかどうかを検出するために(そしてIDを取得した後に)。
このようにパフォーマンスが非常に悪いです!
WHERE
のすべての行が読み込まれないようにするために、単語で選択しようとしましTableParameter
たが、パフォーマンスが低下します。
ステップ1のパフォーマンスを改善するにはどうすればよいですか?
ステップ2の場合、クラシックではパフォーマンスがまだ悪いINSERT
です。やってみSqlBulkCopy
ます。
ステップ2のパフォーマンスを改善するにはどうすればよいですか?
編集済み
ストアドプロシージャを試してみました:
CREATE PROCEDURE GetIdParameter
@Id int OUTPUT,
@Name1 nvarchar(50) = null,
@Name2 nvarchar(50) = null,
@Name3 nvarchar(50) = null
AS
SELECT TOP 1 @Id = Id FROM TableParameter
WHERE
TableParameter.Name1 = @Name1
AND
(@Name2 IS NULL OR TableParameter.Name2= @Name2)
AND
(@Name3 IS NULL OR TableParameter.Name3 = @Name3)
GO
CREATE PROCEDURE CreateValue
@Iteration int,
@Type nvarchar(50),
@Value decimal(32, 18),
@Name1 nvarchar(50) = null,
@Name2 nvarchar(50) = null,
@Name3 nvarchar(50) = null
AS
DECLARE @IdParameter int
EXEC GetIdParameter @IdParameter OUTPUT,
@Name1, @Name2, @Name3
IF @IdParameter IS NULL
BEGIN
INSERT TablePArameter (Name1, Name2, Name3)
VALUES
(@Name1, @Name2, @Name3)
SELECT @IdParameter= SCOPE_IDENTITY()
END
INSERT TableValue (Iteration, IdParamter, Type, Value)
VALUES
(@Iteration, @IdParameter, @Type, @Value)
GO
私はまだ同じパフォーマンスを持っています...:-((受け入れられません)