我有一个SQL数据库,包含从Yahoo!下载的股票栏。我正在尝试创建一些指标来分析这些股票(即简单移动平均线)。我关心的是我的查询的性能,它只是UPDATE @stockname SET SMA = @value WHERE id = @n
。要更新2000行,需要2分钟。我尝试使用存储过程,但结果几乎相同。
for (int i = 0; i < closing_prices.Count - length; i++)
{
double signalValue signalValue = Selector.SignalProcessor(Signal,
closing_prices.GetRange(i, length), length);
//Write the value into the database
string location = Convert.ToString(i + length + 1);
this.UpdateWithSingleCondition("_" + Instrument, columnName,
signalValue.ToString(), "id", location, "=", sql_Connection);
}
每次生成新值时,此循环都会调用存储过程来更新列SMA。是否有可能将整个列直接放入数据库?我认为这可以节省时间。无论如何,在2分钟内更新500行听起来非常慢。
你能告诉我如何改善查询的执行时间吗?
答案 0 :(得分:1)
您可以使用带有table valued parameters的存储过程来将数据从应用程序发送到数据库中,然后将MERGE数据发送到您的{{3}},而不是一次写出一个值。表,节省了很多往返。
答案 1 :(得分:1)
分析您的表现。你必须有一些瓶颈。您的更新计数非常低。您应该可以轻松地每秒进行10-30次更新,这将在2分钟内转化为更多....这是在股票计算机上,甚至不值得数据库(这意味着许多快速光盘)。
在sql server上进行性能分析,找出问题所在。你需要所有指数吗?
答案 2 :(得分:0)
首先禁用外键约束。然后再次启用它们:
禁用“ALTER TABLE”“WITH NOCHECK CONSTRAINT ALL”
为了使他们能够使用“ALTER TABLE”和“WITH CHECK” 约束所有“。
答案 3 :(得分:0)
我会创建一个接收字符串的存储过程。此字符串是XML或delimeted字符串。
然后使用浮动的许多字符串到表格函数之一
并将字符串转换为临时表。
然后执行从temp到目标表的插入。
这样您就可以拨打一次DB服务器并避免聊天。它比多次通话快得多。
避免使用表参数,因为你无法从代码中调用em。