当前位置: 首页 > article >正文

使用Sybase sp_recompile重新编译存储过程和触发器

Sybase 15.X中提供了内置的存储过程sp_recompile。该存储过程可令表中的存储过程和触发器在下次使用时重新编译。(Causes each stored procedure and trigger that uses the named table to be recompiled the next time it runs.)

存储过程和触发器使用的查询,仅在编译时优化一次。当systabstats统计信息,如行数或聚簇率(cluster ratio)发生显著改变时,已编译的存储过程和触发器效率可能会变低,并可能会受益于sp_recompile的重新编译。通过对表的存储过程和触发器进行重新编译,可优化查询以获得最佳效率。

在Sybase ASE 15.X中,create indexupdate statistics会自动重新编译存储过程和触发器。在这些情况下使用sp_recompile会导致冗余的重新编译。

该存储过程的唯一输入变量,是数据表的对象名称。

Sybase官方手册给出的语法示例为:

Recompiles each trigger and stored procedure that uses the table titles the next time the trigger or stored procedure is run:

sp_recompile titles

但实际使用中(ASE 15.7),却总是得到如下错误提示:

Msg 17460

Object must be in the current database.

如果在表名前加上用户名,如user_name.title,则会得到如下错误提示:

Msg 102

Incorrect syntax near '.'.

全网查询了一下,用这个存储过程的人很少啊……

百思不得其解,于是使用sybsystemprocs..sp_helptext sp_recompile查看该存储过程的源代码。

create procedure sp_recompile
@objname	varchar(767)
as

declare @type	smallint
declare @uid	int
declare @msg    varchar(1024)
declare @dbname varchar(255)


if @objname like '%%.%%.%%' and
	substring(@objname, 1, charindex(".", @objname) - 1) != db_name()
begin
	/*
	** 17390, "Table or view name must be in 'current' database."
	*/
	raiserror 17390
	return (1)
end

if not exists (select *	from sysobjects	where id = object_id(@objname))
begin
	/*
	** 17460, "Object must be in the current database."
	*/
	raiserror 17460
	return (1)
end

唯一的输入变量@objname是varchar()类型。如果是使用dbname.username.tabname方法写的,还会检查输入的dbname与当前数据库(db_name())是否一致。然后直接将@objname送入sysobjects表中查询对应的id。

这就很容易理解了:需要为输入加上单引号,如:

sp_recompile 'username.tablename'

sp_recompile 'dbname.username.tablename'


http://www.kler.cn/a/15386.html

相关文章:

  • 浅谈数据仓库的架构及其演变
  • 【论文阅读】主动推理:作为感知行为的理论
  • Excel单元格中自适应填充多图
  • 【Fargo】23:采集时间转rtp时间
  • Essential Cell Biology--Fifth Edition--Chapter one (8)
  • 【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入
  • 如何使用osquery在Windows上实时监控文件?
  • Java新提案,最终还是靠近C#了
  • 高度可定制可用于商用目的全流程供应链系统(全部源码)
  • Python 二进制 八进制 十进制 十六进制之间的转换
  • JSP数据库连接池的研究与实现(源代码+论文)
  • 嵌入式安卓开发:使用Camera2获取相机
  • 网络安全真的没法入行吗?
  • RedHat8配置本地YUM源
  • 知识图谱实战应用7-最完整的常用Cypher查询语句与实际应用
  • Unlimited “使用GPT-4 ”!它来了!
  • html学习(布局方式(layout)、浮动(float)、定位(position)、弹性盒(flex))
  • C++设计模式11:享元模式
  • Sharding-JDBC之垂直分库水平分表
  • 结构型模式-享元模式
  • 浅谈:JVM垃圾回收
  • pt11mysql多表查询优化
  • JAVA Future类详解及Thread线程是如何运行Future类的
  • 聚观早报|特斯拉资本支出预期至70亿-90亿美元;迪士尼再裁4000人
  • 【AUTOSAR】【信息安全】CSM
  • MacBook杀毒软件CleanMyMac X4.13