提高更新SQL查询性能

时间:2011-03-29 10:50:16

标签: sql sql-server tsql

我有一个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行听起来非常慢。

你能告诉我如何改善查询的执行时间吗?

4 个答案:

答案 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。