【发布时间】:2014-09-27 09:05:16
【问题描述】:
这从this question 开始,但现在似乎更适合专门询问,因为我意识到这是一个与 DTU 相关的问题。
基本上,运行:
select count(id) from mytable
编辑:添加 where 子句似乎没有帮助。
运行需要 8 到 30 分钟(而在 SQL Server 的本地副本上执行相同的查询大约需要 4 秒)。
下面是我运行此查询时 Azure 门户中的 MONITOR 选项卡的屏幕截图。请注意,我在大约一周未接触数据库后执行此操作,Azure 报告我只使用了 1% 的 DTU。
一些额外的东西:
- 在此特定测试中,查询运行时间为 08:27。
- 在运行时,上图实际上显示 DTU 线在一段时间内处于 100%。
- 数据库配置为具有 S1 性能级别的标准服务层。
- 数据库大约 3.3GB,这是最大的表(计数返回大约 2,000,000)。
我很感激这可能只是我有限的理解,但如果有人能澄清这是否真的是预期的行为(即一个简单的计数需要很长时间才能运行并最大化我的 DTU),那将不胜感激。
【问题讨论】:
-
原始问题中的答案已经涵盖了发生的情况。 “简单”计数实际上是人为的、昂贵的并且必须扫描整个表。 不要那样做。如果您有一个使用索引字段的 WHERE 子句,则优化器将使用 Index Seek 操作,从而获得更好的性能。在计算总数之前,Seek 会读取索引 B-Tree 以找到匹配的行(即,IO 少得多,速度更快)。如果您使用具有高选择性的字段,您将不得不阅读更少的索引页。
-
只是 FTR,'简单' 计数不是人为的 - 这是我需要使用/不使用各种 where 子句的情况。
-
你有没有得到令人满意的答案,为什么会发生这种情况?我在 S2 (50 DTU) 上看到了同样的情况,它在一个 127GB 的数据库中使用了一个包含 5.5 亿行的表,并且 count(1) 需要将近一个小时。
-
我在批量导入这些数据时也看到了类似的情况。我使用了 freebcp 实用程序,速度非常低,大约每秒 5000 行。我把它写成了实用程序的低效率,但我现在检查了一下,批量插入也使 DTU 达到最大值。
-
这个 DTU 限制对我来说没有意义:您关于此主题的其他问题中的一个 cmets 表明 P1 类似于四核 12GB RAM 服务器,但 P1 只有 125 DTU - 一个因素2.5 从我所拥有的,这还不足以让计数达到应该在几秒钟的范围内。
标签: azure azure-sql-database sqlperformance