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

chr*_*isb 13 azure sqlperformance azure-sql-database

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

select count(id) from mytable
Run Code Online (Sandbox Code Playgroud)

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

我也运行了一个:

ALTER INDEX ALL ON mytable REBUILD
Run Code Online (Sandbox Code Playgroud)

在数据库中的所有表上.

如果有人能指出我试图诊断/解决这个问题,我将不胜感激.

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

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

在此输入图像描述

更新2:这就是我做的时候统计信息的回复:

SET STATISTICS IO ON
SET STATISTICS TIME ON
select count(id) from TABLE
Run Code Online (Sandbox Code Playgroud)

统计:

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.
Run Code Online (Sandbox Code Playgroud)

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

小智 10

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

在 Azure 中,索引和表扫描似乎在性能上受到了极大的影响,因此向WHERE查询添加“无用”以强制它在聚集索引上执行索引搜索会有所帮助。

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


pau*_*sm4 3

建议:尝试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
Run Code Online (Sandbox Code Playgroud)

  • 我在一个非常小的 500 MB 表上遇到了类似的问题 - 从本地 SQL Server VM 运行时,对该表进行全面扫描需要几毫秒,但在 Azure 中的 10 DTU 实例上,执行简单的 SELECT max(column )。“全表扫描不好”的神话仍然存在。如果我的工作负载是分析和聚合,则 SQL Azure 的性能明显不佳。它看起来确实是为可以轻松分片的 OLTP 工作负载而设计的。 (4认同)