为什么在SQLAzure上运行查询要慢得多?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我将我的数据库部署在SmarterAsp...

当我在SmarterAsp\MyDatabase,结果出现在2秒...

但是,在Azure\MyDatabase取走94秒...

我使用SQLServer2014ManagementStudio(试用版)连接到服务器并运行查询。

这是因为我的帐户是试用帐户,所以速度不同吗?

关于我的问题的一些相关信息

查询是:

ALTER procedure [dbo].[Pivot_Per_Day]
@iyear int,
@imonth int,
@iddepartment int

as

declare @columnName Nvarchar(max) = ''
declare @sql Nvarchar(max) =''

select @columnName += quotename(iDay) + ','
from (
        Select day(idate) as iDay
        from kpivalues where year(idate)=@iyear and month(idate)=@imonth
        group by idate
        )x

set @columnName=left(@columnName,len(@columnName)-1)

set @sql ='


Select * from (
select kpiname, target, ivalues, convert(decimal(18,2),day(idate)) as iDay   

from kpi

inner join kpivalues on kpivalues.idkpi=kpi.idkpi

inner join kpitarget on kpitarget.idkpi=kpi.idkpi

inner join departmentbscs on departmentbscs.idkpi=kpi.idkpi

where iddepartment='+convert(nvarchar(max),@iddepartment)+'

group by kpiname,target, ivalues,idate)x

pivot
(
     avg(ivalues)
    for iDay in (' + @columnName + ')
) p'

execute sp_executesql @sql

在3台不同的服务器上运行这个查询,在屏幕上显示支点表之前的运行时间给出了不同的结果:

蓝色--经过的时间=100.165秒

Smarterasp.net-经过的时间=2.449秒

LocalServer-经过的时间=1.716秒

关于我在Azure上的试用帐户,我的主要目标是在运行像上面这样的存储过程时,检查我是否会比Smarter有更好的速度。我选择我的数据库服务层-基本,性能水平-基本(5 DTU)和最大。尺寸2GB。

我的数据库有16个表,1个表有145284行,数据库大小为11 MB。这是我的应用程序的测试数据库。

我的问题是:

  1. 我能做些什么,来优化这个查询(Sp)?
  2. Azure推荐用于小型数据库(100 MB-1GB)吗?我是说性能和成本!

根据你们的投入得出的结论:

  • 我对查询做了建议的修改,性能提高了50%多个--谢谢你,雷姆斯。
  • 我在Azure S2上测试了我的查询,更新查询所用的时间是11秒。
  • 我再次测试了对P1的查询,经过的时间是0.5秒:)
  • 对SmarterASP的相同更新查询已经运行了0.8秒。

现在,我清楚地知道Azure中的层次是什么,有一个非常好的查询是多么重要(我甚至了解什么是索引,以及他的优势/劣势)。

谢谢大家

提问于
用户回答回答于

...
@iddepartment int
...
iddepartment='+convert(nvarchar(max),@iddepartment)+'
...

iddepartment列aint或者nvarchar是吗?为什么要用(max)?

以下是你应该做的事情:

  • 参数化@iddepartment在内部动态SQL中
  • 停止做nvarchar(max)转换。使...iddepartment@iddertment类型匹配
  • 确保索引在iddepartment所有idkpi

下面是如何参数化内部SQL:

set @sql =N'
Select * from (
select kpiname, target, ivalues, convert(decimal(18,2),day(idate)) as iDay   
from kpi
inner join kpivalues on kpivalues.idkpi=kpi.idkpi
inner join kpitarget on kpitarget.idkpi=kpi.idkpi
inner join departmentbscs on departmentbscs.idkpi=kpi.idkpi
where iddepartment=@iddepartment
group by kpiname,target, ivalues,idate)x
pivot
(
     avg(ivalues)
    for iDay in (' +@columnName + N')
) p'

execute sp_executesql @sql, N'@iddepartment INT', @iddepartment;

用户回答回答于

原来的问题也被修改为询问如何优化查询--这也是一个很好的问题。最初的问题是为什么不同这就是这个答案的意义。

单个查询的性能受到性能层的严重影响。我知道文档暗示层是关于负载的,严格来说不是这样的。

我将以S2数据库作为起点重新运行您的测试,并从那里开始。

试用订阅本身并不会影响性能,但是对于免费帐户,你可能使用的是B级别,它实际上不能被任何真实的东西所使用--当然,对于一个在本地运行需要2秒的查询来说不是这样。

即使在S1和S2之间移动,也会显示出单个查询的性能明显不同。如果你想做实验,一定要记住“一天中的任何一部分”都要收取一天的费用,这对于S级来说可能是可以的,但是在测试P级时要小心。

作为背景;当Azure去年引入新层时,他们更改了SQL的托管模型。过去,许多数据库都运行在共享sqlserver.exe上。在新模型中,每个数据库有效地获得了运行在资源受限沙箱中的sqlserver.exe。这就是他们控制“DTU使用”的方式,但也会影响一般性能。

扫码关注云+社区