千家信息网

sql server 中编译与重编译的区别是什么

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,今天就跟大家聊聊有关sql server 中编译与重编译的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。执行计划重用的利弊执行计划的
千家信息网最后更新 2024年11月19日sql server 中编译与重编译的区别是什么

今天就跟大家聊聊有关sql server 中编译与重编译的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

  执行计划重用的利弊

  执行计划的好坏当然决定了语句最终的执行速度。对于同样的一条语句,使用好的执行计划可能会比差的要快几百倍,甚至上千倍。

  所以从这一个角度来讲,每运行一条语句,都把他先编译一遍当然是最好的。他能够保证使用的执行计划是SQLSERVER能找到的最优的。

  但是SQLSERVER每秒钟可能会运行成百上千的指令。如果每个都编译一遍,是资源的一种浪费。所以SQLSERVER在这里也试图寻找一个平衡点,

  使用有限的compile/recompile,得到最好的整体性能。

  运行下面的指令,就能够看到SQLSERVER当前缓存的执行计划有哪些(请别在生产服务器上直接运行因为上面往往有庞大的缓存)。

  SELECT * FROM sys.[syscacheobjects]

  重编译的发生场景

  但是有些时候,SQLSERVER为了确保返回正确的值,或者有性能上的顾虑,有意不重用缓存在内存里的执行计划,而现场编译一份。

  这种行为,被称为重编译(recompile)。下面是比较常见的会发生重编译的情形:

  1、当指令或者批处理所涉及的任何一个对象(表格或者视图)发生了架构(schema)变化

  例如,在表或者视图上添加或删除了一个字段,添加或者删除了一个索引,在表上添加或者删除了一个约束条件(constraints)等。

  定义发生了变化,原来的执行计划就不一定正确了,当然要重编译

  2、运行过sp_recompile

  当用户在某个存储过程或者触发器上运行过sp_recompile后,下一次运行他们就会发生一次重编译。

  如果用户在某个表或者视图上运行了sp_recompile,那么所有引用到这张表(或者视图)的存储过程在下一次运行前,都要做重编译

  3、有些动作会清除内存里的所有执行计划,迫使大家都要做重编译

  例如,下列动作会清除整个SQLSERVER服务器缓存的所有执行计划:

  (1)Detach一个数据库

  (2)对数据库做了升级,在新的服务器上,会发生执行计划清空

  (3)运行了DBCC freeproccache

  (4)运行了reconfigure语句

  (5)运行了alter database..collate语句修改了某个数据库的字符集(collation)

  下列动作会清除SQLSERVER服务器缓存的某个数据库的执行计划:

  DBCC FLUSHPROCINDB

  清除SQL Server 2000服务器内存中的某个数据库的存储过程缓存内容

  1 DECLARE @a INT

  2 SELECT @a=DB_ID('gposdb')

  3 DBCC flushprocindb(@a)

  ALTER DATABASE ...MODIFY NAME语句

  ALTER DATABASE ...SET ONLINE语句

  ALTER DATABASE...SET OFFLINE语句

  ALTER DATABASE...SET EMERGENCY语句

  DROP DATABASE 语句

  当一个数据库自动关闭时

  DBCC CHECKDB语句结束时

  4、当下面这些SET 开关值变化后,先前的那些执行计划都不能重用

  ansi_null_dflt_off,

  ansi_null_dflt_on,

  ansi_nulls,

  _ansi_padding

  ansi_warnings,

  arithabort,

  concat_null_yields_null,

  datefirst,dateformat,

  forceplan,

  language,

  no_browsetable,

  numeric_roundabort,

  quoted_identifier

  这是因为这些SET开关会影响语句的执行的行为,甚至带来不同的结果。他们发生变化了,SQLSERVER就要根据新的设置重做执行计划

  5、当表格或者视图上的统计信息发生变化后

  当统计信息被手动更新后,或者SQLSERVER发现某个统计信息需要自动更新时,SQLSERVER会对所涉及的语句都做重编译

  需要说明的是,在SQLSERVER里,执行计划重用并不一定是一件好事,而编译/重编译也不一定是一件坏事。

  计划重用可以帮助SQLSERVER节省编译时间,对降低CPU使用率和减少阻塞都有好处,但是缺点是每次重用的计划并不一定是最合适的计划。参数嗅探parameter sniffing就是典型的计划重用带来的负效应。编译和重编译当然能给当前运行的语句带来尽可能准确执行计划,但是对于经常运行的语句,尤其是一些执行速度比较快的语句,可能其编译时间占最后总时间的相当大比例。这对资源来讲是一个很大的浪费

看完上述内容,你们对sql server 中编译与重编译的区别是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

编译 语句 运行 数据 数据库 缓存 服务器 视图 变化 服务 内容 信息 内存 动作 指令 时间 过程 存储 统计 上千 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 解放数据库性能 手机网络安全教育教案 高校数据库实验室 交通运输局网络安全领导小组 如何让自己的电脑当服务器 本机服务器名 浪潮服务器磁盘无法识别 盛大网络技术模式是什么 郑州数据库管理员薪资 湖南有软件开发公司吗 黑色沙漠手游台服服务器选择 今年网络安全教育主题是 服务器接交换机起什么作用 中学网络安全宣传典型案例 光纤及高速网络技术属于第几代 福建施工项目管控软件开发平台 诸暨网络技术学院 数据库是按照什么组成的仓库 汕职院计算机网络技术就业方向 按了f1按键出现服务器怎么关闭 软件开发先验收再交付 qq网络安全应用 曙光视频分析服务器 h3c网络安全题库 杭州网吧网络技术员工资 广东gps时钟监控网关服务器 怀旧服可以加入同一服务器吗 服务器端口干什么用 魔兽世界新服务器塞雷布拉斯状况 按了f1按键出现服务器怎么关闭
0