对于这种情况,为什么SQL Azure数据库在Web和新的高级版本上的性能差异如此之大

对于这种情况,为什么SQL Azure数据库在Web和新的高级版本上的性能差异如此之大,sql,sql-server,database,azure,database-performance,Sql,Sql Server,Database,Azure,Database Performance,我们正在将一个网站迁移到SQLAzure,并发现在当前托管和Azure数据库之间存在非常显著的性能差异 明确地说,存储过程代码编写得很差,可以修复,但我想了解的是性能差异背后的原因 下面是导致问题的过程中的错误代码 declare @curPinNumber int set @curPinNumber = 183843692 declare @pinNumber int set @pinNumber = 0 while @pinNumber < 10000 begin set @

我们正在将一个网站迁移到SQLAzure,并发现在当前托管和Azure数据库之间存在非常显著的性能差异

明确地说,存储过程代码编写得很差,可以修复,但我想了解的是性能差异背后的原因

下面是导致问题的过程中的错误代码

declare @curPinNumber int
set @curPinNumber = 183843692

declare @pinNumber int
set @pinNumber = 0
while @pinNumber < 10000
begin
    set @curPinNumber = @curPinNumber + 1
    insert into PinNumbers(pinNumber, pinNumberText, whenLastUsed, siteID) 
    values(@curPinNumber, right('0000' + cast(@pinNumber as varchar), 4), '1970-01-01', 999)
    set @pinNumber = @pinNumber + 1     
end
declare@curPinNumber int
设置@curPinNumber=183843692
声明@pinNumber int
设置为@pinNumber=0
而@pinNumber<10000
开始
设置@curPinNumber=@curPinNumber+1
插入到PinNumbers(pinNumber、pinNumberText、使用时、站点ID)
值(@curPinNumber,right('0000')+cast(@pinNumber作为varchar),4),'1970-01-01',999)
设置@pinNumber=@pinNumber+1
结束
以下是程序的测试结果

azure sql数据库web版
  • 跑步#1:41秒
  • 跑步#2:37秒
  • 跑步#3:37秒
标准版s1(15个DTU-MS已经制造了s1 20个DTU)
  • 跑步#1:3分44秒
  • 跑步#2:3分41秒
  • 跑步#3分42秒
标准版s2 50 DTU(不是错误-所有都非常一致)
  • 跑#1分51秒
  • 跑2分51秒
  • 跑3分51秒
高级版P1(100个DTU)
  • 跑步#1:56秒
  • 跑步#2:55秒
  • 跑步#3:55秒
高级版P2(200 DTU)
  • 跑步#1:33秒
  • 跑步#2:33秒
  • 跑步#3:34秒
*下面的两个虚拟机有单独的日志和数据磁盘

虚拟机上的sql(基本、1核、1.75gb ram.sql企业核心edn)
  • 跑步#1:53秒
  • 跑步#2:50秒
  • 跑步#3:51秒
虚拟机上的sql(基本、2核、3.5gb ram.sql企业核心edn)
  • 跑步#1:49秒
  • 跑步#2:50秒
  • 跑步#3:51秒
我的台式电脑
  • 跑步#1:3.7秒
  • 跑步#2分3.1秒
  • 跑步#3:3.1秒
当前主机(具有7年历史的设备)
  • 跑步#1:6.1秒
  • 跑步#2:6.0秒
  • 跑步#3:6.0秒
因此,我在此假设的一个关键因素是正在发生的日志记录和日志刷新,可能是预写事务日志记录

添加一个
BEGIN/COMMIT-TRAN
块或从现有的10000行预设表加入,在sql azure的web版上,性能确实可以恢复到1-2秒,在我的本地计算机上甚至更快

我希望Azure与我的桌面或旧主机处于类似的性能区域


我的问题是为什么Azure上的差异如此放大?我试图判断这是否只是我们在测试过程中偶然发现的一个极端情况,最重要的是,我们在迁移过程中应该注意哪些事情。

这很可能是因为发出批处理的机器和数据库服务之间的通信。请尝试在批处理中的第一个上发出SET-NOCOUNT,以关闭将受行影响的通知发送回客户端。

我可能错了,但我认为SQL Server许可证阻止您发布基准测试。@csharpsrocks我显然不知道有任何此类限制,但如果需要,很高兴将其删除。事实上,我给MS发了一封电子邮件,其中有一个链接指向这篇文章,希望得到反馈。我相信如果有问题,他们会联系的。这篇文章对我们很有帮助,谢谢。我们最后对Azure业务与S1、S2、P1层进行了类似的比较。结果:这也是我的想法。不清楚为什么“当前托管”如此之快。此外,添加显式事务后的性能增加是无法解释的。@user3657526实际设置NOCOUNT ON实际上已启用。当我在azure数据库上测试这个时,我正在使用来自的企业管理工具运行这个过程。在虚拟机上进行测试时,我使用管理工具远程访问虚拟机。