Azure SQL GeoReplication - 辅助数据库上的查询速度较慢

时间:2018-06-05 12:55:23

标签: sql-server azure-sql-database database-replication sql-execution-plan

我在Azure上使用地理复制设置了两个SQL数据库。主要在巴西,在西欧是次要。 同样,我有两个运行相同web api的Web应用程序。一个巴西网络应用程序,可以读取和写入巴西数据库和欧洲网络应用程序,该应用程序读取欧洲数据库并在巴西数据库中写入。

当我使用来自欧洲的邮递员测试只读查询的响应时间时,我首先注意到第一次"感冒"称欧洲网络应用程序的速度是巴西网络应用程序的两倍。但是,巴西网络应用程序的下一次呼叫响应时间是最初的"寒冷"呼叫,而欧洲网络应用程序上的响应时间保持不变。我还注意到,在几分钟不活动后,结果又回到了“冷”状态。情况下。

所以:

  1. 为什么巴西的查询响应时间会下降?
  2. 无论答案是什么,为什么它不会在欧洲发生?
  3. 为什么1中发生的响应时间优化不会在几分钟不活动后持续?

请注意,在Azure ARM json文件中,Web应用程序和数据库都是相互复制/粘贴(地理复制除外)。 这两个网络应用都是alwaysOn

谢谢。

更新

实际上,在我看作最终用户时,有几个部分在起作用。 webapps和dbs。我写了这个问题,认为这个问题围绕着dbs和地理复制,然而,在尝试了@ Alberto的脚本(见下文)之后,我无法做到,'查看在查询巴西或欧洲时wait_times的任何差异因此问题可能出在webapps上。我不知道如何进一步分析/测试它。

更新2

这可能(或不)与查询存储相关。我在这个问题上询问了一个更具体的question

更新3

辅助数据库上的查询速度并不慢。我的问题是关于错误的结论。我不会删除它,因为其他人花时间回答它,我感谢他们。

我通过在SQL Server数据库上运行EF查询的Web api的休息调用来比较查询响应时间。由于对位于查询db副本的区域中的web api的休息调用比在针对主db的另一个区域中部署的同一web api的rest调用慢,我得出结论问题是在db端。但是,当我直接在SSMS中运行查询时,绕过web api,我发现主数据库和副本数据库之间的响应时间几乎没有差异。

我仍有问题,但不是那个问题中提出的问题。

1 个答案:

答案 0 :(得分:1)

在Azure SQL数据库上,数据库的内存利用率可能会在几分钟不活动后动态降低,并且在此行为上,Azure SQL与本地SQL Server不同。如果你运行一两次或三次查询,那么再次开始执行得更快。

如果检查查询执行计划及其等待统计信息,则可能会在Azure SQL数据库服务缩小内存分配后执行的那些查询中找到名为MEMORY_ALLOCATION_EXT的等待。具有大量活动和查询执行的数据库可能看不到其内存分配减少。有关我的详细信息,请阅读this StackOverflow主题。

同时考虑两个数据库应该分配相同的服务层。

使用以下脚本确定查询等待,看看两个区域之间的等待有何不同。

DROP TABLE IF EXISTS #before;

 SELECT [wait_type], [waiting_tasks_count], [wait_time_ms], [max_wait_time_ms],
        [signal_wait_time_ms]
 INTO #before
 FROM sys.[dm_db_wait_stats];

 -- Execute test query here

 SELECT *
 FROM [dbo].[YourTestQuery]

  -- Finish test query

DROP TABLE IF EXISTS #after;

 SELECT [wait_type], [waiting_tasks_count], [wait_time_ms], [max_wait_time_ms],
        [signal_wait_time_ms]
 INTO #after
 FROM sys.[dm_db_wait_stats];

 -- Show accumulated wait time

 SELECT [a].[wait_type], ([a].[wait_time_ms] - [b].[wait_time_ms]) AS [wait_time]
 FROM [#after] AS [a]
 INNER JOIN [#before] AS [b] ON
  [a].[wait_type] = [b].[wait_type]
 ORDER BY ([a].[wait_time_ms] - [b].[wait_time_ms]) DESC;