我正在用c构建电子商务系统。 10000个产品,每个有15个品种,每个都有独特的价格来匹配,所以c。 150,000产品价格。价格每天都有所不同,这些价格以CSV格式发送给我们,我们自动进口以重新编写新价格的整个数据库表,因为95%以上的价格每天都在变化。由于这个数字,我们在每个价格上都有一个标志,表明该价格是否是网站上可见的价格。
我们导入后,昨天在网站上的价格(因此被标记为可见),以及新的但未在网站上的价格在C#控制台行程序中切换了它们的标志,使用此LINQ命令: -
db.Database.ExecuteSqlCommand("UPDATE [MyDatabase].[dbo].[ProductVariationPrice] SET IsVisible = IsVisible ^ 1");
所以标记为IsVisible的所有内容现在都不可见,反之亦然。即使对于300,000行,这也只需不到一秒,然后我们删除设置为IsVisible = 1的行范围。
在此之前,我们使用BulkInsert快速插入行,并使用LINQ' RemoveRange
删除要删除的不可见项。
最初这很好,但我现在正在吸引电子商务网站上的用户,等待操作时间超时'数据标志切换的确切时间段内的错误以及旧数据被删除。
如何在此期间停止此等待操作超时?我被告知我们不能做的事情: -
有人可以提供建议吗?是保持数据库连接打开更长时间的情况吗?
提前致谢!
更新 以下是瓶颈的完整代码: -
using (TransactionScope transaction = new TransactionScope())
{
db.Database.ExecuteSqlCommand("UPDATE [MyDatabase].[dbo].[ProductVariationPrice] SET IsVisible = IsVisible ^ 1");
transaction.Complete();
}
List<ProductVariationPrice> oldProductPrices = db.ProductVariationPrices.Where(x => !x.IsVisible).ToList();
db.ProductVariationPrices.RemoveRange(oldProductPrices);
db.SaveChanges();
答案 0 :(得分:0)
改变你的方法。您不需要删除记录,然后再次插入记录。插入操作的成本不低于更新(实际上它取决于多个因素)。从C#代码更新记录的已经被禁止的想法是可怕的。相反,这样做:
Import the CSV file to additional, working table in the database.
不要忘记添加主键。如果您不需要事务登录更新,请使用TRUNCATE,或者只是DROP并重新创建工作表。这将比DELETE行快得多。另请考虑使用TEMPORARY表。
Write a query to update the records in the original table by joining the records in the working/TEMPORARY table you just imported.
就是这样。
当然,您可以根据自己的情况使用IsVisible
旗帜,但我认为不再需要它了。