SQL:
CREATE FUNCTION dbo.fnRandomForeNames ()
RETURNS VARCHAR(50)
AS
BEGIN
RETURN (
SELECT TOP 1 [FirstName]
FROM [tmp_ForeNames]
ORDER BY (SELECT new_id from GetNewID)
)
END
GO
dbo.fnRandomSurNames() などの同様の関数。
UPDATE Table1
SET firstname = dbo.fnRandomForeNames(),
lastname = dbo.fnRandomSurNames(),
address1 = dbo.fnRandomAddress1(),
address2 = dbo.fnRandomAddress2(),
address3 = dbo.fnRandomAddress3(),
birthdate = DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '1990-01-01')
私のC#コード:
private void RunThis(string connString, StreamReader sr)
{
sr.BaseStream.Position = 0;
string sqlQuery = sr.ReadToEnd();
using (SqlConnection connection = new SqlConnection(connString))
{
Server server = new Server(new ServerConnection(connection));
server.ConnectionContext.StatementTimeout = 4200;
server.ConnectionContext.ExecuteNonQuery(sqlQuery);
}
sr.Close();
}
.........
RunThis(e.Argument.ToString(), _updateClaim);
e.Argument.ToString()
接続文字列はどこにありますか。
スクリプトは以前に実行され、CREATE FUNCTION
実行にほとんど時間がかかりません。また、名前は tmp データベースに保存され、配列を介して C# に入力されます。これらも実行にほとんど時間がかかりません。
Table1 には約 140,000 行が含まれており、約 1 時間かかります。完了するまでに 14 分。
また、パラメーター化された SQL クエリを使用して、tmp テーブルと SQL 関数をスキップし、代わりに SQL クエリを作成して、次のようにコードから実行しようとしました。
UPDATE Table1
SET lastname = '{0}',
firstname = '{1}',
birthdate = DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '1990-01-01'),
address1 = '{2}',
address2 = '{3}',
address3 = '{4}'
WHERE u_id = '{6}'
そしていくつかのC#:
using (SqlConnection connection = new SqlConnection(connString))
{
connection.Open();
for (int i = 0; i < arraySize; ++i)
{
string updateString = string.Format(updateString2, GetRandomSurname(), GetRandomForeName(), GetRandomAddress1(), GetRandomAddress2(), GetRandomAddress3(), "", ids[i]);
SqlCommand cmd = new SqlCommand(updateString, connection);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
}
後者の方法も 14 分以上かかります。
テーブルの更新にかかる時間を短縮する方法についてのアイデアはありますか?
ありがとう。