首页 > 数据库 >SQL Server视图定义中不能使用option(recompile)提示

SQL Server视图定义中不能使用option(recompile)提示

时间:2024-08-30 09:17:00浏览次数:12  
标签:option recompile SQL 视图 查询 子句

SQL Sever数据库中,我们一般使用OPTION(RECOMPILE)查询提示(Query Hints)来解决SQL语句或存储过程的参数嗅探问题或某些SQL性能问题,它强制优化器重新编译查询语句,生成新的执行计划。最近在帮同事优化一个复杂视图时,发现这个视图的执行计划一直在变化,有时候生成的一个糟糕执行计划,导致SQL语句性能非常差,现在的问题是系统的Support人员不想修改视图(例如,使用存储过程替换视图),那么在视图View中是否可以使用OPTION(RECOMPILE)来改善偶尔使用了错误的执行计划,导致性能很慢的问题呢?

测试发现,视图内部定义不能使用OPTION(RECOMPILE)查询提示,

create view v_test
as
select * from dbo.test option(recompile) ;
GO

创建上面视图时会报下面错误: Msg 156, Level 15, State 1, Procedure v_test, Line 3 关键字 'option' 附近有语法错误。

其实官方文档[1]中有明确的限制说明,如下所示,只是很多知识点随着时间流逝,慢慢变得模糊不清,需要重拾起来。

视图定义中的 SELECT 子句不能包括下列内容:
• ORDER BY 子句,除非在 SELECT 语句的选择列表中也有一个 TOP 子句。
重要
• ORDER BY 子句仅用于确定视图定义中的 TOP 或 OFFSET 子句返回的行。 ORDER BY 不保证在查询视图时得到有序结果,除非在查询本身中也指定了 ORDER BY。
• INTO 关键字
• OPTION 子句

但是我们可以像表一样,在查询语句中使用提示option(recompile)

select * from v_test option(recompile);

另外一种编译视图的方式,就是使用sp_recompile,但是这种方法有一种缺陷,因为查询视图的SQL语句的查询条件中会使用变量,最好在执行阶段重新编译,以便它能获取一个较优或正确的执行计划,而sp_recompile只能手工触发视图重编译,所以不太适合这种场景。

sp_recompile v_test;
参考资料
[1]

1: https://learn.microsoft.com/zh-cn/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver16

标签:option,recompile,SQL,视图,查询,子句
From: https://www.cnblogs.com/kerrycode/p/18387932

相关文章

  • sql函数
    1.presto:1.array_position(applist_install,'com.funtomic.matchmasters')>02.split('joyit_daily_mas_cleaner','_')[3]—>presto从1开始计位(spark从0开始计位)3.日期diff:1.DATE_DIFF('day',DATE_PARSE('20220301&#......
  • mysql 主从复制原理
    主从形式 mysql主从复制灵活一主一从主主复制一主多从---扩展系统读取的性能,因为读是在从库读取的;多主一从---5.7开始支持联级复制---  用途及条件 mysql主从复制用途实时灾备,用于故障切换读写分离,提供查询服务备份,避免影响业务 主从部署必要条件:......
  • 批量杀死MySQL连接的几种方法
    一:通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令。 mysql>selectconcat('KILL',id,';')frominformation_schema.processlistwhereuser='root';+------------------------+|concat('K......
  • MySQL sys性能监控
    1.基础介绍 MySQL5.7引入了sysschema,有了它,我们排查分析一些问题时将更得心应手。sysschema里主要存储的是视图、存储过程、函数等。在mysql的5.7版本中,性能模式是默认开启的,如果想要显式的关闭的话需要修改配置文件,不能直接进行修改。 查看performance_schema的属性my......
  • 科普文:软件架构数据库系列之【MySQL存储引擎InnoDB】
    概叙科普文:软件架构数据库系列之【MySQL前世今生及其体系结构概叙】-CSDN博客前面我们梳理了MySQL体系结构,涉及到innodb的并未进行详细说明,故在此文中进行补充说明。为了更好的理解Innodb,这里还是和前面MySQL体系结构一文中一样,保持一样的结构。重复的章节就不再描述,重点描......
  • sqlsugar 封装 单例模式 多数据库
    #PlayGround\.config\dotnet-tools.json{"version":1,"isRoot":true,"tools":{"csharpier":{"version":"0.29.1","commands":["dotnet-csharpi......
  • MySQL WAL机制详解
    目录:是什么undologRedoLog 与BinlogRedolog三种状态redolog 的持久化Binlog三种格式三种状态binlog 的持久化两者的联系状态Crash-Safe 能力三步提交的参数配置组提交优化" 三步提交"三步提交过程总结三个日志的比较(undo、redo、bin) ......
  • MySQL 支持两种主要类型的备份方法:物理备份和逻辑备份。这两种备份方法各有优缺点,适用
    物理备份物理备份是指直接备份MySQL数据库的物理文件,包括数据文件、日志文件、配置文件等。物理备份通常分为冷备份(脱机备份)和热备份(联机备份)。冷备份(ColdBackup)定义: 在数据库完全停止的情况下进行的备份。特点:  简单快速,因为只需复制文件。可以在任何时间点进行。不需要锁......
  • sqli-labs靶场通关攻略(41-60)
    第四十一关联合查询爆出数据库但这关考察的时堆叠注入,我们给他注入一条数据输入id=50即可查到我们注入的数据 第四十二关看页面似曾相识,上次我们是用注册新用户然后对其他账户进行登录从而造成注入,但这次不能注册新用户了存在堆叠注入函数,所以我们可以在密码哪里......
  • sqlsugar 单例模式 封装
    usingSystem.Linq.Expressions;usingMicrosoft.Extensions.Configuration;usingSqlSugar;namespaceSqlSugarFrameworkCore;publicclassDbSettings{publicconststringAppOne="AppOne";publicconststringAppDevOne="AppDevOne";pub......