我目前正在开发一个持续查询数据库以获取要显示的实时数据的应用程序。
为了尽量减少对正在写入数据库的系统的影响,这对业务运营至关重要,我直接连接到可用性组中的只读副本(使用只读副本服务器名称而不是读取仅通过 applicationintent=readonly
的方式通过 Always On 监听器进行路由。
即使这样做,我们也注意到将数据插入主服务器的响应时间增加了。
根据我对二级副本的理解,情况不应如此。我也在查询中使用 NOLOCK
提示。我对此感到非常困惑,并且不太明白是什么导致了响应时间的增加。到目前为止,我所想到的是,无论 NOLOCK
提示如何,SQL 都会锁定我正在读取的表并阻止同步复制到只读副本,而只读副本又锁定了主副本instances 表,它支持插入查询。
是这种情况还是我对 Always on Read only 副本不太了解?
最佳答案
我找到了 this我认为最好的文档描述了主服务器上响应时间增加的可能原因。
总的来说,对于那些正在研究使用他们的 AlwaysOn 可用性组在他们的主要和次要副本之间分配负载的人来说,这是一本很好的读物。
对于那些不想阅读整个文档的人,它教会了我以下内容(用我自己粗略的话说): 虽然不太可能,但在辅助副本上运行的工作负载可能会影响发送事务已提交确认(复制到辅助副本)所花费的时间。当使用同步提交模式时,主节点在提交它正在运行的事务(例如插入)之前等待此确认。因此,确认辅助副本的时间增加会导致主副本在插入时花费更长的时间。
不过,文档中的“对主要工作负载的影响”部分对此进行了更好的解释。再一次,如果您想了解更多,我真的建议您阅读它。
关于查询只读副本时对主实例的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34650633/