"从表格#34中选择计数(id);在SQL Azure中计算最多需要30分钟

时间:2014-09-14 07:47:30

标签: azure azure-sql-database sqlperformance

我在SQL Azure中有一个数据库,在15到30分钟之间做一个简单的操作:

select count(id) from mytable

数据库大约3.3GB,计数返回大约2,000,000,但我已在本地尝试过,只需不到5秒!

我还跑了一个:

ALTER INDEX ALL ON mytable REBUILD

在数据库中的所有表格上。

如果有人可以指点我尝试诊断/解决这个问题,我将不胜感激。

(请跳到下面的更新3,因为我现在认为这是问题,但我仍然不明白)。

更新1: 在聚集索引扫描中似乎需要99%的时间,如下图所示。我有

enter image description here

更新2:这就是统计信息回传时的情况:

SET STATISTICS IO ON
SET STATISTICS TIME ON
select count(id) from TABLE

统计:

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 317037 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(1 row(s) affected)
Table 'TABLE'. Scan count 1, logical reads 279492, physical reads 8220, read-ahead reads 256018, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 297 ms,  elapsed time = 438004 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

更新3:好的 - 我现在有另一种理论。 Azure门户建议每次我测试这个简单的选择查询时,它将我的DTU百分比最大化到接近100%。我正在使用性能级别为S1(20 DTU)的标准Azure SQL实例。这个简单的查询是否可能因我的DTU限制而变慢?

3 个答案:

答案 0 :(得分:3)

我意识到这是旧的,但我遇到了同样的问题。我有一个 250万行的表,我从本地数据库导入Azure SQL并在S3级别运行。 Select Count(0) from Table导致执行时间为5-7分钟,而内部部署则为毫秒。

在Azure中,索引和表格扫描在性能方面似乎受到极大的损害,因此添加了一个无用的' WHERE强制它对聚簇索引执行索引查找的查询有帮助。

在我的情况下,这执行了几乎相同的Select count(0) from Table where id > 0,导致性能与内部部署查询匹配。

答案 1 :(得分:1)

建议:尝试select count(*):它实际上可能会改善响应时间:

另外,你有没有做过"解释计划"?

============更新============

感谢您获取统计信息。

您正在进行2M行的全表扫描 - 不太好:(

可能的解决方法:查询系统表row_count而不是:

http://blogs.msdn.com/b/arunrakwal/archive/2012/04/09/sql-azure-list-of-tables-with-record-count.aspx

select t.name ,s.row_count from sys.tables t
join sys.dm_db_partition_stats s
ON t.object_id = s.object_id
  and t.type_desc = 'USER_TABLE'
  and t.name not like '%dss%'
  and s.index_id = 1

答案 2 :(得分:0)

@FoggyDay帖子的快速改进。如果表已分区,则需要对行计数求和。

SELECT t.name, SUM(s.row_count) row_count
FROM sys.tables t
JOIN sys.dm_db_partition_stats s
ON t.object_id = s.object_id
  AND t.type_desc = 'USER_TABLE'
  AND t.name not like '%dss%'
  AND s.index_id = 1
GROUP BY t.name