我有一个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吗? 如果可能,如何在输入参数中使用我的数据表?
答案 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).aspx,http://blogs.msdn.com/b/sqlcat/archive/2013/09/23/maximizing-throughput-with-tvp.aspx)来将处理逻辑转移到客户端节点。
希望这会有所帮助 - Srini Acharya