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

标签 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 吗? 如果可能,如何在输入参数中包含我的数据表?

最佳答案

您可以在 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 )将处理逻辑转移到客户端节点。

希望这有帮助 ——斯里尼·阿查里亚

关于sql - 调用存储过程时的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31141606/

相关文章:

sql - 如何使用 SQL (SQL Server) 将数字列表转换为(临时)表

sql - Rails SQL 计数

java - 与 "azure-iot-sdk-java"; DeviceClient 实例的预期生命周期是多少

azure - 如何批量下载Azure Artifacts包?

php - 当存储过程插入语句具有重复的主键或不成功时,显示错误消息

c# - 使用 Linq-to-SQL 从存储过程中检索多个数据

php - Codeigniter 内部连接查询不起作用

Android OutOfMemory 问题

azure - 比较两个表以在 Azure 数据工厂中动态查找缺失的行

java - 我使用了cursor_loop : loop in sql stored procedure its not fetching all 15 rows it fetch one row only