AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 246591
Accepted
Paul White
Paul White
Asked: 2019-08-30 14:54:29 +0800 CST2019-08-30 14:54:29 +0800 CST 2019-08-30 14:54:29 +0800 CST

强制计划可读辅助

  • 772

如果在可用性组中的主服务器上强制执行计划,它是否应用于在辅助服务器上运行的查询?

我正在寻找涵盖计划强制的两种可能性的答案:

  • 计划指南
  • 查询存储强制计划

我已阅读以下内容,这些内容表明 QS 强制计划不会延续,但在文档中找不到任何权威性内容或有关计划指南的任何内容。

  • Erin Stellato 的查询存储和可用性组
  • Vikas Rana在 AlwaysOn 可读辅助节点上查询数据存储强制计划行为

强制的确凿证据将是辅助节点的执行计划中存在Use PlanorPlanGuideName和PlanGuideDB属性。

sql-server availability-groups
  • 1 1 个回答
  • 823 Views

1 个回答

  • Voted
  1. Best Answer
    Josh Darnell
    2019-08-30T16:29:35+08:002019-08-30T16:29:35+08:00

    查询存储计划强制不会影响辅助节点上的查询

    使用 Query Store 在主节点上强制执行计划看起来肯定会在辅助节点上强制执行计划。

    我尝试在非产品服务器上运行查询,然后使用sp_query_store_flush_db(这是让数据同步到辅助服务器所必需的)刷新查询存储。这是左侧的辅助(注意关于“只读”的带圆圈的警告),右侧的主要:

    查询商店 UI 的屏幕截图

    现在我点击右侧的“Force Plan”,然后刷新两个视图:

    显示两个强制计划的查询存储 UI 的屏幕截图

    因此,“强制”至少在基础查询存储表中得以延续。这是有道理的,因为 OP 中引用的文章指出查询强制应该在故障转移后保持原位:

    问题:当数据库从主副本故障转移到辅助副本时,QDS 是否会保留 FORCED Plan 信息?

    答:是的,QDS 将强制计划信息存储在 sys.query_store_plan 表中,因此在发生故障转移时,您将继续在新的主节点上看到相同的行为。

    但是强迫行为真的发生了吗?我现在将在两台服务器上运行相同的查询。正如预期的那样,首先,计划 XML 中存在“UsePlan”属性:

    <QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="82"
               CompileCPU="78" CompileMemory="2104" UsePlan="true">
    

    在用户界面中:

    显示“使用计划”属性的 SSMS 中执行计划的屏幕截图

    在辅助服务器上(注意不同的服务器名称),该计划不是强制的。这是相同的计划 XML 片段:

    <QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="32" 
               CompileCPU="28" CompileMemory="1656">
    

    SSMS 中执行计划的屏幕截图,显示没有“使用计划”属性

    计划指南不影响辅助查询

    我使用此代码在主节点上创建了一个计划指南(更改了表名以保护无辜者):

    EXEC sp_create_plan_guide 
        @name = 'plan-guide-test',
        @stmt = N'SELECT TOP (1000) * 
    FROM dbo.TableName t 
    WHERE 
        NOT EXISTS 
        (
            SELECT NULL 
            FROM dbo.OtherTable o 
            WHERE t.Id = o.TableName
        );',
        @type = N'SQL',
        @module_or_batch = NULL,
        @hints = N'OPTION (MAXDOP 1)';
    

    当然,计划指南在初级阶段是有效的,正如执行计划所证明的那样:

    <StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT" 
                PlanGuideDB="..._UAT" PlanGuideName="plan-guide-test" ...>
    

    显示计划指南属性的 SSMS 中执行计划的屏幕截图

    我确实在这一点上确认了计划指南已复制到辅助服务器。

    在辅助节点上运行相同的查询,执行计划缺少计划指南强制执行的所有迹象:

    <StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT" 
                QueryHash="0xECF8A24F126EE77A" QueryPlanHash="0x0E93CF7FEAC1B6EA" 
                RetrievedFromCache="true" SecurityPolicyApplied="false">
    

    缺少计划指南属性的 XML 执行计划的屏幕截图

    • 21

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve