我在Azure上使用地理复制设置了两个SQL数据库。主要在巴西,在西欧是次要。 同样,我有两个运行相同web api的Web应用程序。一个巴西网络应用程序,可以读取和写入巴西数据库和欧洲网络应用程序,该应用程序读取欧洲数据库并在巴西数据库中写入。
当我使用来自欧洲的邮递员测试只读查询的响应时间时,我首先注意到第一次"感冒"称欧洲网络应用程序的速度是巴西网络应用程序的两倍。但是,巴西网络应用程序的下一次呼叫响应时间是最初的"寒冷"呼叫,而欧洲网络应用程序上的响应时间保持不变。我还注意到,在几分钟不活动后,结果又回到了“冷”状态。情况下。
所以:
请注意,在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,我发现主数据库和副本数据库之间的响应时间几乎没有差异。
我仍有问题,但不是那个问题中提出的问题。
答案 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;