我设计了这样一个SQL Server数据库:C#代码和SQL Server的性能
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的性能?
EDITED
我试着存储过程:
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
我仍然有同样的性能... :-((不能接受)
好的。我要去测试它。但在这种情况下,我无法做一个SqlBulkCopy来提高插入的性能(步骤2)? – 2010-10-12 10:54:43
我需要在批量插入之前在数据库中获取我的参数的ID。 Compute()函数不会从数据库中获取任何数据。我无法在Compute()期间执行插入操作,因为我只在Compute()函数的结尾有结果。 – 2010-10-12 10:58:32
否我的意思是将数据传递给SP,如果数据存在,让我们解决。 – 2010-10-12 11:50:51