Performance Azure SQL分片不';t刻度如预期

Performance Azure SQL分片不';t刻度如预期,performance,azure,Performance,Azure,我有一个使用Azure SQL为Azure云服务开发的web应用程序。我从一个数据库开始,使用JMeter在同一Azure数据中心的专用虚拟机上运行负载测试。测试计划设置为只测试一个页面,并且只发布到该页面(忽略初始get请求) 我的目标是确定应用程序每秒可以处理的最大数据库事务数。使用此测试计划,我的第一系列测试平均产生300个req/s 相关页面正在访问下表: create table [dbo].[Entries] ( [Id] int

我有一个使用Azure SQL为Azure云服务开发的web应用程序。我从一个数据库开始,使用JMeter在同一Azure数据中心的专用虚拟机上运行负载测试。测试计划设置为只测试一个页面,并且只发布到该页面(忽略初始get请求)

我的目标是确定应用程序每秒可以处理的最大数据库事务数。使用此测试计划,我的第一系列测试平均产生300个req/s

相关页面正在访问下表:

create table [dbo].[Entries]
(
    [Id]                   int                 not null        identity(1,1)
    /* other columns here, about 10 in total */ 
);

alter table [dbo].[Entries] add constraint [PK_Entries] primary key ([Id]);
alter table [dbo].[Entries] add constraint [DF_Entries_Created] default(getutcdate()) for [Created];

create index [IX_Entries_EmailAddress] on [dbo].[Entries] ([EmailAddress]);
create index [IX_Entries_NACSZ] on [dbo].[Entries] 
(
     [FirstName]
    ,[LastName]
    ,[Address1]
    ,[City]
    ,[State]
    ,[Postal]
);
该页仅执行两个查询:

select 1 where exists 
(
    select 1 from Entries
     where EmailAddress = @EmailAddress
        or (
                    FirstName       = @FirstNAme
                and LastName        = @LastName
                and Address1        = @Address1
                and City            = @City
                and State           = @State
                and Postal          = @Postal
           ) 
);

在我的机器上进行性能测试(四核、8GB ram、本地SQL 2012 express安装)可以产生高达800个请求/秒的性能,因此我非常震惊地看到Azure服务器上的峰值约为300个请求/秒。我将这归因于数据库服务器上的资源争用,并添加了支持分片的必要代码。分片机制在其中一个关键字段上使用一致的散列来确定要使用的连接字符串(目前有三种可能)。这里的目标是在3个Azure SQL数据库之间分配数据库负载,并提高应用程序的并发性

我已经验证了切分机制是否有效(每个数据库中的条目数量大致相同),并且已经从页面中删除了所有不必要的代码,因此所发生的只是上面提到的两个查询。我在事务上使用默认隔离级别(readcommitted)。最终代码如下所示:

using (var db = ConnectToShard(keyToHash))
using (var tx = db.BeginTransaction(IsolationLevel.ReadCommitted))
{
    // execute query 1
    // if result from query 1 is null, 
    //     execute query 2

    tx.Commit();
}

然而,即使有这么多额外的工作,我似乎也无法将每秒的请求数推到500左右。我的理想目标是1000人。我想我在Azure SQL性能方面遗漏了一些东西,但我不确定是什么。有没有改进每秒请求的想法或建议?

只是出于兴趣,您在哪里运行代码?在Azure虚拟机上?它有多大?Azure云服务已经尝试了中小型实例。在我发布这篇文章后不久,昨晚我实际上获得了非常高的数字(1250 req/sec,使用8个小实例或2个中实例),但时间太晚了,我不确定到底发生了什么变化。如果Azure SQL数据库的性能下降(可能是与吵闹的租户共享),它只能通过一个新连接交换到另一个实例,所以只需要在短时间内保持连接是值得的——如果这有帮助的话?我以前使用过PetaPoco,现在直接使用SqlConnection。我认为PetaPoco代码中有某种东西导致了这个问题,但我无法确定。
using (var db = ConnectToShard(keyToHash))
using (var tx = db.BeginTransaction(IsolationLevel.ReadCommitted))
{
    // execute query 1
    // if result from query 1 is null, 
    //     execute query 2

    tx.Commit();
}