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#中。 這些也需要很少的時間來運行。
表1包含大約140,000行, 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分鐘以上。
有關如何縮短更新表所需時間的想法?
謝謝。
我建議你把你的代碼放在http://codereview.stackexchange.com/ – HatSoft
是他們在表的列上的任何索引? – rshetye
什麼是ServerConnection的服務器,我的意思是第三方代碼,也需要使用語句 – HatSoft