Azure sql database SQL Azure on cloud运行查询的速度比SQL Server on premises慢,我可以做些什么来改进?

Azure sql database SQL Azure on cloud运行查询的速度比SQL Server on premises慢,我可以做些什么来改进?,azure-sql-database,Azure Sql Database,我需要检索一系列我应该跳过并获取的记录。然而,我在本地SQL Server和SQL Azure上都得到了运行结果,但时间相差悬殊。两个数据库都有相同的索引 例如,我有一个包含700万条记录的表,我有如下查询: 选择顶部(100)a.Time,a.SiteID FROM(选择a.Time,a.SiteID,row_number()OVER(按a.Time DESC排序)作为[Table]中的[row_number],其中a.SiteID=1111)作为WHERE row_number>632900

我需要检索一系列我应该跳过并获取的记录。然而,我在本地SQL Server和SQL Azure上都得到了运行结果,但时间相差悬殊。两个数据库都有相同的索引

例如,我有一个包含700万条记录的表,我有如下查询: 选择顶部(100)a.Time,a.SiteID FROM(选择a.Time,a.SiteID,row_number()OVER(按a.Time DESC排序)作为[Table]中的[row_number],其中a.SiteID=1111)作为WHERE row_number>632900

在SQLAzure中:它在30秒到1分钟内给出结果。 在SQL Server内部部署中:它几乎在实例时间内给出结果

我可以做些什么来提高SQL Azure上的执行时间

问候
Grace

根据计划,此查询需要读取至少632900条记录。如果没有合适的索引,可能需要读取和排序整个表

SQLAzure的内存非常有限。这通常会将工作负载从内存状态推到需要磁盘IO的状态。IO很容易比内存慢100倍,尤其是在Azure上使用严重节流的IO


优化查询以减少缓冲池内存需求。也许,您应该创建一个适当的索引。还考虑使用更有效的分页策略。例如,您可以按最后处理的
a.Time
值进行搜索,而不是按行号进行搜索。这样,所需的缓冲池内存很小,因为表访问从正确的位置开始。

您可以尝试使用重新写入查询。确保索引与ORDER BY中的列相匹配。SQL Server随后将使用优化的TOP运算符进行分页。检查有关偏移量获取的更多注意事项。

您使用的是哪个版本的sql azure?请查看性能层@Azure和内部部署的查询计划是否相同?在SQL Azure中,我使用的是“标准”,性能级别为S0(10DTU)。我检查了执行计划,在[Table].[PK_Table_1]的键查找(集群)中,云和本地都有相同的99%,这是[Table]列“ID”的主键这是一个独特的自动增量列。这就解释了速度慢的原因,因为对于标准S0层,您在on-prem中获得的资源必须远远高于在Azure中获得的资源。您可以尝试压缩表以减少要扫描的页面数(这会稍微增加CPU)。在应用程序中缓存结果,而不是每次查询。此外,您可能需要放大以比较性能增益。。如果您的数据库不在V12中,您可能需要升级以获得更好的性能,因为它使用的SSDI已经具有下面的索引,有什么想法吗在[Table]([SiteID]ASC,[Time]DESC)上创建非聚集索引[NonClusteredIndex-20141224-124138],在[PRIMARY]上使用(PAD_INDEX=OFF,STATISTICS_norecocomputer=OFF,SORT_IN_TEMPDB=OFF,DROP_EXISTING=OFF,ONLINE=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON),我已经找到了解决这个问题的方法。你说得对,我修改了索引,现在它运行得很快。索引在([SiteID]ASC,[Time]DESC)上,但是,当我更改为([SiteID]ASC,[Time]DESC)INCLUDE([ID]、[EmployeeID]、[JobCode])时,它现在相当快。谢谢,问题解决了。@GraceChan好的,太好了。不过,一旦数据集再次超过缓冲池大小,问题就会再次出现。Azure的内存非常有限,如果您不了解该限制,可能会导致性能突然下降10-100倍。