调用存储过程时的性能问题

时间:2015-06-30 14:50:37

标签: sql azure stored-procedures azure-sql-database

我有一个Azure级别为P1的SQL数据库。我遇到了性能问题。

在我的一个处理过程中,我调用了一个存储过程: - 在输入时,我需要有大量数据,我使用NVARCHAR(MAX)。我的字符串包含4000个字符。 - 在这个过程中,我做了几个处理:拆分字符串然后访问数据库并插入数据库。

我有很多数据,我多次调用该程序(因为限制为4000个字符)。这个程序在30分钟内每分钟调用大约70次。

我注意到数据库的DTU总是接近100%。

问题的任何想法以及如何解决它?

第一个答案后的更多细节。

我编辑了DTU图表并添加了新资源; CPU也是100%,如果我理解正确,它可以处理我的输入字符串。

我开始使用表值参数,但我不确定如何正确使用它。

我创建了我的表:

 CREATE TYPE Data AS TABLE
    (
    Idx smallint Primary Key IDENTITY(1,1),
    Name VARCHAR(50),
    Date VARCHAR(50) ,
    .....
    );
    GO

我在我的程序的输入参数中添加了这个表:

CREATE PROCEDURE [dbo].[sp_process_data]
    @Id INT,
    @initial BIT,
    @Data Data READONLY
AS

我想要的是,在我的C#代码中填写此表并将其存储在我的存储过程的输入中。 但是,当我更新我的edmx模型时,数据表就不存在了。

目前,我将此程序称为:

 var resultSet = context.sp_process_data(Id, initial).Single();
    return resultSet.ListId;

在Srini Acharya提出的链接中,我可以看到使用SqlCommand。

我可以保留我的实现并在我的程序输出中有一个ObjectResult吗? 如果可能,如何在输入参数中使用我的数据表?

1 个答案:

答案 0 :(得分:3)

您可以在Azure门户中编辑DTU图表,以将其他资源维度(CPU,IO,日志)添加到图表中,以查看这些资源在其限制内消耗了哪些资源。 DTU只是任何给定时间间隔内CPU,IO和LogIO消耗的最大值。如果您达到CPU限制,则可能需要改进存储过程中的字符串处理逻辑。如果您达到了IO / LogIO限制,那么您将拥有比P1级别可支持的插入更多的插入。在任何一种情况下,您都有几个选项

1)将数据库提升到P2级别以获得更多CPU和IO资源。这是一个简单的在线操作。然而,这具有更高的成本影响

2)调整应用程序以减少资源消耗。这非常适合您的应用程序逻辑。如果CPU是瓶颈,您可能希望使用表值参数(https://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspxhttp://blogs.msdn.com/b/sqlcat/archive/2013/09/23/maximizing-throughput-with-tvp.aspx)来将处理逻辑转移到客户端节点。

希望这会有所帮助 - Srini Acharya