Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;从“表格”中选择计数(id);在SQL Azure中计算最多需要30分钟_Azure_Azure Sql Database_Sqlperformance - Fatal编程技术网

&引用;从“表格”中选择计数(id);在SQL Azure中计算最多需要30分钟

&引用;从“表格”中选择计数(id);在SQL Azure中计算最多需要30分钟,azure,azure-sql-database,sqlperformance,Azure,Azure Sql Database,Sqlperformance,我在SQL Azure中有一个数据库,它不需要15到30分钟就可以完成一个简单的操作: select count(id) from mytable 数据库约为3.3GB,计数返回约2000000,但我已在本地尝试过,耗时不到5秒 我还运行了一个: ALTER INDEX ALL ON mytable REBUILD 在数据库中的所有表上 如果有人能告诉我一些事情来诊断/修复这个问题,我将不胜感激 (请跳到下面的更新3,因为我现在认为这是问题所在,但我仍然不理解它)。 更新1: 如下图所示,聚

我在SQL Azure中有一个数据库,它不需要15到30分钟就可以完成一个简单的操作:

select count(id) from mytable
数据库约为3.3GB,计数返回约2000000,但我已在本地尝试过,耗时不到5秒

我还运行了一个:

ALTER INDEX ALL ON mytable REBUILD
在数据库中的所有表上

如果有人能告诉我一些事情来诊断/修复这个问题,我将不胜感激

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

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

更新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限制而变慢了?

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

还有,你做过“解释计划”吗

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


谢谢你得到统计数字

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

可能的解决方法:改为查询系统表
行数


我意识到这很旧,但我也遇到了同样的问题。我有一个250万行的表,我从on-prem数据库导入Azure SQL并在S3级别运行。
Select Count(0)from table
导致执行时间为5-7分钟,而不是以毫秒为前提

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


在我的例子中,这执行了几乎相同的
从表中选择count(0),其中id>0
导致性能与本地查询匹配。

快速细化@FoggyDay post。如果您的表被分区,您将需要求和行数

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

select count(*)没有帮助-实际上,经过很长一段时间后,我得到“从服务器接收结果时发生传输级别错误。(提供程序:TCP提供程序,错误:0-信号量超时时间已过期)。”我将很快检查您的其他观点。在查看计划后,我已经在上面给出了我的答案-似乎聚集索引扫描占用了所有时间。对于简单选择计数(id)来说,这真的需要这么长时间吗?感谢您获取统计信息。您正在对2M行进行完整的表扫描-这很糟糕。可能的解决方法:改为查询系统表“row_count”:感谢您的响应。问题是,这只是一个示例查询-但是如果我想执行“从表中选择count(id),其中列=1”之类的操作,该怎么办例如?它仍然很慢。这样一个简单的查询真的应该这么慢吗?对于SQL Server来说,200万行真的太多了,以至于需要10分钟以上吗?我需要手动添加新索引吗?我认为SQL Azure的部分好处是最低限度的管理。我在一个非常小的500 MB表上遇到过类似的问题-对此表进行完全扫描在本地从SQL Server VM运行时需要毫秒,但在Azure中的10 DTU实例上,执行简单的SELECT max(列)操作需要几分钟。“完整表扫描不好”的神话持续存在。如果我的工作负载是分析和聚合,SQL Azure的性能会明显不佳。它似乎真的是为可以轻松切分的OLTP工作负载而设计的。您是否检查过以确保没有死锁?没有正式的死锁,但我非常确定没有死锁-我已关闭任何更新,因此我的查询是唯一应该执行的操作问:你解决过你的Azure性能问题吗?@FoggyDay还没有,我想我已经缩小了范围,这与我对DTU的理解有关,但需要找时间进一步调查。我不明白如何简单地计算(id)可以最大化我的配额,所以我一定错过了一些东西。主要的答案是DTU是一个糟糕的指标,因为有些查询是IO绑定的,有些是CPU绑定的,而DTU是一些黑盒“混合”两者都有。升级到更高的性能层,但即使这样,您也可能会受到限制…这似乎是MS的设计选择-它是关于小型事务,而不是聚合或分析。哇。这对我也很有用。我有一个相当复杂的查询,其中包含一个子查询。当我添加“无用”时子查询的where子句在Azure上从22秒变为1秒,在本地从600ms变为160ms。但是,这是一个我可以控制的查询。我的应用程序也使用EF,这使我有足够的不确定性,可以考虑移回VM。我有一个计数查询,它已经使用了非聚集索引,并且需要20秒来计数1m行,请尝试你的建议添加虚拟PK条件,但没有运气。。。
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