简单选择计数(id)使用100%的Azure SQL DTUs

简单选择计数(id)使用100%的Azure SQL DTUs

问题描述:

这开始为this question,但现在看起来更合适,因为我意识到这是一个DTU相关问题。简单选择计数(id)使用100%的Azure SQL DTUs

基本上,运行:

select count(id) from mytable 

编辑:添加一个条款似乎不能帮助。

正在运行8到30分钟之间(而在SQL Server的本地副本相同的查询需要大约4 )。

下面是我运行此查询时Azure门户中的MONITOR选项卡的屏幕截图。注意我在没有触及数据库大约一周后才做了此事,而Azure报告我仅使用了我的DTU的1%。

enter image description here

一对夫妇的多余的东西:

  • 在这个特殊的测试,查询了08:27S运行。
  • 当它运行时,上面的图表实际上显示了一段时间内的DTU线为100%。
  • 数据库配置了具有S1性能级别的标准服务层。
  • 该数据库大约3.3GB,这是最大的表(计数返回约2,000,000)。

我欣赏它可能只是我的理解有限,但如果有人能澄清,如果这是真的预期的行为(即简单的计数这么长时间运行,并刷爆我的DTU),这将是大加赞赏。

+0

在原来的问题的答案已经覆盖会发生什么。 “简单”计数实际上是人为设计的,价格昂贵,必须扫描整个表格。 *不要那样做*。如果您有一个使用索引字段的WHERE子句,优化器将使用索引查找操作,从而获得更好的性能。 seek在计算总数之前读取索引B-Tree以找到匹配的行(即远小于IO,更好的速度)。如果你使用高选择性的字段,你将不得不阅读更少的索引页面。 – 2014-10-07 08:40:51

+0

只是FTR,'简单'计数不是人为的 - 这是我需要做的/没有各种where子句。 – chrisb 2014-10-30 08:27:29

+0

你有没有得到一个令人满意的答案,为什么发生这种情况?我看到,在一个拥有5.5亿行单个表的127GB数据库上,S2(50 DTU)的功能与此相同,count(1)接近一个小时。 – 2017-06-02 21:02:47

SELECT COUNT

应执行聚集索引扫描(如果可用)和它的最新版本。 Azure SQL应自动更新统计信息,但如果它们完全过时,则不会自动重建索引。

如果在该表上有很多INSERT/UPDATE/DELETE流量我建议每隔一段时间手动重建索引。

http://blogs.msdn.com/b/dilkushp/archive/2013/07/28/fragmentation-in-sql-azure.aspx

和SO张贴更多信息

SQL Azure and Indexes

+0

谢谢,我一直在重建索引,我想我在使用链接到的MSDN文章中的SQL。此表似乎有一个0.2%碎片的CLUSTERED INDEX。 所以据我可以告诉这不是问题。 – chrisb 2014-10-07 08:35:28

+0

@chrisb您正在使用一个人为设计的例子,保证会导致昂贵的读取(IO方面)。它不代表真正的疑问。如果你甚至在'WHERE'子句中使用单个索引字段,性能将会快得多 – 2014-10-07 08:43:22

+0

@chrisb我认为这是我们需要查看统计和执行计划的地方。以下是如何打开它们的基本指南:http://www.solidq.com/tuning-sql-azure-databases-part-1/ – b0rg 2014-10-07 08:45:22

从您previous question查询统计数据,我们可以看到:

300ms CPU time 
8000 physical reads 

8:30大约是500秒。我们当然不受CPU限制。 500ms以上的300ms CPU几乎没有利用率。我们每秒获得16次物理读取。这远远低于任何物理磁盘所能提供的。此外,由于存在物理IO,该表格并未完全缓存。

我会说你被扼杀。每分钟

S1 corresponds

934交易事务的一些定义。这大约15转/秒。也许你每次交易只能达到一个物理IO的限制?! 15和16是可疑的相似的数字。

通过将实例升级到更高的比例因子来测试该理论。 You might find that SQL Azure Database cannot deliver the performance you want at an acceptable price.

您还应该发现,反复扫描的一半导致快速查询,因为分配的缓冲池似乎适合大部分表(不是全部)。

+0

感谢您的分析。我没有时间来验证这一点(如果/当我这样做,我会标记它是正确的),但我认为你可能就在这里 - 我只是感到惊讶,简单的计数......在哪里可以占用这么多的DTU。我对SQL Server的这方面并不是很有经验,但是很多人都知道这是一个非常昂贵的操作。 – chrisb 2014-10-27 12:06:10

+0

定义“昂贵”。它需要扫描表格(或其索引)。我认为这是有道理的,这会产生与表大小成正比的IO。它产生的CPU负载可以忽略不计。 – usr 2014-10-27 15:59:28

+0

我想我的意思是在DTU方面代价昂贵,这实质上就是您使用不同的Azure SQL级别支付的费用。 – chrisb 2014-10-28 19:25:07

我有同样的问题。与全扫描的表更新的统计数据解决它:

update statistics mytable with fullscan